Gazebo仿真环境中的无人机视觉定位测试
前言
本文记录在自定义的Gazebo仿真环境(赤壁场景)中,通过图像匹配技术实现无人机定位的测试过程。主要涉及PX4无人机仿真、ROS2话题桥接、MAVROS控制以及基于图像重定位的视觉定位系统。
系统架构
整个测试系统包含以下组件:
- Gazebo仿真环境:赤壁自定义场景
- PX4无人机:搭载下视单目相机的x500模型
- ROS2桥接:连接Gazebo和ROS2生态系统
- MAVROS:实现无人机控制
- 视觉定位系统:基于图像匹配的定位服务
环境准备
版本兼容性说明
重要:ROS2 Humble与Gazebo Harmonic版本匹配问题
在桥接话题时需要安装
ros-humble-ros-gzharmonic,而不是ROS2自带的ros-humble-ros-gz
安装正确的桥接包:
1 | sudo apt install ros-humble-ros-gzharmonic |
启动仿真环境
终端1:启动Gazebo仿真环境
1 | # 设置Gazebo模型路径 |
参数说明:
-s:无GUI模式(headless),降低资源占用-r:运行模式chibi.sdf:赤壁场景文件
终端2:启动PX4无人机
1 | cd ~/PX4-Autopilot |
参数说明:
PX4_GZ_WORLD=chibi:指定赤壁世界PX4_SYS_AUTOSTART=4001:无人机系统IDPX4_SIM_MODEL=gz_x500_mono_cam_down:搭载下视单目相机的x500PX4_GZ_MODEL_POSE="0,0":初始位置-i 0:实例编号
ROS2集成
桥接相机图像
终端3:桥接Gazebo图像到ROS2
1 | ros2 run ros_gz_image image_bridge \ |
这会将Gazebo中的相机图像桥接到ROS2话题 /my_camera/image_raw
注意:实际话题名称需要根据Gazebo模型结构调整,可以使用以下命令查看:
1 | gz topic -l | grep image |
启动MAVROS
终端4:启动MAVROS控制接口
1 | # 设置ROS2域ID(避免与其他ROS2系统冲突) |
参数说明:
ROS_DOMAIN_ID=1:设置ROS2域IDfcu_url:飞控连接URL(UDP协议)
视觉定位系统
启动匹配服务器
终端5:启动图像匹配服务
1 | cd ~/ros2_ws/src/onboard/headless_resection_service |
匹配服务器提供以下功能:
- 接收实时相机图像
- 与预先生成的数据库进行匹配
- 返回相机位姿估计结果
启动匹配客户端
终端6:启动测试客户端
1 | # 设置ROS2域ID |
客户端功能:
- 订阅相机图像话题
- 发送匹配请求到服务器
- 接收并显示定位结果
完整启动流程总结
按照以下顺序启动各个组件:
终端1:启动Gazebo仿真环境(无GUI)
1
2export GZ_SIM_RESOURCE_PATH=$HOME/PX4-Autopilot/Tools/simulation/gz/models
gz sim -s -r ~/PX4-Autopilot/Tools/simulation/gz/worlds/chibi.sdf终端2:启动PX4无人机
1
2
3cd ~/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:桥接相机图像
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:启动MAVROS
1
2export ROS_DOMAIN_ID=1
ros2 launch onboard_control mainTree.launch.py fcu_url:="udp://:14540@127.0.0.1:14557"终端5:启动匹配服务器
1
2
3cd ~/ros2_ws/src/onboard/headless_resection_service
export ROS_DOMAIN_ID=1
bash start_ros_service.sh终端6:启动匹配客户端
1
2export ROS_DOMAIN_ID=1
python3 test_client_ros_realtime.py
测试验证
检查话题连接
1 | # 查看所有ROS2话题 |
检查Gazebo话题
1 | # 列出所有Gazebo话题 |
可视化
使用RViz2可视化定位结果:
1 | rviz2 |
在RViz2中添加:
- Image显示:查看相机图像
- Pose显示:查看定位位姿
- TF显示:查看坐标系关系
性能优化
减少资源占用
- 使用无GUI模式:
gz sim -s(已在上面的命令中使用) - 降低图像分辨率:在相机配置中调整分辨率参数
- 减少特征点数量:在匹配算法中调整特征提取参数
提高定位精度
- 确保数据库质量:生成覆盖完整、光照均匀的数据库
- 调整匹配阈值:根据实际场景调整匹配相似度阈值
- 添加时间戳同步:确保图像和IMU数据时间对齐
常见问题
1. 话题名称不匹配
现象:无法接收到图像数据
解决方法:
1 | # 检查Gazebo中的实际话题名 |
2. ROS2域ID冲突
现象:不同节点之间无法通信
解决方法:确保所有节点使用相同的ROS2域ID
1 | export ROS_DOMAIN_ID=1 |
3. 匹配服务器无响应
检查项:
- 服务是否正常启动
- 数据库是否正确加载
- 网络通信是否正常
4. MAVROS连接失败
解决方法:
- 检查PX4是否正常启动
- 验证UDP端口配置
- 查看MAVROS日志
扩展应用
1. 自定义场景
可以根据需要创建其他Gazebo世界:
- 室内环境
- 城市场景
- 特定任务场景
2. 多机协同
通过设置不同的实例编号和初始位置:
1 | ./build/px4_sitl_default/bin/px4 -i 1 |
3. 算法对比
可以测试不同的视觉定位算法:
- 特征点匹配
- 深度学习定位
- 混合方法
参考资源
总结
本文介绍了在Gazebo仿真环境中进行无人机视觉定位测试的完整流程。通过PX4、ROS2和图像匹配技术的结合,可以快速验证视觉定位算法的有效性,为后续实际部署提供可靠的技术基础。
关键要点:
- 注意ROS2和Gazebo版本兼容性
- 正确配置话题桥接
- 统一ROS2域ID
- 按照正确顺序启动各个组件
- 及时验证各环节的数据流
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dreamer Island!






