jjshoots / PyFlyt

UAV Flight Simulator for Reinforcement Learning Research
https://taijunjet.com/PyFlyt/documentation.html
MIT License
105 stars 19 forks source link

Clarification of Coordinate Systems in Documentation #63

Open defrag-bambino opened 1 month ago

defrag-bambino commented 1 month ago

Hi,

I am trying to deploy a learned controller from PyFlyt onto a real quadcopter running Ardupilot. As far as I can tell these two use different coordinate system conventions. Namely: PyFlyt uses ENU (which means on the body of the drone its forward is X, to the left is Y and up is Z; Ardupilot uses NED (i.e. forward X, right Y and Z down). Is this correct thus far? Also, I am unsure about the direction of rotation for yaw pitch roll in PyFlyt. Looking at the illustration provided in the paper, which way is a positive roll for example? image Ideally, the image containing this information should provided in the documentation.

Thanks!

jet-sony commented 1 month ago

Hi, admitttedly, even I had an issue with different axis convention when trying to deploy agents onto real quadcopters (PX4, Crazyflie, and Ardupilot all use different conventions).

PyFlyt used ENU / FLU:

Ardupilot uses NED / FRD:

Rotation conventions always follow right hand thumb rule, this is the standard regardless of NED/ENU: image

Therefore, for PyFlyt (Front X) and Ardupilot (Front X), roll positive would be facing-forwards-clockwise. However, in PyFlyt (Left Y), pitching positive would be pitching downwards; in Ardupilot (Right Y), pitching positive would be pitching upwards.

Hope this clarifies things!

defrag-bambino commented 1 month ago

Thanks! What is the range for the rotations? Are they in [0, pi] or [-pi/2, pi/2] or [0,1] ...?

jjshoots commented 1 month ago

[-pi, pi].

defrag-bambino commented 1 month ago

And for angular velocities? Rad/s?

jet-sony commented 1 month ago

Yep!

defrag-bambino commented 1 month ago

I think I've found my issue. It is related to the network outputs, rather than inputs. The flight mode documentation says "0: vp, vq, vr, T" (angular velocities). Therefore I expected the four outputs of the network to be in the order "pitch, yaw, roll, throttle". However, it seems that it is actually "yaw, pitch, roll, throttle"?

jet-sony commented 1 month ago

Are you intending to output to a crazyflie IRL? If the policy was trained in one of the gym envs within PyFlyt, the outputs should be "roll, pitch, yaw, theust" (v-pqr, T). The rotational outputs always follow the axes of the linear frames. If your intended goal is to output to a crazyflie, then it is likely in the form of "pitch, roll, yaw, thrust". I would try isolating outputs (by setting everything else to 0), and then activating only one output.

zcase commented 3 weeks ago

@jet-sony just to clarify what you said above, are you saying that if we trained a model within the environment the model should output int the order of "roll, pitch, yaw, thrust" and so if i take this model and try to control an actual crazyflie drone i should change the order from "roll, pitch, yaw, thrust" to "pitch, roll, yaw, thrust"?

jjshoots commented 3 weeks ago

@zcase it's been awhile since I've messed with crazyflies. What I will say is that the output space in PyFlyt is permuted in Crazyflies. I would refer to the official documentation for the most up to date material. CrazyFlyt is simply a simple wrapper around both these libraries.