Ich arbeite an einer Anwendung, einem Simulator, wo ein Quadrotor vom Wegpunkt zum Wegpunkt fliegt. In meinem Code habe ich eine Funktion implementiert, um die mit atan2 Funktion zu berechnen. Aber wenn sich der Quadrotor um 360 ° dreht, bewegt er sich nicht auf dem kürzesten Weg, sondern bewegt sich um den 360 ° -Bereich herum, um die neue Richtung zu erreichen.Ein seltsames "Gier" Verhalten in der Simulation mit atan2() Funktion
Hier habe ich eine video gepostet. Werfen Sie einen Blick auf sein Verhalten, wenn es über 360 °.
Ok Jungs hier die komplette Funktion jetzt:
geometry_msgs::Pose getYaw(double x1, double x2, double y1, double y2) {
geometry_msgs::Pose output_trajectory;
/* Extrapolate the yaw information between two contigous points */
double yaw = atan2((y2 - y1), (x2 - x1));
if(yaw < 0.0f) // * read later on
yaw += 2.0f * M_PI;
output_trajectory.orientation = tf::createQuaternionMsgFromYaw(yaw);
return output_trajectory;
}
wo tf :: createQuaternionMsgFromYaw eine Bibliothek aus dem ROS-Framework ist. Hier die Definition: link. geometry_msgs :: Pose ist einfach ein Container: link.
*: hier einen Auszug aus dem Gierwert: hier habe ich verwandte Themen und Fragen hier in Stackoverflow und diese Funktion ordnet die zurückgegebenen Ausgabe von atan2 in 0 ° -360 °
UPDATE lesen
...
Yaw: 131.3678
Yaw: 133.3495
Yaw: 135.6426
Yaw: 138.3442
Yaw: 141.5859
Yaw: 145.5487
Yaw: 150.4813
Yaw: 156.7167
Yaw: 164.6657
Yaw: 174.7288
Goal reached
Moving to the 3 waypoint
Yaw: 174.7288
Yaw: 186.4225
Yaw: 196.3789
Yaw: 204.1349
Yaw: 210.1296
Yaw: 214.7946
Yaw: 218.4716
Yaw: 221.4110
Yaw: 223.7921
Yaw: 225.7431
Yaw: 227.3565
...
Wie Sie sehen können, ist der Kreuzungspunkt "continuos", aber er dreht sich von 174 ° zu 186 ° nicht in der rechten (kleinsten) Richtung.
Was ich erwarte, ist, dass der Quadrotor sich durch kleine Anpassungen bewegt und rund um 360 ° gedreht ein paar Grad dreht.
Wie kann ich dieses Problem loswerden? Ich brauche eine sanfte Gierbewegung in meiner Anwendung. Grüße
Es ist nicht klar, was Sie hier sind zu fragen. Irgendwo muss es einen Kreuzungspunkt geben. Welches Verhalten erwarten Sie? –
Also das Problem ist, dass du von 360 zurück auf 0 interpolierst, also macht der Copter 360, oder habe ich das falsch verstanden? An diesem Punkt ist das ein Interpolationsproblem mehr als ein Atan-Problem. (P.S: Schönes Projekt) – Borgleader
Dieses Bit 'Giere + 2.0f * M_PI;' des Codes macht keinen Sinn. Der Wert wird nicht gespeichert oder verwendet. – wilx