跳转到内容

坐标系与单位

需要:uBotCore 0.1.x

了解 UE 和 ROS 的坐标系有什么不同,uBot 的数据用什么单位,以及两边之间怎样换算。

UE 与 ROS 的坐标轴俯视图。UE 是左手系:X 向前,Y 向右,Z 向上。ROS 是右手系:X 向前,Y 向左,Z 向上。两者只在 Y 轴方向上相反。X 前Y 右Z 上X 前Y 左Z 上UE:左手系,单位厘米ROS:右手系,单位米
俯视图,圆点表示 Z 轴朝上、指向读者。
UE ROS(REP-103)
手性 左手系(left-handed) 右手系(right-handed)
X / Y / Z 前 / 右 / 上 前 / 左 / 上
长度单位 厘米 米
角度单位 度(Rotator) 弧度
偏航(Yaw)的正方向 向右 向左

UE 的世界和 Transform 用厘米,旋转(Rotator)在蓝图里用度。偏航是绕 Z 轴的旋转,正方向是向右转。

uBot 的公共接口默认用国际单位制(SI):米、秒、弧度。名字里带 Centimeters 或 Degrees 的属性除外。

量 单位
位置、距离 m
速度 m/s
线加速度 m/s²
角度 rad
角速度 rad/s
时间 s
世界变换 cm,UE 的原样

属性的名字里写着单位,比如 Position Meters、Angular Velocity Rad Per Second、Linear Acceleration Meters Per Second Squared。世界变换指点云帧、图像帧和 2D 激光雷达帧里的 Sensor Transform World。

数值换成了米,但坐标轴仍然是 UE 的:X 前、Y 右、Z 上。uBotSensor 的输出不做 ROS 转换,转换由 uBotROS 在发布时完成。

IMU 的线加速度是比力(specific force):静止时读数约为 +9.8 m/s²(World 的重力加速度,默认 −980 cm/s²),方向是世界向上,用传感器坐标系表示。

ROS 遵循 REP-103:右手系,X 前、Y 左、Z 上,单位米。从 UE 到 ROS 是对 Y 轴的镜像,再换算单位。

所有映射都是自逆的:ROS To UE … 的公式和 UE To ROS … 相同,只有单位换算反过来。

相机另有光学系(z 前、x 右、y 下),它的 frame id 是相机的 frame id 加后缀 _optical。相机坐标系到光学系的旋转由 Camera Link To Optical Rotation 给出,后缀由 Get Optical Frame Suffix 给出。

镜像时,位置、速度这类极向量(polar vector)只翻转 Y,角速度、力矩这类轴向量(axial vector)翻转 X 和 Z。下表是 UE 到 ROS 的规则:

量 UE → ROS 蓝图节点
位置 (x, -y, z) / 100 UE To ROS Position
线速度、加速度 (x, -y, z) UE To ROS Vector
角速度、力矩 (-x, y, -z) UE To ROS Angular Velocity
旋转 (-x, y, -z, w) UE To ROS Rotation
变换 旋转镜像,平移换算 UE To ROS Transform
航向、扫描角 ROS = -UE UE To ROS Yaw
时间 秒与 (sec, nanosec) Seconds To ROS Time
6×6 协方差 部分元素变号 无节点

补充说明:

  • 位置从厘米换成米。线速度、加速度这一行也适用于已经是米的点。
  • 旋转是四元数 (x, y, z, w),转换后归一化。
  • 变换的平移从厘米换成米,缩放丢弃,输出缩放为 1。
  • 航向、扫描角和偏航角速度的单位是弧度。
  • 时间的反方向是 ROS Time To Seconds。负数或非有限值的秒得到 (0, 0)。
  • 协方差第 r 行第 c 列的元素,在 r 和 c(从 0 数起)恰有一个是奇数时变号。没有蓝图节点,uBotROS 发布 Odometry 时自动处理。

反方向用对应的 ROS To UE … 节点。一个直观的结果:UE 里向右偏航,在 ROS 里是负的 z 角速度。