本篇内容:如何运行在仿真中运行FULE位置环境探索算法
本篇内容属于高级飞行,真机运行时具有一定的危险和炸机风险,请注意做好保护措施,
FUEL 是一种专为无人机(UAV)设计的未知环境探索算法,旨在高效构建环境地图并规划探索路径。
git clone -b v2.7.1 https://github.com/stevengj/nlopt.git
cd nlopt
mkdir build
cd build
cmake ..
make
sudo make install
sudo apt-get install libarmadillo-dev
注意:在由于在ego-planner和fuel中包含了一个同名的节点,因此这个两个不能同时编译在环境中会导致运行报错,如果已经编译了ego-planner需要在Sunray/build文件夹下将ego-planner和fuel(如果存在)删除然后重新编译FUEL
catkin_make --source FUEL --build build/FUEL
exploration_node:负责地图构建、前沿点检测、轨迹规划与优化
- sdf_map:有符号距离场地图
- resolution:地图分辨率(0.1m),决定地图细节精度
- obstacles_inflation:障碍物膨胀半径(0.35m),用于避障安全距离
- box_min/max_x/y/z:有效探索区域边界,限制地图构建范围(如 x 轴 - 10.0~10.0m)
- p_hit/p_miss:点云命中 / 未命中的概率(0.65/0.35),用于更新地图 occupancy 概率
- map_ros:基于 ROS 的地图相关参数或接口
- cx/cy/fx/fy:相机内参,用于深度图像与点云的投影转换
- depth_filter_maxdist/mindist:深度滤波距离阈值(5.0m/0.2m),过滤无效深度数据
- cloud_topic:输入点云话题(默认使用全局点云/uav1/global_points)
- fsm/thresh_replan1/2/3:重规划触发阈值(0.5/0.5/1.5),基于环境变化动态调整路径
- frontier:探索边界 / 前沿
- cluster_min:前沿点聚类最小点数(100),过滤无效前沿区域
- min_candidate_dist:候选探索点最小距离(0.75m),避免密集采样
- manager/max_vel/acc:最大速度 / 加速度(1.0m/s/1.0m/s²),限制无人机运动能力
- optimization/ld_smooth:轨迹平滑权重(20.0),平衡轨迹平滑度与路径长度
- astar/resolution_astar:A * 算法搜索分辨率(0.2m),影响路径搜索精度
traj_server:管理轨迹发布与时间参数
- time_forward:轨迹前瞻时间(1.5s),决定提前规划的轨迹长度
- init_x/y/z:无人机初始位置(0, 0, 1.2m),用于轨迹初始化
- perception_utils/max_dist:感知最大距离(4.5m),限制传感器有效范围
waypoint_generator:生成航点目标,对接move_base_simple/goal话题
- waypoint_type:航点类型(point),指定生成点目标而非路径
- odom:订阅里程计话题(/uav1/sunray/gazebo_pose),获取无人机当前位姿
positionCmd2sunray:exploration_node的规划结果以一个自定义的话题输出,需要转换为sunray控制节点中的对应的消息
- cmd_sub_topic:需要订阅的positionCmd话题
- control_pub_topic:转换结果发布的话题
- control_type:控制类型 0:XyzPosYaw 1:XyzVelYaw 2:XyzPosVelYaw
- enable_yaw:是否控制偏航角,true:无人机偏航角会进行转动 false:无人机偏航角固定不动
point_cloud_transform:exploration_node的规划结果以一个自定义的话题输出,需要转换为sunray控制节点中的对应的消息
- input_point_topic:输入的局部点云话题
- output_point_topic:输出的全局点云话题
- odom_topic:用于坐标转换的里程计话题
- frame_id:全局坐标系下的点云数据中填充的 frame_id
- child_frame_id:全局坐标系下的点云数据中填充的 child_frame_id
在Sunray的控制模块中通过订阅两个话题实现对无人机状态和任务的控制
- sunray/setup
消息定义:Sunray/General_Module/sunray_common/sunray_msgs/msg/UAVSetup.msg
消息说明:该消息用于对控制模块中的模式设置、解锁、上锁、停桨等操作,详细功能请阅读消息定义
- 例:执行解锁
复制代码rostopic pub /uav1/sunray/setup sunray_msgs/UAVSetup "header: seq: 0 stamp: secs: 0 nsecs: 0 frame_id: '' cmd: 1 px4_mode: '' control_state: ''" -1
- 例:切换至CMD_CONTROL
复制代码rostopic pub /uav1/sunray/setup sunray_msgs/UAVSetup "header: seq: 0 stamp: secs: 0 nsecs: 0 frame_id: '' cmd: 4 px4_mode: '' control_state: 'CMD_CONTROL'" -1
- sunray/uav_control_cmd
消息定义:Sunray/General_Module/sunray_common/sunray_msgs/msg/UAVControlCMD.msg
消息说明:该消息用于对无人机发布控制方式与对应控制项的值,详细功能请阅读消息定义
- 例:发布位置控制
复制代码rostopic pub /uav1/sunray/uav_control_cmd sunray_msgs/UAVControlCMD "header: seq: 0 stamp: {secs: 0, nsecs: 0} frame_id: '' cmd: 1 desired_pos: [1.0, 1.0, 1.0] desired_vel: [0.0, 0.0, 0.0] desired_acc: [0.0, 0.0, 0.0] desired_att: [0.0, 0.0, 0.0] desired_thrust: 0.0 desired_yaw: 0.0 desired_yaw_rate: 0.0 latitude: 0.0 longitude: 0.0 altitude: 0.0" -1
FUEL算法可能会因为依赖包版本、话题订阅等多种原因报错,rviz和算法同时启动也容易报错退出,因此Sunray的启动方法中将启动rviz和算法的启动分成单独的启动launch
仿真中使用了点云数据与仿真定位作为传感器输入,如果真机运行需要自行修改对应的话题和参数
脚本启动前提:切换到脚本所在的根目录~/Sunray/scripts_sim下进行操作!
## 运行fuel脚本
./fuel_sim.sh