本手册介绍 Magpie360-5S 的设备连接、飞行控制、传感器数据、激光定位及投放装置接口,面向具备 Linux、ROS 和基础编程知识的开发者。
术语约定:
- 上位机:飞机搭载的板载计算机,型号为 Jetson Orin NANO / NX。
- 飞控:PX6C,负责姿态稳定、飞行状态管理和底层执行。
- 开发电脑:用于 SSH、编辑程序、查看日志或运行地面站的电脑。
- 投放装置下位机:分电板上的控制单片机。
- 设定值(setpoint):应用程序发送给飞控的期望位置、速度或其他控制量。
除明确标注“开发电脑”外,命令均在上位机的 Bash 终端执行。文中的文件位置使用上位机上的绝对路径,样例代码按文件名索引。
1. 平台概览
1.1 产品定位与开发能力
Magpie360-5S 的应用程序运行在上位机上,通过 ROS 与飞控、传感器和投放装置通信。主要开发方向包括:
| 开发方向 | 主要接口或组件 | 前提 |
|---|---|---|
| 状态监控 | MAVROS 状态、局部位姿、速度和电池话题 | 飞控通信正常 |
| 飞行控制 | MAVROS 位置/速度设定值、模式及解锁服务 | 定位有效、飞控处于对应控制模式 |
| 点云与惯性数据处理 | Livox ROS Driver 2 | 雷达网络和驱动正常 |
| 激光定位与建图 | FAST-LIO、外部位姿转发节点 | 时间、外参、安装方向和飞控融合配置正确 |
| 投放装置控制 | tutorial_catapult、rosserial |
下位机通信正常 |
本平台主要提供 ROS 接口和应用示例,开发者通过订阅 Topic、发布设定值、调用 Service 和配置 Launch/YAML 实现功能。
1.2 硬件组成与接口总览
| 部件 | 型号/配置 | 职责与接口 |
|---|---|---|
| 上位机 | Jetson Orin NANO / NX | 运行 ROS、感知、定位、规划和任务程序 |
| 飞控 | PX6C | 通过 4-pin USB 接口连接分电板内置 USB Hub,由 Hub 接入上位机,通信设备为 /dev/ttyACM0 |
| GPS 模块 | M9N | 带有安全开关 |
| 激光雷达 | MID-360 / MID-360s | 通过以太网直连上位机,提供点云与 IMU 数据 |
| 投放装置 | – | 分电板内置 USB Hub、CH340 USB 转串口芯片与 ATmega328P 下位机,参考设备为 /dev/ttyUSB0 |
1.3 软件架构与数据流

应用给飞控发送期望值,飞控负责底层控制。
vision_pose 只是 MAVROS 的接口名称,输入可以来自激光定位。
2. 设备连接与网络配置

