无人机三维运动规划实战:从零部署ego-planner到XTDrone仿真
1. 环境准备与依赖安装
第一次接触无人机三维运动规划的朋友可能会被各种依赖库搞得头大,我刚开始部署ego-planner时也踩了不少坑。这里分享下最稳妥的环境搭建方法,帮你避开90%的常见问题。
首先确保你的Ubuntu系统版本在18.04或20.04(其他版本可能会有兼容性问题)。我实测20.04最稳定,建议直接用这个版本。安装ROS时记得选择对应版本,Melodic对应18.04,Noetic对应20.04。装完ROS后,先别急着下一步,这个基础命令能帮你检查环境是否完整:
rosdep check --from-paths src --ignore-src -r -y接下来是最容易出问题的Eigen3安装。原始文章提到了版本冲突问题,这里我要特别强调:千万不要直接用apt安装默认版本!我试过至少5种安装方式,最终发现手动编译3.3.7版本最可靠。具体操作时有个细节容易被忽略:安装后必须执行这两步拷贝操作,否则后续编译会提示找不到Eigen库:
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include sudo cp -r /usr/local/include/eigen3 /usr/include/eigen3关于ceres-solver的安装,建议用源码编译1.14.0版本。这个版本和Eigen3.3.7配合最好,能避免大多数矩阵运算错误。编译时记得加上这些参数:
cmake .. -DEXPORT_BUILD_DIR=ON -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF2. XTDrone仿真环境配置
配置仿真环境时最容易出错的是传感器模型的选择。原始文章提到了要修改launch文件中的sdf模型,这里有个重要细节:iris_stereo_camera和iris_realsense_camera的区别。前者只有双目视觉,后者还包含深度信息,如果你要做三维避障必须用后者。
我整理了一个完整的配置检查清单:
- 检查PX4固件版本是否为v1.11.3(其他版本可能有接口变动)
- 确认~/.bashrc中正确设置了PX4和ROS的环境变量
- 测试gazebo是否能正常启动(建议先单独运行gazebo看是否有模型加载错误)
启动仿真时建议分步验证,不要一次性运行所有节点。我通常按这个顺序:
- 先单独启动PX4和gazebo
- 再启动VINS-Fusion节点
- 最后启动通信和控制节点
这样分段调试能快速定位问题所在。如果遇到图像话题无法接收的问题,试试这个诊断命令:
rostopic hz /iris_0/stereo/image_raw3. ego-planner编译与部署
把ego-planner代码拷贝到工作空间后,别急着catkin_make。我建议先处理这几个关键点:
- 修改CMakeLists.txt中的Eigen3依赖路径
- 检查yaml-cpp的版本(必须≥0.6.0)
- 为避免内存溢出,最好修改编译参数:
catkin_make -j2 # 限制并行编译线程数编译通过后,部署时最容易忽略的是坐标系转换。原始文章提到了ego_transfer.py脚本,这里有个实用技巧:先用rostopic echo检查输入输出的坐标系是否一致。我经常用这个命令来验证:
rostopic echo /iris_0/ego_planner_node/odom如果发现路径规划结果异常,大概率是坐标系定义有问题。ego-planner默认使用ENU坐标系,而有些传感器输出的是NED坐标系,这个细节一定要注意。
4. 全系统集成与调试
到了把所有模块串联起来的阶段,我强烈建议使用文章末尾提到的plan.sh脚本。不过直接使用可能会遇到终端顺序问题,我优化后的版本增加了错误检测:
#!/bin/bash function check_node() { rostopic list | grep -q "$1" return $? } gnome-terminal -- bash -c "cd ~/PX4_Firmware; roslaunch px4 indoor1.launch; exec bash" while ! check_node "/iris_0/mavros/state"; do sleep 1; done gnome-terminal -- bash -c "cd ~/catkin_ws; bash scripts/xtdrone_run_vio.sh; exec bash" while ! check_node "/iris_0/vins_estimator/odometry"; do sleep 1; done调试过程中最有用的是rviz的配置。除了文章提到的ego_rviz.rviz,我建议添加这几个显示项:
- 添加Path显示规划轨迹
- 添加PointCloud2显示障碍物点云
- 添加TF查看坐标系关系
如果发现规划路径不光滑,可以调整这些参数:
- 修改ego_planner_config.yaml中的max_vel_x(建议从1.0开始逐步增加)
- 调整bspline_degree(一般3-5比较合适)
- 增加obstacle_inflation(安全距离建议设为无人机半径的1.5倍)
5. 常见问题解决方案
在实际部署中我遇到过几个棘手问题,这里分享下解决方法:
问题1:规划路径出现剧烈抖动原因:通常是传感器噪声过大或时间同步问题 解决:
- 检查VINS-Fusion的imu话题时间戳
- 在ego_planner_node.cpp中调整odom_callback的缓存大小
- 尝试在launch文件中添加
问题2:无人机到达目标点后不停晃动原因:控制器参数不匹配 解决:
- 调整hover.py中的PID参数
- 修改cmd_vel_flu的发布频率(建议≥30Hz)
- 检查电机混控配置是否正确
问题3:避障时反应迟钝原因:点云处理耗时过长 解决:
- 在rtabmap配置中降低点云分辨率
- 使用octomap代替点云直接输入
- 调整ego-planner的replan频率
6. 进阶优化技巧
当基础功能都调通后,可以尝试这些优化方法提升性能:
- 多传感器融合:在VINS-Fusion配置中添加GPS话题(即使仿真中也建议模拟)
use_gps: true gps_topic: /iris_0/mavros/global_position/global- 动态障碍物处理:修改ego-planner的障碍物预测模块
prediction_time_horizon = 3.0; // 从默认1.5秒增加到3秒- 能耗优化:在路径代价函数中添加能量消耗项
rosrun dynamic_reconfigure dynparam set /ego_planner_node "cost_power" 0.5- 可视化增强:在rviz中添加航点标记
waypoint_marker = Marker() waypoint_marker.type = Marker.SPHERE_LIST waypoint_marker.scale.x = 0.2 waypoint_marker.color.a = 1.0; waypoint_marker.color.r = 1.0最后提醒下,每次修改参数后建议做完整的飞行测试,包括:
- 悬停稳定性测试(至少30秒)
- 阶跃响应测试(突然改变目标点)
- 障碍物突现测试(用gazebo动态添加障碍物)
