前言

本文记录在自定义的Gazebo仿真环境(赤壁场景)中,通过图像匹配技术实现无人机定位的测试过程。主要涉及PX4无人机仿真、ROS2话题桥接、MAVROS控制以及基于图像重定位的视觉定位系统。

系统架构

整个测试系统包含以下组件:

  1. Gazebo仿真环境:赤壁自定义场景
  2. PX4无人机:搭载下视单目相机的x500模型
  3. ROS2桥接:连接Gazebo和ROS2生态系统
  4. MAVROS:实现无人机控制
  5. 视觉定位系统:基于图像匹配的定位服务

环境准备

版本兼容性说明

重要:ROS2 Humble与Gazebo Harmonic版本匹配问题

在桥接话题时需要安装 ros-humble-ros-gzharmonic,而不是ROS2自带的 ros-humble-ros-gz

安装正确的桥接包:

1
sudo apt install ros-humble-ros-gzharmonic

启动仿真环境

终端1:启动Gazebo仿真环境

1
2
3
4
5
# 设置Gazebo模型路径
export GZ_SIM_RESOURCE_PATH=$HOME/PX4-Autopilot/Tools/simulation/gz/models

# 启动仿真(-s表示不启动GUI,减少显存占用)
gz sim -s -r ~/PX4-Autopilot/Tools/simulation/gz/worlds/chibi.sdf

参数说明:

  • -s:无GUI模式(headless),降低资源占用
  • -r:运行模式
  • chibi.sdf:赤壁场景文件

终端2:启动PX4无人机

1
2
3
4
5
6
7
cd ~/PX4-Autopilot

PX4_GZ_WORLD=chibi \
PX4_SYS_AUTOSTART=4001 \
PX4_SIM_MODEL=gz_x500_mono_cam_down \
PX4_GZ_MODEL_POSE="0,0" \
./build/px4_sitl_default/bin/px4 -i 0

参数说明:

  • PX4_GZ_WORLD=chibi:指定赤壁世界
  • PX4_SYS_AUTOSTART=4001:无人机系统ID
  • PX4_SIM_MODEL=gz_x500_mono_cam_down:搭载下视单目相机的x500
  • PX4_GZ_MODEL_POSE="0,0":初始位置
  • -i 0:实例编号

ROS2集成

桥接相机图像

终端3:桥接Gazebo图像到ROS2

1
2
3
4
ros2 run ros_gz_image image_bridge \
/world/chibi/model/x500_mono_cam_down_0/link/camera_link/sensor/camera/image \
--ros-args \
-r /world/chibi/model/x500_mono_cam_down_0/link/camera_link/sensor/camera/image:=/my_camera/image_raw

这会将Gazebo中的相机图像桥接到ROS2话题 /my_camera/image_raw

注意:实际话题名称需要根据Gazebo模型结构调整,可以使用以下命令查看:

1
gz topic -l | grep image

启动MAVROS

终端4:启动MAVROS控制接口

1
2
3
4
5
6
# 设置ROS2域ID(避免与其他ROS2系统冲突)
export ROS_DOMAIN_ID=1

# 启动MAVROS
ros2 launch onboard_control mainTree.launch.py \
fcu_url:="udp://:14540@127.0.0.1:14557"

参数说明:

  • ROS_DOMAIN_ID=1:设置ROS2域ID
  • fcu_url:飞控连接URL(UDP协议)

视觉定位系统

启动匹配服务器

终端5:启动图像匹配服务

1
2
3
4
5
6
7
cd ~/ros2_ws/src/onboard/headless_resection_service

# 设置ROS2域ID
export ROS_DOMAIN_ID=1

# 启动服务
bash start_ros_service.sh

匹配服务器提供以下功能:

  • 接收实时相机图像
  • 与预先生成的数据库进行匹配
  • 返回相机位姿估计结果

启动匹配客户端

终端6:启动测试客户端

1
2
3
4
5
# 设置ROS2域ID
export ROS_DOMAIN_ID=1

# 启动客户端
python3 test_client_ros_realtime.py

客户端功能:

  • 订阅相机图像话题
  • 发送匹配请求到服务器
  • 接收并显示定位结果

完整启动流程总结

