Kranarm / Steifes Gelenk

Posted By: HeelX

Kranarm / Steifes Gelenk - 09/22/11 20:27

Hallo, ich arbeite an einer Vehikelsimulation. Es geht hierbei um einen Kramarm, der auf einem Fahrzeug montiert ist. Auf der Plattform, auf der Kran montiert ist, ist eine vertikale Basis montiert, die sich um die Z-Achse um 360° drehen kann. An dieser Basis ist ein erstes Kranarm-Element verbaut, dass nur um dessen relative Y-Achse gedreht werden kann in einem Winkel von etwa -22.5° ... +80°.

Ich hab die Basis mit dem Fahrzeug mit einem hinge, und den Arm mit der Basis mit einem Hinge gekoppelt. Ich möchte gerne, dass ich auf Tastendruck jeweils eine Kraft ausübe, um die Basis zu drehen oder den Kram hoch oder runter zu bewegen - natürlich samt Kollision mit dem Fahrzeug und anderen Physikentities. Wenn ich keine Kraft ausübe, sollen beide entities "festgehalten" werden, die Basis darf sich nicht durch das Gewicht der angekoppelten Sachen weiterdrehen. Der Arm darf sich nicht durch sein eigenes und auch nicht durch ein fremdes Gewichte, herunterneigen.

Ohne den Arm hat das ganz gut geklappt, einfach die Damping-Werte der Basis auf 100, 100 zu stellen. Mit Armelement geht das nicht, das Gewicht lässt die Basis drehen, auch je nachdem wie das Fahrzeug steht (z.B. am Hang).

Ich hatte die Idee, die hinge parameter ganz klein zu wählen, also sowas wie -5°, 5° und dann, wenn man Kraft ausüben will, die zu lösen (also auf -360°,360° und -22.5°,45° zu stellen), den Benutzer machen lassen, und sobald die Taste gelöst wird, die Grenzen erneut zu setzen, allerdings verschoben um das offset, was mir pXcon_getposition gibt - also wenn man um ~+10° = +0.175 rad verschoben hat, dann wäre das Gelenk der Basis dann auf 0.088 rad, 0.262 rad eingeschränkt (das kann ich allerdings nicht ausprobieren, weil es damit Probleme gibt).

Generell wollte ich fragen, ob dieses Vorgehen sinnvoll ist.

Und wenn nicht, was Sie empfehlen würden. Ich hab den Verdacht, dass ich da besser einen 6D-Joint nehmen sollte. Allerdings kann ich mir die Verwendung aus dem Manual heraus nicht erschließen... ich hab mir auch Mühe gegeben wink (Anregung: die vorhandenen Joints als 6D-Joint umsetzen und in der Manual abdrucken, das hilft dem Verständniss sehr, würde ich sagen.)
Posted By: jcl

Re: Kranarm / Steifes Gelenk - 09/23/11 08:02

Ich möchte diese Frage an die User weitergeben, denn meine Erfahrungen mit PhysX beschränken sich auf das Raycast-Car und ein paar Testscripts.

Mit Damping kann man kein Gelenk blockieren, aber das Festsetzen der Hinge-Limits müsste funktionieren. Unter bestimmten Umständen kann sich ein Gelenk aber auch über die Limits hinausdrehen.

Eine andere Möglichkeit zum Blockieren wäre, den Kranarm einfach temporär mittels eines unsichtbaren Gelenks mit der Welt zu verbinden. Dann kann sich nichts mehr bewegen.

Das Simulieren der anderen Gelenke durch 6D ist eine gute Idee - wenn ich Zeit habe, mache ich das.
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/23/11 15:50

Originally Posted By: jcl
Eine andere Möglichkeit zum Blockieren wäre, den Kranarm einfach temporär mittels eines unsichtbaren Gelenks mit der Welt zu verbinden. Dann kann sich nichts mehr bewegen


Das wird leider nicht möglich sein, da der Benutzer das Fahrzeug weiterhin steuern kann und dann muss der Kran in der aktuellen Pose "mitgefahren" werden.

Naja, vielleicht hat ja jemand noch eine Idee, ansonsten warte ich auf die Behebung des Fehlers, den ich ja oben bereits verlinkt habe.
Posted By: rojart

Re: Kranarm / Steifes Gelenk - 09/28/11 00:09

schon mal kinetisch versucht?
Posted By: jcl

Re: Kranarm / Steifes Gelenk - 09/28/11 08:54

Man könnte zum Blockieren auch das Ende des Kranarms mit dem Kran selbst verbinden. Dann dürfte sich nichts mehr bewegen.
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/28/11 16:41

