坐标系、话题与服务

仿真算法能否正确工作,取决于位置、速度、姿态和控制量是否采用同一套约定。本页按当前源码的数据流说明接口;移植到其他 PX4、MAVROS 或机型版本时,应重新核对坐标变换。

单机与多机命名空间

场景 话题前缀 示例
单机 /mavros/state
多机第 N 架 /uavN /uav3/mavros/state

uav_id 从 0 开始。uav_amount=1 时,垂起固定翼与状态封装使用根命名空间;数量大于 1 时使用 /uavN

上层控制接口

期望速度向量

项目 定义
话题 /control_signal/vector/uavN/control_signal/vector
消息 geometry_msgs/Vector3
数据 [vx, vy, vz]
单位 m/s
发布方式 需要以稳定频率持续发布

固定翼和垂起固定翼会把向量转换为偏航、滚转、俯仰和纵向控制量;多旋翼控制器把速度设定值转为 MAVROS PositionTarget

期望姿态

项目 定义
话题 /control_signal/att/uavN/control_signal/att
消息 std_msgs/Float64MultiArray
顺序 [roll, pitch, yaw, force]
角度单位 rad

force 是当前仿真控制链使用的归一化纵向输入,不能直接当作实机电机推力或油门百分比。

状态接口

属性 ROS 来源 当前用途
local_pose mavros/local_position/pose 单机局部位置与姿态
global_pose mavros/global_position/global 纬度、经度、高度
gazebo_pose vision_pose/pose Gazebo 真值位置,多机算法主要使用
local_vel mavros/local_position/velocity_local 局部速度
global_vel mavros/global_position/local 里程计速度
body_vel mavros/local_position/velocity_body 机体系速度
body_acc mavros/imu/data IMU 线加速度
state mavros/state 连接、解锁和模式

四元数属性顺序为 [x, y, z, w]。上层算法首次读取前,数组使用非零占位值初始化;因此算法节点启动后应先确认 MAVROS 已连接并收到有效状态。

Gazebo 真值转发

get_local_pose.py 订阅 /gazebo/model_states,按模型名查找:

  • 单机:<uav_type>
  • 多机:<uav_type>0<uav_type>1……

随后以 30 Hz 发布:

  • 单机:/vision_pose/pose/vision_speed/speed
  • 多机:/uavN/vision_pose/pose/uavN/vision_speed/speed

模型名称与 launch 中生成的名称必须一致,否则回调中的模型查找会失败。

MAVROS 服务

服务 用途 调用位置
/mavros/cmd/arming 解锁/上锁 三类机型控制器
/mavros/set_mode 切换 OFFBOARD、AUTO.RTL 等模式 三类机型控制器
/mavros/cmd/takeoff 固定翼/多旋翼起飞 FW_class.pyRotor_class.py
/mavros/cmd/vtol_transition 垂起固定翼形态转换 VTOL_class.py

多机模式在服务名前同样增加 /uavN

坐标约定的使用建议

ROS、MAVROS 和 PX4 在局部 ENU/NED、机体系 FLU/FRD 之间存在转换。当前源码的变量注释中同时出现 EDUENDNED 等写法,且不同控制器对 PositionTarget.coordinate_frame 的设置不同。开发时建议:

  1. 上层算法统一使用其状态来源对应的 ROS 局部坐标,不混用经纬度与局部米制坐标。
  2. 用单轴小指令分别确认 x、y、z 的正方向,再开始三维轨迹测试。
  3. 姿态角始终以弧度传入,记录俯仰角在控制节点中的符号翻转。
  4. 改变 coordinate_frame 或 MAVROS 版本后,重新验证速度方向和偏航方向。
  5. 将仿真算法迁移到实机前,单独编写并测试显式坐标转换层。

安全边界

控制节点会调用解锁、起飞和飞行模式服务。请只在确认连接到 PX4 SITL 后运行本手册示例。