图中设备外形参考 Livox MID-360 官方产品图和 Pixhawk 6C 官方资料。分电板以结构框表示,框内展示 USB Hub、USB 转串口芯片和下位机的内部连接。
2.1 飞控 USB 连接与通信配置
PX6C 通过飞控上的 4-pin USB 接口连接分电板内置 USB Hub 的一个下游端口。Hub 的上游通过分电板引出的 USB-A 接头接入上位机的 USB Type-A 口,上位机枚举出的飞控设备为 /dev/ttyACM0。
lsusb
ls -l /dev/ttyACM0
如果遇到权限问题,可将当前用户加入dialout组:
sudo usermod -aG dialout "$USER"
随后重新登录。不要长期使用 chmod 777 或以 root 运行整套 ROS 来绕过权限问题。
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/launch/mavros.launch包含的配置为:
<launch>
<include file="$(find mavros)/launch/px4.launch">
<arg name="fcu_url" value="/dev/ttyACM0:57600"/>
</include>
</launch>
启动入口:
roslaunch tutorial_basic mavros.launch
也可使用 MAVROS 自身的入口指定连接 URL,选择其中一个入口启动:
roslaunch mavros px4.launch fcu_url:=/dev/ttyACM0:57600
注意:/home/jetson/catkin_ws/src/tutorials/tutorial_basic/launch/mavros.launch 没有暴露可覆盖的 fcu_url 参数。需要更换设备路径时,使用上面的 MAVROS 入口,或在自有 Launch 中明确配置。
读取连接状态:
rostopic echo -n 1 /mavros/state
预期有 connected: True,表示 MAVROS 已经连接上飞控。
2.2 MID-360 / MID-360s 直连与局域网配置
激光雷达通过网线直连上位机以太网口。雷达与上位机使用同一 IPv4 子网内的不同地址。
2.2.1 地址规划
| 项目 | 配置 |
|---|---|
| 雷达专用网卡 | 如 eth0、enP...,以实际网卡名称为准 |
| 上位机地址 | 192.168.1.5 |
| 子网前缀/掩码 | 按设备网络规划填写 |
| 雷达地址 | 192.168.1.1xx, 其中最后一部分的最后两位为雷达的SN码最后两位 |
| 远程管理地址 | 开发电脑用于 SSH 的上位机地址,可能属于另一网卡 |
随无人机附带的launch文件使用上位机地址 192.168.1.5、雷达地址 192.168.1.1xx。
2.2.2 配置 Livox 驱动
驱动包位置可通过以下命令查询:
rospack find livox_ros_driver2
配置文件为 /home/jetson/ros_libraries_ws/src/livox_ros_driver2/config/MID360_config.json,也可能为 /home/jetson/ros_libraries_ws/src/livox_ros_driver2/config/MID360s_config.json,取决于飞机所配备的雷达型号。当前随附配置采用以下字段:
| 字段 | 含义 |
|---|---|
MID360.host_net_info.cmd_data_ip |
上位机接收控制通信的本机地址 |
MID360.host_net_info.push_msg_ip |
上位机接收状态信息的本机地址 |
MID360.host_net_info.point_data_ip |
上位机接收点云的本机地址 |
MID360.host_net_info.imu_data_ip |
上位机接收 IMU 的本机地址 |
MID360.host_net_info.log_data_ip |
日志通道地址,按该版本的日志配置处理 |
lidar_configs[].ip |
要连接的雷达地址 |
对当前单网卡直连配置,前四个地址与上位机雷达网口一致。端口沿用配套驱动配置中的值。不同驱动版本的配置结构可能不同,字段名称以对应型号的配置文件为准。
/home/jetson/ros_libraries_ws/src/livox_ros_driver2/launch_ROS1/msg_MID360.launch 内部通过 user_config_path 参数选择配置文件,没有暴露同名 Launch 参数。修改配置后重启驱动。
2.3 投放装置连接
分电板内置 USB Hub 的另一个下游端口通过板内 USB 走线连接 CH340 USB 转串口芯片,CH340 再通过板内串口走线与 ATmega328P 下位机通信。下位机通过 PWM 控制投放装置舵机。
投放装置与飞控共用分电板引出的 USB-A 上游连接。官方配置中,CH340 对应 /dev/ttyUSB0,飞控对应 /dev/ttyACM0。投放装置的 ROS 接口见 6.3 节。
多个 USB 串口的编号可能随枚举顺序变化。设备身份可通过 /dev/serial/by-id/ 或已有的 udev 别名区分。
2.4 工作区与软件包位置
| 上位机路径 | 内容 |
|---|---|
/home/jetson/ros_libraries_ws/ |
外部 ROS 依赖,如 Livox 驱动、FAST-LIO |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/ |
MAVROS 连接、基础飞行示例 |
/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/ |
激光定位、位姿转发相关配置与节点 |
/home/jetson/catkin_ws/src/tutorials/tutorial_catapult/ |
投放装置驱动与固件资料 |
/home/jetson/catkin_ws/src/tutorials/tutorial_all/ |
综合任务示例 |
工作区环境加载顺序:
source /opt/ros/noetic/setup.bash
source /home/jetson/ros_libraries_ws/devel/setup.bash
source /home/jetson/catkin_ws/devel/setup.bash
3. 基础服务与状态读取
3.1 启动基础服务
各终端加载 2.4 节的工作区环境后,分别启动以下服务。已由系统启动的服务沿用现有实例。
终端 A:ROS Master。
roscore
终端 B:飞控通信。
roslaunch tutorial_basic mavros.launch
终端 C:雷达驱动。
roslaunch livox_ros_driver2 msg_MID360.launch
上述入口对应 MID-360;MID-360s 的入口及其加载的 JSON 按交付驱动配置选择。
终端 D:激光定位。
roslaunch tutorial_navigation mapping_mid360.launch rviz:=false
此入口会加载 /home/jetson/catkin_ws/src/tutorials/tutorial_navigation/config/mid360.yaml,启动 fast_lio 包中的 fastlio_mapping,节点名为 /laserMapping。
终端 E:外部位姿转发。
rosrun tutorial_navigation odom_forward_node
该节点默认订阅 Odometry,发布到 mavros/vision_pose/pose,接口与参数见 7.3 节。
3.2 读取飞机与传感器状态
rosnode list
rostopic echo -n 1 /mavros/state
rostopic hz /livox/lidar
rostopic hz /livox/imu
位姿数据:
rostopic echo -n 1 /Odometry/header
rostopic echo -n 1 /Odometry/pose/pose
rostopic echo -n 1 /mavros/vision_pose/pose/header
rostopic echo -n 1 /mavros/local_position/pose
| 接口 | 数据含义 |
|---|---|
/mavros/state |
飞控连接、飞行模式及解锁状态 |
/livox/lidar、/livox/imu |
雷达点云与惯性测量 |
/Odometry |
FAST-LIO 的局部运动估计 |
/mavros/vision_pose/pose |
发送给飞控的外部位姿测量 |
/mavros/local_position/pose |
飞控融合后的局部位姿 |
查看点云可运行 rviz,添加 PointCloud2 显示,选择 /cloud_registered。Fixed Frame 使用该消息的 header.frame_id,当前 FAST-LIO 输出为 camera_init。
3.3 基础飞行中的接口分工
起飞、悬停和降落流程涉及以下接口:
| 阶段 | 接口 |
|---|---|
| 读取连接和飞行状态 | /mavros/state |
| 获取当前局部位姿 | /mavros/local_position/pose |
| 请求 OFFBOARD 或 AUTO.LAND | /mavros/set_mode |
| 请求解锁/上锁 | /mavros/cmd/arming |
| 持续发送位置目标 | /mavros/setpoint_position/local |
| 持续发送速度目标 | /mavros/setpoint_velocity/cmd_vel |
对应示例文件为 /home/jetson/catkin_ws/src/tutorials/tutorial_basic/src/takeoff_node.cpp。该文件使用速度接口执行起飞、悬停和下降,并调用模式与解锁服务。完整接口定义见第 5 章。
4. 开发基础约定
4.1 坐标系、单位与姿态表示
| 约定 | 轴向/单位 | 接口说明 |
|---|---|---|
| ROS 局部 ENU | X 东、Y 北、Z 上;m | 局部建图的初始化朝向及其与飞控参考的关系由定位配置确定 |
| ROS 机体 FLU | X 前、Y 左、Z 上 | 机体参考下的运动量 |
| 飞控 NED | X 北、Y 东、Z 下 | MAVROS 常规接口处理对应转换 |
| 飞控机体 FRD | X 前、Y 右、Z 下 | 与 ROS 机体 FLU 的轴向约定不同 |
| 线速度/加速度 | m/s、m/s² | 飞行控制接口的单位 |
| 航向/角速度 | rad、rad/s | 舵机角度参数另以度表示 |
| 姿态 | 四元数 x,y,z,w |
无旋转为 (0,0,0,1) |
对 ROS 1 MAVROS 常规局部位置/速度接口,应用侧使用 ROS 坐标约定,由插件进行 ENU/NED 转换。原始设定值接口的转换行为见 5.4 节。
4.2 时间与频率
| 数据/循环 | 时间或频率含义 |
|---|---|
消息 header.stamp |
对应消息的时间戳 |
| Livox 逐点时间 | 相对于点云时间基准的偏移,供运动去畸变等处理使用 |
MID-360 Launch 的 publish_freq |
当前点云发布参数为 10.0 Hz |
| 基础 C++ 控制示例 | 控制循环为 20 Hz |
| 外部位姿转发 | 由输入 /Odometry 消息触发发布,保留输入 Header |
传感器采样、点云打包、里程计更新和控制发送分别具有自己的频率。多路数据的时间对应关系由设备时钟、驱动时间戳及同步配置共同决定。
4.3 命名空间与 TF 约定
本文以单机、根命名空间为例,例如 /mavros/state。ROS 名称区分大小写,/Odometry 与 /odometry 不相同。ROS 相对名称受节点命名空间影响。
当前相关帧名:
| 帧 | 来源/用途 |
|---|---|
livox_frame |
随附 Livox Launch 的默认消息帧名 |
camera_init |
FAST-LIO 输出的局部参考帧 |
body |
FAST-LIO 状态所描述的运动主体帧 |
base_link |
ROS 机体参考帧 |
map、odom |
应用使用的参考帧 |
FAST-LIO 发布动态变换 camera_init → body。/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/launch/mid360.launch 中配置了 map → odom → camera_init 和 body → base_link 的单位静态变换,表示这些帧在该配置下重合。
header.frame_id 是帧标签;坐标转换需要同时计算位置和姿态。当前位姿转发节点的字段处理方式见 7.3 节。
4.4 参数与配置位置
| 配置类型 | 使用方式 | 生效范围 |
|---|---|---|
| Launch 参数 | roslaunch ... 参数:=值 |
Launch 声明并传递给节点的参数 |
| ROS 参数 | rosparam get/set |
是否动态读取由节点实现决定 |
| YAML/JSON | 由 Launch 或驱动加载 | 参数文件中定义的配置 |
| 节点私有参数 | ~参数名;rosrun 可用 _参数:=值 |
实际路径随节点名变化 |
| 飞控参数 | 地面站/飞控参数接口 | 飞控内部配置 |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/launch/run_vel_control.launch 中的节点名是 takeoff_node,其 hover_x 等私有参数位于该节点名下。
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/launch/mavros.launch 包含 MAVROS 的 px4.launch,未显式加载 /home/jetson/catkin_ws/src/tutorials/tutorial_basic/config/px4_config.yaml。运行配置由实际 Launch 包含关系决定。
5. 飞行控制接口参考
5.1 接口总览与样例文件
下表方向以应用程序为参照。“样例文件”列给出使用该接口的代表性文件;完整文件位置列在表后。
| 接口 | 类型 | 应用侧方向 | 用途 | 样例文件 |
|---|---|---|---|---|
/mavros/state |
mavros_msgs/State |
订阅 | 连接、模式、解锁状态 | takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py |
/mavros/local_position/pose |
geometry_msgs/PoseStamped |
订阅 | 飞控局部位姿 | takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py |
/mavros/local_position/odom |
nav_msgs/Odometry |
订阅 | 飞控局部里程计 | ego_planner.launch 中配置了该输入 |
/mavros/local_position/velocity_local |
geometry_msgs/TwistStamped |
订阅 | 局部参考下的速度 | 当前样例未直接读取 |
/mavros/battery |
sensor_msgs/BatteryState |
订阅 | 电池信息 | 当前样例未直接读取 |
/mavros/extended_state |
mavros_msgs/ExtendedState |
订阅 | 包括着陆状态的扩展状态 | 当前样例未直接读取 |
/mavros/setpoint_position/local |
geometry_msgs/PoseStamped |
发布 | 位置与航向设定值 | fly_path.py |
/mavros/setpoint_velocity/cmd_vel |
geometry_msgs/TwistStamped |
发布 | 速度与偏航角速度设定值 | takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp |
/mavros/setpoint_raw/local |
mavros_msgs/PositionTarget |
发布 | 按掩码组合的原始局部设定值 | ego_planner_gate.py |
/mavros/vision_pose/pose |
geometry_msgs/PoseStamped |
发布 | 外部位姿输入 | odom_forward_node.cpp;fly_path.py 中也订阅了该接口 |
/mavros/set_mode |
mavros_msgs/SetMode |
调用服务 | 请求飞行模式 | takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py |
/mavros/cmd/arming |
mavros_msgs/CommandBool |
调用服务 | 请求解锁或上锁 | takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py |
样例文件位置:
| 文件 | 上位机绝对路径 |
|---|---|
takeoff_node.cpp |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/src/takeoff_node.cpp |
vel_control_node.cpp |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/src/vel_control_node.cpp |
circle_node.cpp |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/src/circle_node.cpp |
fly_path.py |
/home/jetson/catkin_ws/src/tutorials/tutorial_basic/scripts/fly_path.py |
odom_forward_node.cpp |
/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/src/odom_forward_node.cpp |
ego_planner_gate.py |
/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/scripts/ego_planner_gate.py |
ego_planner.launch |
/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/launch/ego_planner.launch |
以上只索引接口的使用文件,不展开任务程序的内部流程。
5.2 状态与遥测
/mavros/state
消息类型:mavros_msgs/State。
| 字段 | 含义 |
|---|---|
connected |
MAVROS 与 FCU 的连接状态 |
armed |
飞控解锁状态 |
mode |
当前飞行模式字符串 |
system_status |
MAVLink 系统状态值 |
样例文件:takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py。
局部位姿与速度
header.stamp是数据时间戳,header.frame_id描述参考帧。PoseStamped.pose.position单位为 m,姿态为四元数。Odometry的位姿参考header.frame_id,速度参考child_frame_id。TwistStamped.twist.linear单位为 m/s,twist.angular单位为 rad/s。
vel_control_node.cpp 使用 /mavros/local_position/pose 获取当前位置,并依据位置误差计算速度设定值。
电池与着陆状态
BatteryState.voltage 单位为 V;若有有效的 percentage,其范围通常为 0~1。
/mavros/extended_state 使用 mavros_msgs/ExtendedState,其中 landed_state 表示飞控报告的着陆状态。
5.3 模式切换与解锁/上锁
| 服务 | 主要请求字段 | 主要响应字段 | 对应状态字段 |
|---|---|---|---|
/mavros/set_mode |
base_mode、custom_mode |
mode_sent |
/mavros/state 的 mode |
/mavros/cmd/arming |
value:true 解锁,false 上锁 |
success、result |
/mavros/state 的 armed |
使用自定义模式字符串时,常见请求为 base_mode=0、custom_mode="OFFBOARD"。降落模式字符串为 AUTO.LAND。
mode_sent 描述模式请求的发送结果;模式生效状态通过 State.mode 读取。解锁服务返回请求结果,当前解锁状态通过 State.armed 读取。
样例文件:takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp、fly_path.py。
5.4 位置、速度与航向控制
局部位置接口
/mavros/setpoint_position/local 使用 geometry_msgs/PoseStamped:
position.x/y/z:局部参考下的位置,单位 m。orientation:包含期望航向的有效四元数。纯偏航角ψ可写为(0, 0, sin(ψ/2), cos(ψ/2))。header.stamp:当前时间,随设定值更新。
该接口用于位置与航向控制。应用提供已经处于对应参考帧下的数据,header.frame_id 仅为消息帧标签。
样例文件:fly_path.py。
局部速度接口
/mavros/setpoint_velocity/cmd_vel 使用 geometry_msgs/TwistStamped:
| 字段 | 含义 |
|---|---|
twist.linear.x/y/z |
三轴线速度,m/s |
twist.angular.z |
偏航角速度,rad/s |
twist.angular.x/y |
当前速度插件不用于滚转/俯仰控制 |
ROS 1 MAVROS 的速度插件根据 setpoint_velocity/mav_frame 选择局部或机体解释方式。在默认局部配置下,输入为 ROS ENU,插件转为飞控所需格式。插件实现参考 MAVROS 速度插件。
运行参数位置:
rosparam get /mavros/setpoint_velocity/mav_frame
例如,设置 linear.z=0.4 表示沿当前局部参考的 Z 正方向发送 0.4 m/s 速度目标;设置 angular.z=0.2 表示发送 0.2 rad/s 的偏航角速度目标。
样例文件:takeoff_node.cpp、vel_control_node.cpp、circle_node.cpp。
原始局部设定值接口
/mavros/setpoint_raw/local 使用 mavros_msgs/PositionTarget:
| 字段 | 含义 |
|---|---|
coordinate_frame |
控制量使用的 MAVLink 坐标帧枚举 |
type_mask |
指定被忽略的字段,未被忽略的字段参与控制 |
position |
位置,m |
velocity |
速度,m/s |
acceleration_or_force |
加速度或力,解释方式由掩码决定 |
yaw |
航向角,rad |
yaw_rate |
航向角速度,rad/s |
type_mask=0 表示相关字段均未被掩码忽略。组合设定值时按所需控制量设置掩码。
ROS 1 MAVROS 在局部回调中执行对应的 ENU/NED 转换,具体行为见 MAVROS 原始设定值插件。
样例文件:ego_planner_gate.py。
5.5 OFFBOARD 控制流程
PX4 OFFBOARD 文档给出的模式进入条件包括:进入模式前持续提供设定值至少约 1 秒,运行期间保持高于 2 Hz 的控制存活信号。当前基础 C++ 示例采用 20 Hz 控制循环。