Wenn ich NX_BF_KINEMATIC der Basis zuweise, dann kann ich das Gefährt nicht mehr fahren (die Basis ist an einen Anhänger montiert, der wiederum über einen Hinge an der Zugmaschine festgemacht ist).

Dann hab ich geschaut, ob ich - nachdem JCL wohl den bug für die A8.30.3 gefixedt hat - mit pXcon_setparams2 die Limits neu setzen kann. Fehlanzeige: egal was ich mache (relative Winkel, also -5 und +5 oder absolut - aktueller Winkel -5/+5 und nochmal ang() drumherum), es zeigt keinen Effekt.

Quote:
Man könnte zum Blockieren auch das Ende des Kranarms mit dem Kran selbst verbinden. Dann dürfte sich nichts mehr bewegen.


Ich weiß nicht ganz wie ich das machen soll, da ich im Moment folgendes Setup habe:

Maschine - Anhänger - Basis - Erster Arm

Und Folgendes haben will:

Maschine - Anhänger - Basis - Erster Arm - Zweiter Arm - Teleskop Arm - Schwungelement - Greiferbasis - Klammer 1 & 2

Wobei ich mit jeder Entity ja den Joint zur vorherigen anspreche. Das Problem ist, das die Kette ja noch weiter geht und ich ab der Basis jedes Gelenk gezielt motorisieren will über die Tastatur. Die Basis drehen, den ersten Kranarm neigen, den zweiten Kranarm neigen, den dritten teleskopisch ausfahren. Daran hängt ein freischwingender Hinge, an dem ein Greifer hängt, dem man drehen soll und daran sind zwei Klammern, die bewegt werden sollen - also alles auf Tastendruck. Das heißt, die beiden Gelenke, die "echt" frei sein sollen sind die zwischen Maschine und Hänger und zwischen Spitze/Teleskoparm und Greifer.

Ich weiß auch ehrlich gesagt nicht wie ich dann auf mehrere Constraints zugreife, die zwischen zwei Entities installiert werden, wenn jede der beiden Entities wiederum mit anderen Entities verbunden sind...

@JCL: Können Sie vielleicht nochmal gucken, ob Sie auch tatsächlich die neuen Winkellimits setzen?

In der Zwischenzeit versuche ich mal kurzfristig via pXent_enable die Entity auszuschalten, und dann neu einzuschalten und das constraint neu aufzubauen, da dann aber die Winkellimits einzustellen.
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/28/11 17:00

Also wenn ich eine Physikentity aktiv habe mit Limits von -5...5 Grad, und dann setparams2 aufrufe mit -360, 360, dann werden die Grenzen definitiv nicht aufgehoben. Soviel schon mal dazu smile
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/28/11 17:29

Also ich habe mäßigen Erfolg, wenn ich im selben frame das constraint, das ich ansteuern will via pXcon_remove lösche, setparams2 mit -360,360 aufrufe, dann solange die force anwende, während ich die Taste drücke, und wenn ich fertig bin mit Drücken, dann erneut das constraint lösche und ein ganz enges anlege.

Mäßig bedeutet hier, auch wenn ich pXent_setbodyflag(my, NX_BF_FROZEN_ROT, 1); anwende, dass mir die Basis unter dem Gewicht des Arms bei wiederholter Anwendung leicht nach vorne neigt jedes Mal, wenn ich das constraint löse und wieder anlege.

Ein wenig besser ist es, wenn ich pX_enable mit 0 auf dem gesamten Kran ausführe und dann die constraints neu anlege und das eine, was ich ansteuern will, halt öffne und dann später auf dieselbe Weise dann alle wieder anlege - dann neight sich mir die Basis weniger weg.

Viel besser wäre, es wenn setparams2 für hinges zur Laufzeit die Limits neu setzen könnte, irgendwie hab ich das Gefühl, dass das wesentlich sauberer ist wäre als das, was ich mir da jetzt zusammengehackt habe.
Posted By: ventilator

Re: Kranarm / Steifes Gelenk - 09/28/11 23:11

ich hab nicht den kompletten thread gelesen, aber vielleicht hilft dir das weiter:
http://en.wikipedia.org/wiki/PID_controller
hat mir immer sehr geholfen bei der arbeit mit physikengines...
Posted By: jcl

Re: Kranarm / Steifes Gelenk - 09/29/11 17:20

Was die setparams2 betrifft, kann ich das Problem bestätigen. Wenn einmal ein Limit gesetzt ist, lässt es sich nicht mehr verändern - anscheinend eine Eigenschaft von Hinge-Joints in PhysX. Wir werden einen Workaround implementieren, z.B. beim Limit setzen das Gelenk entfernen und neu erzeugen, allerdings nicht mehr für Version 8.30.
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/29/11 17:26

