mavros坐标系转换与方向
本文写于2021年1月21日,以后mavros的坐标系方向可能还会变动。mavros的坐标系真的比较乱,而且和px4所常用的坐标系不同。px4使用的坐标系为NED(北东地)坐标系或者FRD(前右下)坐标系。然而mavros中常使用的是ENU(东北天)坐标系或者body系(下面细讲),mavros会自动将输入的ENU坐标值或者body系坐标值转换到NED坐标系中,再通过mavlink发送给飞控。ma
2021.05.04更新:
本文中提到的kinetic版本的mavros中body系的坐标系问题已经被修复为FLU坐标系,只需要更新kinetic版本的mavros即可!
sudo apt install ros-kinetic-mavros
sudo apt install ros-kinetic-mavros-msgs
----------原文分界线----------------------------------------------------------------------
本文写于2021年1月21日,以后mavros的坐标系方向可能还会变动。
mavros的坐标系真的比较乱,而且和px4所常用的坐标系不同。px4使用的坐标系为NED(北东地)坐标系或者FRD(前右下)坐标系。然而mavros中常使用的是ENU(东北天)坐标系或者body系(下面细讲),mavros会自动将输入的ENU坐标值或者body系坐标值转换到NED坐标系中,再通过mavlink发送给飞控。具体说明可以参考mavros的github仓库中的说明
mavros的话题中常见的坐标系有global系、local系、body系
global系好理解,是gps坐标系,经纬度什么的,用的不多。
local系指当地坐标系,一般是ENU坐标系,坐标原点一般在起飞点。如果有offset的话坐标原点在飞机上,这时其实是导航坐标系。
body系就比较有意思了。如果你用apt安装的ros-kinetic-mavros(二进制安装),即kinetic版本的mavros,则body系是RFU(右前上)坐标系,坐标原点在机体上。这个RFU坐标系表面上和ENU系有点像,但其实在工程领域和各大教材中都没有采用。因此在melodic版本中,body系已经改成了FLU(前左上)坐标系。在最新的mavros源码里,body系也已经更换成了FLU坐标系,因此是如果用源码编译的mavros,body系都是FLU系。
这个mavros的更改发生在:https://github.com/mavlink/mavros/pull/1446/files
其中,baselink系就是mavros所使用的body系(FLU),aircraft系是px4所使用的body系(FRD),用到的transform细节可以在/mavros/mavros/src/lib/ftf_frame_conversions.cpp和/mavros/include/mavros/frame_tf.h中找到。
因此,使用kinetic和melodic版本的mavros一定要注意这个body系的差别。
具体到mavros中的话题,比如我们常用的mavros/setpoint_raw/local话题,话题类型是mavros_msgs/PositionTarget,这个话题类型官方解释如下:
其中coordinate_frame的说明不仅错误,而且极容易误导人。
px4中相关的issue:https://github.com/mavlink/mavros/issues/1500
coordinate_frame=1虽然代表向px4发送NED坐标值,但是你发送到这个话题的坐标系应该用ENU,mavros会自动完成这个坐标系的转换。同样的,coordinate=8 也不是NED系,而是FLU系。目前px4暂不支持向话题里发布coordinate=7、9的坐标值。
如果是用apt安装的旧版kinetic版本的mavros,恐怕body系还是奇怪的RFU系。切记切记。
更多推荐
所有评论(0)