图中的 mode 和 armed 均为 /mavros/state 消息的字段。模式和解锁请求分别通过 /mavros/set_mode 与 /mavros/cmd/arming 发送,位置或速度目标通过对应设定值 Topic 持续发布。
6. 传感器与投放装置接口
6.1 MID-360 / MID-360s:点云与 IMU
随附 MID-360 驱动入口的主要配置如下;MID-360s 使用其配套入口和型号配置文件。
| Launch 参数 | 配置值 | 说明 |
|---|---|---|
xfer_format |
1 |
Livox 自定义点云消息格式 |
multi_topic |
0 |
当前公共话题组织方式 |
publish_freq |
10.0 |
点云发布频率参数,Hz |
msg_frame_id |
livox_frame |
点云等消息使用的默认帧名 |
主要数据接口:
| Topic | 类型 | 用途 |
|---|---|---|
/livox/lidar |
livox_ros_driver2/CustomMsg |
带逐点附加信息的点云 |
/livox/imu |
sensor_msgs/Imu |
角速度、加速度等惯性数据 |
CustomMsg 的主要字段:
| 字段 | 含义 |
|---|---|
header |
ROS 时间戳与帧信息 |
timebase |
首点时间基准,时间域和单位按当前驱动实现定义 |
point_num |
点数 |
lidar_id |
设备标识 |
points[] |
点数组 |
CustomPoint 中的 x/y/z 单位为 m,reflectivity 为 0~255 的反射强度,另包含 offset_time、tag、line。逐点时间信息用于运动去畸变等处理。
IMU 的角速度单位为 rad/s,加速度单位为 m/s²;姿态字段及协方差的含义由驱动输出定义。
标准点云转换入口:
rosrun tutorial_navigation custom_to_pc2.py
对应文件为 /home/jetson/catkin_ws/src/tutorials/tutorial_navigation/scripts/custom_to_pc2.py。它把 /livox/lidar 转为 /livox/pointcloud2,类型为 sensor_msgs/PointCloud2。
该脚本保留 Header,不进行坐标变换或去畸变;默认输出 XYZ 和 uint8 类型的强度,逐点时间、tag 和 line 默认不输出。当前 FAST-LIO 配置使用原始 CustomMsg。
6.2 标定与同步参数
| 信息 | 作用 |
|---|---|
| 雷达与 IMU 外参 | 点云去畸变和激光惯性估计 |
| 传感器/估计主体与机体外参 | 将定位或观测转换到机体参考 |
| 时间偏移和同步方式 | 使不同测量对应到相同的运动时刻 |
FAST-LIO 配置中的 mapping/extrinsic_T、mapping/extrinsic_R 描述算法使用的雷达—IMU 关系;body 与 base_link 的关系描述估计主体与机体的关系。对应配置见 4.3 和 7.2 节。
6.3 投放装置:控制原理与接口简介
投放装置通过分电板上的 ATmega328P 控制舵机,CH340 提供 USB 转串口,并通过板内走线连接分电板内置的 USB Hub。Hub 的上游由分电板引出的 USB-A 接头接入上位机。官方配置使用 /dev/ttyUSB0,通过 rosserial 将上下位机连接到 ROS。
catapult_driver 把舵机角度封装为仓门开关命令,启动时执行初始化及关门动作:
roslaunch tutorial_catapult catapult_driver.launch
常用接口均为 std_msgs/Empty:
| Topic | 动作 |
|---|---|
/servo/front_left/open、/servo/front_left/close |
左前仓门开/关 |
/servo/front_right/open、/servo/front_right/close |
右前仓门开/关 |
/servo/back_left/open、/servo/back_left/close |
左后仓门开/关 |
/servo/back_right/open、/servo/back_right/close |
右后仓门开/关 |
/servo/all/open、/servo/all/close |
全部仓门开/关 |
发送一次左前仓门开启命令:
rostopic pub -1 /servo/front_left/open std_msgs/Empty '{}'
驱动文件为 /home/jetson/catkin_ws/src/tutorials/tutorial_catapult/src/catapult_driver.cpp,启动配置为 /home/jetson/catkin_ws/src/tutorials/tutorial_catapult/launch/catapult_driver.launch。当前开关命令采用 Topic 发布方式,无服务响应或机械到位反馈。
方向、行程、详细驱动配置及下位机烧录步骤见《投放装置控制原理与软件(Jetson Orin Nano/NX)》。
7. 激光定位与建图
7.1 定位链路与数据接口

