跳转到正文

动捕与 VRPN 定位

本页将说明如何在 Windows 动捕主机上启动 VRPN 数据发送,在 Docker 容器中启动 vrpn_client_ros,并确认 FCU 所需的 /uav_1/pose 位姿话题持续、正确地更新。

1. 启动 Windows 动捕发送端

在 Windows 动捕主机上完成以下操作:

1.1 检查动捕软件与刚体

  1. 启动 NOKOV 动捕软件,并加载正确的相机标定结果;
  2. 创建或确认无人机刚体;
  3. 确认刚体名称与系统编号一致,例如无人机 1 对应 uav_1、无人机 2 对应 uav_2
  4. 确认刚体在动捕软件中持续被识别,位置和姿态没有明显跳变;
  5. 启动 VRPN 服务;
  6. 确认 Windows 主机 IP 与项目配置一致;
  7. 确认 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/bash

2.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.bash

3.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/pose

5.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 与起飞