@Ventilator: Also du schlägst vor, dass ich messe, bei welchem Grad das Gelenk ist und ich ne Vorgabe hab, wo die ist und dass dann dieses PID-Ding ständig automatisch Force ansetzt, um das Ziel zu erreichen? Sowas hab ich auch schon überlegt, aber das find ich gerade etwas zu kompliziert - aber vielleicht hast du ja ein einfaches Beispiel? Da steckt anscheinend viel Theorie hinter und ich will im Moment einfach nur mein Constraint locken, wenn ich keine Eingabe mache.
Posted By: ventilator

Re: Kranarm / Steifes Gelenk - 09/29/11 18:10

ja, genau!

die wikipedia seite mit den formeln ist abschreckend kompliziert. als code ausgedrückt ist ein PID controller viel einfacher (zu verstehen).

meine eigenen beispiele finde ich gerade nicht, ich hab aber gegoogelt und diese seite schaut vielversprechend aus (hab sie aber nur schnell überflogen):

http://forums.tigsource.com/index.php?topic=10130.0

einen proportional controller hat fast jeder der spiele programmiert schon mal verwendet, aber der vorteil von PID controllern ist, dass die oszillation und das overshooting unter kontrolle gehalten werden. es wird sehr genau das ziel angesteuert und die limits oder die sperre kannst du dann selbst kontrollieren.
Posted By: HeelX

Re: Kranarm / Steifes Gelenk - 09/29/11 18:24

Das mit dem runterwippen hab ich erstmal temporär damit gelöst, dass ich die Gravitation ausschalte für base und ersten Kranarm. Ansonsten sieht mein Code für die Basis nun erstmal so aus:

Code:
action fwdBase ()
{
    static const var angForce = 600;
    
    while (1)
    {
        // rotate base with A and D
        var f = key_a - key_d;
        if (f != 0)
        {
            // open constraint, if closed
            if (!isFwdBaseOpen(my))
                openFwdBase(my);
            
            // rotate base
            var vt = f * angForce * time_step;
            pXent_setangvelocity(my, vector(0, 0, vt));
        }
        else // close constraint, when no force is applied
            if (isFwdBaseOpen(my))
                closeFwdBase(my);
    
        wait(1);
    }
}
    
    void fwdBaseMakeContraint (ENTITY* eBase, var limit)
    {
        // use cage upward vector is hinge direction
        
        VECTOR vAxis;
        vec_set(&vAxis, vector(0,0,-1));
        vec_rotate(&vAxis, eBase->parent->pan);

        // create stiff hinge constraint for the base
        pXcon_add(PH_HINGE, eBase, eBase->parent, 0); 
        pXcon_setparams1(eBase, eBase->x, &vAxis, NULL);
        pXcon_setparams2(eBase, vector(-limit, limit, 100), NULL, NULL);
    }

    // returns if base constraint is open
    BOOL isFwdBaseOpen (ENTITY* base)
    {
        static VECTOR vCon;
        pXcon_getposition(base, &vCon);
        
        BOOL isOpen = false;
        
        if ((vCon.x == -180) && (vCon.y == 180))
            isOpen = true;
            
        return(isOpen);
    }
    
    // opens base constraint
    void openFwdBase (ENTITY* base)
    {
        pXcon_remove(base);
        fwdBaseMakeContraint(base, 180);
    }
    
    // closes base constraint
    void closeFwdBase (ENTITY* base)
    {
        pXcon_remove(base);
        fwdBaseMakeContraint(base, 5);
    }



Ich verwende diesen workaround dann mal weiter, wäre aber schön zu hören, wenn es seitens Ihnen dann noch einen integrierte Lösung gäbe.

Melde mich dann hier wieder, wenns Probleme gibt. Insgesamt könnte das ja auch für andere user interessant sein.
Posted By: NeoJones

Re: Kranarm / Steifes Gelenk - 04/30/17 12:17

Hi,
dieser Thread ist ja schon etwas älter, aber vielleicht gibt es ja mittlerweise schon eine bessere Lösung für dieses Problem.
Ich habe das gleiche Problem mit einer Gondel. Diese hängt an einem Gondelarm und soll sich um 360 Grad drehen können bei 12 Grad Neigung.
Da ich die Neigung benötige, habe ich einen Gondelhalter und 2 Hinge Constraints verwendet (Bild).



Wenn ich jedoch für Hinge 1 die Limits setze, versucht es sich auf 12 Grad hinzubiegen und kippt wieder zurück nach unten. Gravitation habe ich auf 0 gesetzt. Ich habe es auch schon mit dem 6dJoint oder dem Wheel Constraint versucht und bekomme es einfach nicht hin, das es steif bleibt. Kann jemand helfen oder hat eine Idee wie man es lösen könnte?
© 2024 lite-C Forums