ROS中ENU坐标系与无人机中NED坐标系的转换关系理解

285 篇文章 59 订阅
187 篇文章 44 订阅

这个ENU坐标系和NED坐标系看到很多次了,之前一直不知道是什么

 

我感觉,   E应该是东east,N是北north,U是上up,D是下down

https://www.ncnynl.com/archives/201709/2078.html

 

阿木社区里的文章

https://bbs.amovlab.com/forum.php?mod=viewthread&tid=975&extra=page%3D2

摘自:https://blog.csdn.net/qq_33641919/article/details/101003978

ROS中ENU坐标系与无人机中NED坐标系的转换关系理解

项目地址

  • 无人机中NED坐标理解
  • ENU与NED转换

无人机中NED坐标理解

  • 机体坐标系:机体坐标系固连飞机,其原点 取在多旋翼的重心位置上。 x轴在多旋翼对称平面内指向机头(机头方向与多旋+字形或X字形相关)。 z轴在飞机对称平面内,垂直轴向下。然后,按右手定则确定y轴 。
  • 地球固联坐标系:通常以多旋翼起飞位置作为坐标原点 。先让x轴在水平面内指向某一方向,z轴垂直于地面向下。然后,按右手定则确定y轴,坐标原点还有用地心的?比如NED坐标系为x轴为正北方向,y轴为正东方向,z轴指向下。

飞机的欧拉角就是基于上面两个坐标系的转换。pitch+为抬头,roll+为右旋转,yaw+为右偏航。

Yaw与指南针角度的关系

  • 指南针的角度是确定不变的,北朝向为0度,东为90度,南为180度,西为270度。
  • Yaw角是当前机头方向与正北方向的夹角(若地球固联坐标系为NED)

也就是说当我们知道YAW角时我们就可以确定飞机当前的航向(东,北哪个方向),比如我们的vision通过mavros给飞控的Yaw的角度是90度,而且飞机的地球固联坐标系为NED,那么可以确定飞机机头当前指向为正东,即使我们没有磁力计测方向,但我们假设了一个方向,此时Yaw角与指南针的角度完全重合或者说相同。

但当我们的Yaw角为90度,机头朝向为正北方向,那么我们可以确定飞机地球固联坐标系采用的是WND(W为西)。

在PX4中用到的地球固联坐标轴是NED坐标系,即x,y,z的方向固定不变(Offboard模式下除外,但是在offboard模式下,初始上电后其东北方向由Yaw角决定)

ENU与NED转换

如下图

image

在ROS中用到的坐标系是ENU坐标系,而我们飞控中用到的坐标系是NED所有需要转换,好在mavros已将帮我们转换好了。

下面是转化公式供参考

 

 

=================================================================

ZN无人机课程里有专门一个脚本做坐标系的转换

https://blog.csdn.net/sinat_16643223/article/details/107829121

 

GAAS的 px4_mavros_run.py 里似乎也有这方面内容

https://github.com/generalized-intelligence/GAAS/blob/master/software/px4_mavros_scripts/1_px4_mavros_offboard_controller/px4_mavros_run.py

 

 

 

阿木的px4_command也是要弄坐标系变换,看来这都是必不可少的一步。

 

这里写得更具体,当然对不对我没有考究。

http://www.voidcn.com/article/p-ssnoekww-bqc.html

 

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS坐标系坐标系之间的变换是通过tf(transform)包来实现的。tf包提供了一种方便的方式来管理坐标系之间的关系,并且能够自动地计算出不同坐标系之间的变换。下面是一个简单的例子,演示如何通过tf来实现坐标系之间的变换。 假设我们有两个坐标系,分别为`/world`和`/robot_base`,我们想要将`/robot_base`坐标系的一个点`(x, y, z)`变换到`/world`坐标系。我们可以按照以下步骤进行: 1. 创建一个`tf::Transform`对象,表示`/robot_base`坐标系相对于`/world`坐标系的变换。 ```cpp tf::Transform transform; transform.setOrigin(tf::Vector3(x, y, z)); // 设置变换的平移部分 transform.setRotation(tf::Quaternion(0, 0, 0, 1)); // 设置变换的旋部分 ``` 2. 发布`/robot_base`坐标系相对于`/world`坐标系的变换。 ```cpp static tf::TransformBroadcaster br; br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "/world", "/robot_base")); ``` 3. 在需要使用变换后的点的节点,通过tf监听器(tf listener)获取变换后的点。 ```cpp tf::TransformListener listener; tf::StampedTransform transform; listener.waitForTransform("/world", "/robot_base", ros::Time(0), ros::Duration(1.0)); // 等待获取变换信息 listener.lookupTransform("/world", "/robot_base", ros::Time(0), transform); // 获取变换信息 tf::Vector3 point(x, y, z); tf::Vector3 transformed_point = transform * point; // 计算变换后的点 ``` 通过以上步骤,我们就可以将`/robot_base`坐标系的点`(x, y, z)`变换到`/world`坐标系了。需要注意的是,tf的变换是从目标坐标系到源坐标系的变换,因此在发布变换信息时,需要指定目标坐标系和源坐标系的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值