按照以下顺序启动各个组件:

  1. 终端1:启动Gazebo仿真环境(无GUI)

    1
    2
    export GZ_SIM_RESOURCE_PATH=$HOME/PX4-Autopilot/Tools/simulation/gz/models
    gz sim -s -r ~/PX4-Autopilot/Tools/simulation/gz/worlds/chibi.sdf
  2. 终端2:启动PX4无人机

    1
    2
    3
    cd ~/PX4-Autopilot
    PX4_GZ_WORLD=chibi PX4_SYS_AUTOSTART=4001 PX4_SIM_MODEL=gz_x500_mono_cam_down PX4_GZ_MODEL_POSE="0,0" \
    ./build/px4_sitl_default/bin/px4 -i 0
  3. 终端3:桥接相机图像

    1
    ros2 run ros_gz_image image_bridge /world/chibi/model/x500_mono_cam_down_0/link/camera_link/sensor/camera/image --ros-args -r /world/chibi/model/x500_mono_cam_down_0/link/camera_link/sensor/camera/image:=/my_camera/image_raw
  4. 终端4:启动MAVROS

    1
    2
    export ROS_DOMAIN_ID=1
    ros2 launch onboard_control mainTree.launch.py fcu_url:="udp://:14540@127.0.0.1:14557"
  5. 终端5:启动匹配服务器

    1
    2
    3
    cd ~/ros2_ws/src/onboard/headless_resection_service
    export ROS_DOMAIN_ID=1
    bash start_ros_service.sh
  6. 终端6:启动匹配客户端

    1
    2
    export ROS_DOMAIN_ID=1
    python3 test_client_ros_realtime.py

测试验证

检查话题连接

1
2
3
4
5
6
7
8
# 查看所有ROS2话题
ros2 topic list

# 查看相机图像
ros2 topic echo /my_camera/image_raw --no-arr

# 查看匹配结果(根据实际话题名调整)
ros2 topic echo /matching/result

检查Gazebo话题

1
2
3
4
5
# 列出所有Gazebo话题
gz topic -l

# 查看相机图像话题
gz topic -e -t /world/chibi/model/x500_mono_cam_down_0/link/camera_link/sensor/camera/image

可视化

使用RViz2可视化定位结果:

1
rviz2

在RViz2中添加:

  • Image显示:查看相机图像
  • Pose显示:查看定位位姿
  • TF显示:查看坐标系关系

性能优化

减少资源占用

  1. 使用无GUI模式gz sim -s(已在上面的命令中使用)
  2. 降低图像分辨率:在相机配置中调整分辨率参数
  3. 减少特征点数量:在匹配算法中调整特征提取参数

提高定位精度

  1. 确保数据库质量:生成覆盖完整、光照均匀的数据库
  2. 调整匹配阈值:根据实际场景调整匹配相似度阈值
  3. 添加时间戳同步:确保图像和IMU数据时间对齐

常见问题

1. 话题名称不匹配

现象:无法接收到图像数据

解决方法

1
2
3
4
# 检查Gazebo中的实际话题名
gz topic -l | grep image

# 根据实际话题名调整桥接命令

2. ROS2域ID冲突

现象:不同节点之间无法通信

解决方法:确保所有节点使用相同的ROS2域ID

1
export ROS_DOMAIN_ID=1

3. 匹配服务器无响应

检查项

  • 服务是否正常启动
  • 数据库是否正确加载
  • 网络通信是否正常

4. MAVROS连接失败

解决方法

  • 检查PX4是否正常启动
  • 验证UDP端口配置
  • 查看MAVROS日志

扩展应用

1. 自定义场景

可以根据需要创建其他Gazebo世界:

  • 室内环境
  • 城市场景
  • 特定任务场景

2. 多机协同

通过设置不同的实例编号和初始位置:

1
2
./build/px4_sitl_default/bin/px4 -i 1
./build/px4_sitl_default/bin/px4 -i 2

3. 算法对比

可以测试不同的视觉定位算法:

  • 特征点匹配
  • 深度学习定位
  • 混合方法

参考资源

总结

本文介绍了在Gazebo仿真环境中进行无人机视觉定位测试的完整流程。通过PX4、ROS2和图像匹配技术的结合,可以快速验证视觉定位算法的有效性,为后续实际部署提供可靠的技术基础。

关键要点:

  1. 注意ROS2和Gazebo版本兼容性
  2. 正确配置话题桥接
  3. 统一ROS2域ID
  4. 按照正确顺序启动各个组件
  5. 及时验证各环节的数据流