FAST-LIO 产生局部运动估计和点云地图;转发节点将位姿适配到 MAVROS 输入;飞控估计器融合外部测量,并通过 MAVROS 输出局部状态。
7.2 MID-360 与 FAST-LIO
当前应用配置位于 /home/jetson/catkin_ws/src/tutorials/tutorial_navigation/config/mid360.yaml。
| 参数 | 配置值 | 含义 |
|---|---|---|
common/lid_topic |
/livox/lidar |
点云输入 |
common/imu_topic |
/livox/imu |
IMU 输入 |
common/time_sync_en |
false |
当前未启用该内部同步选项 |
common/time_offset_lidar_to_imu |
0.0 |
当前额外时间偏移 |
preprocess/lidar_type |
1 |
当前 Livox 输入类型 |
preprocess/blind |
0.25 |
近距离过滤参数,单位 m |
mapping/extrinsic_est_en |
false |
当前未开启在线外参估计 |
mapping/extrinsic_T、extrinsic_R |
配置中的平移、旋转 | 雷达与 IMU 的外参 |
publish/path_en |
false |
当前默认不发布路径消息 |
pcd_save/pcd_save_en |
false |
当前默认不保存 PCD |
主要输出:
| Topic | 类型 | 参考帧/说明 |
|---|---|---|
/Odometry |
nav_msgs/Odometry |
camera_init → body |
/cloud_registered |
sensor_msgs/PointCloud2 |
注册到 camera_init 的点云 |
/cloud_registered_body |
sensor_msgs/PointCloud2 |
body 下的点云,取决于发布配置 |
/path |
nav_msgs/Path |
通过路径发布参数启用 |
地图保存由 pcd_save/pcd_save_en 和 pcd_save/interval 控制,具体保存位置由所安装 FAST-LIO 版本定义。
样例使用文件:odom_forward_node.cpp 订阅 /Odometry;其上位机位置为 /home/jetson/catkin_ws/src/tutorials/tutorial_navigation/src/odom_forward_node.cpp。
7.3 外部定位接入飞控
/home/jetson/catkin_ws/src/tutorials/tutorial_navigation/src/odom_forward_node.cpp 的接口为:
| 项目 | 内容 |
|---|---|
| 输入 | nav_msgs/Odometry;默认 ROS 相对名称 Odometry |
| 输出 | geometry_msgs/PoseStamped;ROS 相对名称 mavros/vision_pose/pose |
私有参数 odometry_topic |
指定输入 Topic,默认 Odometry |
私有参数 frame_id |
默认空;非空时替换输出 Header 的帧标签 |
| 时间 | 复制输入 Header |
| 数据 | 复制 pose.pose |
在根命名空间下,输入和输出分别为 /Odometry 与 /mavros/vision_pose/pose。
该节点只转发 Header 和位姿字段,不执行坐标变换,也不转发原始 Odometry 的速度与协方差。输出的原点、朝向和时间语义沿用输入数据,frame_id 参数用于替换帧标签。
飞控通过 MAVROS 接收外部位姿,并按其估计器配置进行融合。融合后的局部位姿从 /mavros/local_position/pose 读取,局部里程计从 /mavros/local_position/odom 读取。