主题模式
动捕与 VRPN 定位
本页将说明如何在 Windows 动捕主机上启动 VRPN 数据发送,在 Docker 容器中启动 vrpn_client_ros,并确认 FCU 所需的 /uav_1/pose 位姿话题持续、正确地更新。
1. 启动 Windows 动捕发送端
在 Windows 动捕主机上完成以下操作:
1.1 检查动捕软件与刚体
- 启动 NOKOV 动捕软件,并加载正确的相机标定结果;
- 创建或确认无人机刚体;
- 确认刚体名称与系统编号一致,例如无人机 1 对应
uav_1、无人机 2 对应uav_2; - 确认刚体在动捕软件中持续被识别,位置和姿态没有明显跳变;
- 启动 VRPN 服务;
- 确认 Windows 主机 IP 与项目配置一致;
- 确认 Windows 防火墙允许 VRPN 端口通信。
刚体名称必须一致
VRPN 会根据动捕软件中的刚体名称生成 ROS 2 话题。刚体名称、无人机编号和后续 FCU 配置不一致时,FCU 可能无法获得正确的外部位姿。
1.2 核对默认 VRPN 参数
当前仓库的默认配置为:
| 配置项 | 当前值 |
|---|---|
| Windows VRPN 服务地址 | 10.1.1.198 |
| VRPN 端口 | 3883 |
| ROS 坐标系 | world |
| 发布频率 | 60.0 Hz |
对应配置文件位于容器工作空间的源码目录:
text
/home/linuxbrew/swarmlab_simulator_ws/src/vrpn_client_ros/config/sample.params.yaml如果 Windows 主机实际 IP 不同,应在宿主机的工作空间源码目录中修改该配置文件,然后重新编译 vrpn_client_ros。也可以临时修改安装空间中的实际运行配置,但不推荐长期这样做,因为下次构建可能覆盖安装空间中的临时修改。
1.3 从容器检查 Windows 网络
在已经进入容器的终端中执行以下命令检查网络:
bash
ping -c 3 10.1.1.198如果现场修改了 Windows VRPN 地址,应将命令中的 10.1.1.198 替换为实际地址。
成功判据: Windows 动捕软件能够持续看到无人机刚体,并且 Docker 容器能够访问 Windows 主机。
2. 启动 VRPN 客户端
2.1 打开终端 C 并进入容器
另开一个 Ubuntu 宿主机终端,将其作为终端 C ,然后执行:
bash
docker exec -it aiswarmlab_vrpn /bin/bash2.2 加载环境并启动客户端
在终端 C 的容器内执行:
bash
source /opt/ros/humble/setup.bash
source /home/linuxbrew/swarmlab_simulator_ws/install/setup.bash
ros2 launch vrpn_client_ros sample.launch.py也可以将三条命令写成一行:
bash
source /opt/ros/humble/setup.bash && source /home/linuxbrew/swarmlab_simulator_ws/install/setup.bash && ros2 launch vrpn_client_ros sample.launch.py成功判据: 终端显示已经连接到 VRPN 服务,并为动捕软件中发现的刚体创建 tracker。
VRPN 客户端需要持续接收并发布位姿,因此启动成功后保持终端 C 运行,不要关闭或按 Ctrl+C 中断进程。
3. 检查 ROS 2 动捕话题
3.1 打开终端 D 并加载环境
另开一个 Ubuntu 宿主机终端,将其作为终端 D。先进入容器:
bash
docker exec -it aiswarmlab_vrpn /bin/bash然后在容器内加载环境:
bash
source /opt/ros/humble/setup.bash
source /home/linuxbrew/swarmlab_simulator_ws/install/setup.bash3.2 查看节点和全部话题
bash
ros2 node list
ros2 topic list | sort重点查找包含无人机编号和 pose 的话题:
bash
ros2 topic list | grep -E 'uav_[0-9]+/.+(pose)|uav_[0-9]+/pose'项目 FCU 默认需要无人机 1 的外部位姿话题:
text
/uav_1/pose但是 vrpn_client_ros 的原生话题名称也可能是:
text
/vrpn_client_node/uav_1/pose因此必须以 ros2 topic list 的实际输出为准,不能只根据教程猜测。
4. 检查位姿类型、内容和频率
如果话题列表中存在 /uav_1/pose,依次执行:
bash
ros2 topic type /uav_1/pose
ros2 topic echo --once /uav_1/pose
ros2 topic hz /uav_1/pose预期话题类型为:
text
geometry_msgs/msg/PoseStamped检查时应注意:
- 移动无人机时,
position.x/y/z应连续变化; - 转动无人机时,四元数姿态应连续变化;
ros2 topic hz统计的频率应接近配置值60 Hz;- 实际频率略低于 60 Hz 通常可以接受,但不能长时间停止更新。
ros2 topic echo --once 输出一条消息后会自动结束;ros2 topic hz 会持续统计频率,检查完成后按 Ctrl+C 返回命令行。
5. 处理话题名称不一致
当前 fcu_core_launch.py 将无人机 1 的外部位姿输入映射为 /uav_1/pose。如果系统中只有 /vrpn_client_node/uav_1/pose,FCU 将收不到该位姿。
5.1 临时转发话题
可以先使用 topic_tools 将原生 VRPN 话题临时转发到 FCU 需要的话题:
bash
ros2 run topic_tools relay /vrpn_client_node/uav_1/pose /uav_1/pose保持该转发进程运行,并在另一个已经加载环境的容器终端中重新检查:
bash
ros2 topic echo --once /uav_1/pose5.2 多机与正式部署说明
- 多架无人机需要针对每个编号分别建立对应转发;
- 正式部署更推荐统一修改 launch/remap 配置,而不是长期依赖手工 relay;
- 如果提示找不到
topic_tools,说明当前镜像中没有安装该包,需要由开发人员补充依赖或修改 launch 重映射。
6. 起飞前位姿检查清单
只有以下条件全部满足后,才能继续启动 FCU 和进行无人机起飞操作:
/uav_1/pose存在;- 话题类型为
geometry_msgs/msg/PoseStamped; - 位姿消息持续更新;
- 坐标值的单位和方向符合现场定义;
- 抬高无人机时,
z方向变化正确; - 转动机头时,姿态变化连续;
- 遮挡刚体后能够及时发现数据异常;
- 恢复刚体识别后,位姿数据恢复正常;
- 没有多个节点同时发布互相冲突的
/uav_1/pose。
检查话题的发布者数量和详细信息:
bash
ros2 topic info /uav_1/pose -v位姿异常时不要继续
如果位姿不存在、停止更新、方向错误、出现跳变,或者存在相互冲突的发布者,应先排查动捕、VRPN 和话题映射问题,不要继续解锁或起飞无人机。
全部检查通过后,进入下一章:FCU、RViz 与起飞。
