依据图片中给定的项目示例给出设计方案:

不合适回复:
ROS 机器人导航方案(对应RViz效果图)
从截图可见:RViz中蓝色全局规划路径 、环境点云障碍物(灰色立柱)、机器人模型、目标点,是典型机器人自主避障导航场景,下面给出完整ROS方案,可基于ROS Noetic/Melodic(ROS1)或ROS2 Humble。
一、系统整体架构
硬件:移动底盘 + 激光雷达/3D深度相机(输出点云) + IMU + 里程计
软件:ROS导航栈,核心模块:感知 → 定位 → 地图 → 路径规划 → 底盘控制
传感器(激光/深度相机) → 点云预处理 → SLAM/静态地图 + AMCL定位 → Nav规划器 → 速度指令 → 底盘
截图里蓝色曲线 = 全局规划器输出的全局路径 ;灰色立柱点云 = 环境障碍物;目标点是2D Nav Goal。
二、模块详细设计
1. 感知模块(环境障碍物,图中点云)
- 传感器:3D激光雷达 / RGB-D深度相机(Realsense),输出点云
PointCloud2 - ROS节点:
pcl_ros:点云滤波(降采样、去除地面点、噪声过滤),提取障碍物点云pointcloud_to_laserscan(可选):3D点云转2D激光,适配传统2D导航
- 输出:障碍物点云,送入代价地图
costmap,用于局部避障。
2. 定位模块
方案A(已知静态地图):AMCL 蒙特卡洛定位(最常用)
- 输入:激光数据 + 里程计 + 预先建好的静态地图
map - 输出:机器人在地图坐标系下的位姿
/tf+amcl_pose - 适用:环境不变,室内立柱场景(和你的图匹配)
方案B(无先验地图):SLAM实时建图+定位
- 可选:
cartographer/gmapping,一边建图一边定位,适合未知环境。
TF坐标树:
map→odom→base_link→laser_link,必须保证TF正常,RViz才能对齐点云和机器人。
3. 导航规划栈(核心,蓝色路径)
全局规划器(蓝色长路径)
接收目标点2D Nav Goal,基于静态全局代价地图,规划一条从起点到终点的无碰撞全局参考路径。
可选:
global_planner(ROS原生)navfnA*/ Dijkstra 算法
局部规划器(实时避障)
跟随全局路径,根据实时障碍物代价地图,输出速度指令/cmd_vel给底盘。
可选:
DWA(Dynamic Window Approach,最常用)TEB Planner(时间弹性带,适合需要考虑机器人运动约束)
代价地图 Costmap
分为两层:
- 全局代价地图:静态地图+静态障碍物,用于全局路径搜索(蓝色路径)
- 局部代价地图 :实时传感器障碍物,用于局部动态避障
参数配置:障碍物膨胀层、机器人半径层,防止机器人碰撞立柱。
4. 机器人底盘控制
- 订阅
/cmd_vel(geometry_msgs/Twist)速度指令 - 底层:差速/轮式底盘,里程计发布
/odom - 发布TF:
base_link相对于odom的变换。
5. RViz可视化(截图界面)
RViz添加显示插件:
Map:静态地图PointCloud2:环境障碍物点云(图中灰色立柱)Path:/move_base/GlobalPlanner/plan→ 蓝色全局路径RobotModel:机器人本体模型PoseArray:AMCL粒子(定位粒子)2D Nav Goal:设置导航目标点,触发规划
三、ROS节点关系(ROS1 move_base方案)
/map_server 发布静态地图
/amcl 定位,输出机器人位姿
/move_base 导航主节点
├─ GlobalPlanner 输出全局路径(蓝色线)
└─ LocalPlanner 输出/cmd_vel
/laser/pointcloud 传感器点云 → costmap更新障碍物
/base_controller 接收 /cmd_vel,驱动底盘
ROS2对应:
nav2导航栈,nav2_planner全局规划器、nav2_controller局部控制器,nav2_costmap_2d代价地图。
四、工作流程
- 启动
map_server加载预先建好的环境地图; - 启动AMCL定位,加载激光,确定机器人当前位置;
- 启动
move_base(ROS1)/Nav2(ROS2)导航栈; - RViz点击
2D Nav Goal,指定目标点; - 全局规划器搜索地图,生成蓝色全局路径;
- 局部规划器根据实时点云障碍物,跟踪全局路径,输出速度指令;
- 底盘执行运动,持续更新定位,直到抵达目标点。
五、关键参数调优建议(针对立柱密集场景)
- costmap 障碍物膨胀半径:大于机器人半宽,防止贴柱子;
- 全局规划器:选用A*,设置合适路径分辨率;
- DWA局部规划:限制最大线速度、角速度,立柱多场景降低速度;
- 点云滤波:地面点必须过滤掉,否则地面会被识别为障碍物。
六、可选扩展
- 动态障碍物:增加动态物体检测,在代价地图中移除移动障碍物;
- 3D导航:如果机器人有高度约束,使用
move_base_3d,不再局限2D平面导航; - 多目标连续导航:写节点依次发送多个
NavGoal。
如果你需要,我可以:
- 直接给出 ROS1 move_base 的完整yaml参数文件;
- 或者 ROS2 Nav2 的launch+yaml工程模板;
- 或者画一张mermaid流程图,方便写报告。你想要哪个?

ROS机器人导航方案(图中蓝色体素占用栅格+点云障碍物场景)
从截图识别:
蓝色块状区域:体素代价地图(voxel_grid) 3D占用栅格;灰色:3D点云立柱障碍物;蓝色长曲线:全局规划路径;红色短线:局部规划轨迹。
这是基于3D点云的2.5D/3D避障导航,不是传统2D激光导航,适合有高度信息的环境(高低障碍物)。
一、系统总体架构
硬件:移动底盘 + 3D传感器(固态激光雷达 / Realsense深度相机,输出PointCloud2)+ IMU + 轮式里程计
软件栈(ROS1):pcl_ros点云预处理 → voxel_grid体素栅格 → costmap_2d(带VoxelLayer)代价地图 → move_base导航栈;
ROS2可替换为Nav2 +
nav2_costmap_2dVoxel层。
数据流:
3D传感器PointCloud2 → 点云滤波(地面剔除、降采样) → Voxel体素栅格(蓝色占用块) → 代价地图更新障碍物信息 → 全局规划器生成蓝色全局路径 → 局部规划器生成红色局部轨迹 → /cmd_vel速度指令 → 底盘执行。
二、各模块详细设计
1. 感知模块:3D点云处理 & Voxel体素占用栅格(截图蓝色块)
核心:VoxelLayer体素层,可以区分障碍物高度,不会把地面当成障碍物。
- 点云预处理节点:
pcl_voxel_grid:对点云降采样,减少点数量;- 地面分割:
pcl_segmentation/ground_segmentation,滤除地面点,只保留障碍物点云(立柱); - 输出过滤后的障碍物
PointCloud2。
costmap_2d的VoxelLayer体素层(截图蓝色体素方块) 传统2D costmap只看平面;VoxelLayer会在Z轴分层,记录每个体素是否被占用,然后投影到2D代价地图。可以过滤低于机器人底盘高度、高于机器人高度的点,只保留机器人碰撞高度范围内障碍物。- 输入:过滤后的障碍物点云;
- 输出:2D代价地图障碍物信息;
- 可视化:RViz中添加
VoxelGrid显示,就是图里蓝色块状占用栅格。
2. TF坐标系统
必须保证TF树完整:
map → odom → base_link → sensor_link(雷达/深度相机)
TF负责坐标变换,将雷达点云统一转换到机器人基坐标系,再投影到地图坐标系,保证点云和代价地图对齐。
3. 定位模块
方案A:静态地图+AMCL定位(推荐,本场景)
- 输入:激光/点云、里程计、预先建好的静态地图;
- 输出:机器人在map坐标系下的位姿
amcl_pose和TF变换;
适用:立柱环境,地图固定。
方案B:实时SLAM
Cartographer / LIO-SAM,边建图边定位,适合未知环境。
4. 导航规划栈(move_base / Nav2)
move_base包含两个规划器,对应图里两条轨迹:
- 全局规划器(蓝色长线)
接收RViz的2D Nav Goal目标点,基于全局代价地图,搜索一条无碰撞参考路径。
可选:global_planner(A*)、navfn。 - 局部规划器(红色短线)
跟踪全局路径,读取实时Voxel代价地图障碍物,实时计算速度指令/cmd_vel。
可选:DWA、TEB Planner; 红色线就是局部规划器预测的机器人短期运动轨迹。
代价地图分两层:
- 全局代价地图:静态地图 + 静态障碍物,用于全局路径搜索;启用VoxelLayer;
- 局部代价地图:实时3D点云障碍物,用于动态避障,启用VoxelLayer。
VoxelLayer关键参数:设置机器人高度区间,忽略低于底盘、高于机器人的点,防止误判障碍物。
5. 底盘控制模块
- 订阅话题:
/cmd_vel(geometry_msgs/Twist) - 底盘驱动接收速度,控制电机;
- 里程计节点:发布
/odom,输出位置姿态,发布odom → base_linkTF。
6. RViz可视化配置(截图界面)
添加RViz显示插件:
PointCloud2:3D障碍物点云(灰色立柱);VoxelGrid:体素占用栅格(蓝色方块);Path:/move_base/GlobalPlanner/plan,蓝色全局路径;Path:/move_base/DWAPlannerROS/trajectory,红色局部预测轨迹;RobotModel:机器人模型;Map:静态2D地图;Pose:机器人当前位姿;- 工具:
2D Pose Estimate初始化定位,2D Nav Goal下发导航目标点。
三、节点拓扑(ROS1 move_base)
sensor_node → /cloud_raw (原始点云)
↓
cloud_filter_node → /cloud_obstacle(过滤后障碍物点云)
↓
/map_server:加载静态地图
/amcl:定位输出机器人位姿
/move_base(导航核心节点)
├─ global_costmap(含VoxelLayer) → GlobalPlanner → /move_base/GlobalPlanner/plan 蓝色路径
└─ local_costmap(含VoxelLayer) → DWAPlannerROS → /move_base/DWAPlannerROS/trajectory 红色局部轨迹 → /cmd_vel
↓
base_driver:接收/cmd_vel驱动底盘,发布/odom
四、工作流程
- 启动
map_server加载建好的环境静态地图; - 启动
amcl定位,RViz使用2D Pose Estimate初始化机器人位置; - 启动3D传感器,点云滤波节点,只保留障碍物点;
- 启动
move_base,代价地图加载VoxelLayer体素层,实时把3D点云转为占用栅格; - RViz点击
2D Nav Goal下发目标; - 全局规划器搜索地图生成蓝色全局参考路径;
- 局部规划器读取Voxel体素障碍物,生成红色局部预测轨迹,输出
/cmd_vel; - 底盘执行运动,持续更新定位与代价地图,直到到达目标点。
五、关键调参(针对Voxel体素栅格立柱场景)
- VoxelLayer参数:
z_min:机器人底盘最低高度;z_max:机器人顶部高度;
只把落在这个高度区间的点当成障碍物,过滤地面和高于机器人的点云。voxel_size:体素大小,体素越小精度越高,占用算力越大。
- 代价地图膨胀半径:大于机器人外接半径,保证机器人和立柱保持安全距离。
- 局部规划DWA:限制最大线速度、角速度,立柱密集场景降低速度,防止来不及避障。
- 点云滤波:地面分割必须做好,否则地面点会全部填充蓝色Voxel栅格,导航认为全是障碍物。
六、方案对比 & 可选扩展
- 和传统2D激光导航区别:传统2D激光只能扫描一个平面;Voxel+3D点云可以识别不同高度障碍物,适合有悬空物体、高低障碍场景。
扩展功能:
- 动态障碍物检测:增加目标检测节点,识别移动物体,在代价地图中动态更新;
- 3D导航框架:
move_base_3d实现全三维空间规划; - 多目标导航:编写一个python节点循环发送多个NavGoal,实现连续巡点。
七、交付物可选
如果你需要,我可以直接给你:
costmap_common_params.yaml完整配置文件(VoxelLayer版本);- ROS1 launch启动文件;
- Mermaid流程图,可直接放进报告。
需要哪个?

ROS 多机器人协同导航方案(RViz多机可视化截图)
图中信息解读:
- 多色曲线(蓝/黄/紫):每台机器人独立的全局导航路径
- 彩色体素块(蓝/黄/紫):各机器人独立的Voxel体素代价地图
- 红色短线:各机器人局部规划预测轨迹
- 灰色立柱点云:共享环境3D障碍物点云
✅ 场景:多移动机器人在同一立柱环境下独立规划、协同避障,每台机器人拥有独立的代价地图与规划器,同时感知全局环境障碍物
一、系统总体架构
硬件组成:多台移动机器人(每台底盘+3D深度/固态激光雷达+IMU+里程计),可选中央调度PC。
软件架构(ROS1,多机器人命名空间方案;ROS2可使用Composition与Namespace)
两种架构可选:
- 分布式架构(推荐):每台机器人本地独立运行感知、定位、导航;仅通过话题广播自身位姿,机器人之间互相感知,实现多机避障。
- 集中式架构:中央节点收集所有机器人位姿+环境点云,统一分配目标点,下发路径给各机器人执行。
数据流:
机器人机载传感器 → 点云预处理(地面分割、滤波) → Voxel体素代价地图(分机器人命名空间) → 单机move_base规划(全局路径+局部轨迹) → 底盘/cmd_vel;
多机信息交互:各机器人发布自身/tf、/robot_pose,其他机器人代价地图把别的机器人当作动态障碍物。
二、模块详细设计
1. 多机器人命名空间(Namespace)设计【核心】
ROS1多机最关键:所有话题、TF、节点加机器人命名空间 ,防止话题冲突
示例机器人命名:robot0、robot1、robot2
话题示例:
/robot0/scan
/robot0/cloud_obstacle
/robot0/move_base/GlobalPlanner/plan # robot0蓝色全局路径
/robot0/move_base/DWAPlannerROS/trajectory # robot0红色局部轨迹
/robot0/move_base/local_costmap/voxel_grid # robot0蓝色体素栅格
/robot1/cloud_obstacle
/robot1/move_base/GlobalPlanner/plan # robot1黄色全局路径
/robot1/move_base/local_costmap/voxel_grid # robot1黄色体素栅格
/robot2/...紫色对应robot2
RViz中按命名空间订阅不同机器人的Path、VoxelGrid、RobotModel,实现多机同时可视化(截图效果)。
2. 单机感知模块(每台机器人独立运行)
每台机器人机载3D传感器输出点云PointCloud2:
- 点云预处理:降采样
pcl_voxel_grid+ 地面分割,滤除地面点,只保留障碍物立柱; costmap_2d启用 VoxelLayer体素层:只提取机器人碰撞高度区间内障碍物,生成本机的体素占用栅格(图中彩色块);- 额外增加动态障碍物层(ObstacleLayer):订阅其他机器人发布的位姿,把其他机器人轮廓加入本机代价地图,实现机器人之间互相避障。
环境静态立柱为全局障碍物;其他机器人属于动态障碍物。
3. 定位模块(单机独立定位)
每台机器人独立AMCL定位:
输入:本机雷达点云 + 本机里程计 + 共享静态全局地图;
输出:/robotX/amcl_pose,以及本机TF树map → robotX/odom → robotX/base_link。
所有机器人共用同一个
map世界坐标系,保证所有机器人位姿在同一坐标系下对齐,RViz才能在同一个三维视图同时显示全部机器人。
TF树要点:全局固定坐标系
map├─ /robot0/odom → /robot0/base_link
├─ /robot1/odom → /robot1/base_link
└─ /robot2/odom → /robot2/base_link
4. 导航规划模块(每台机器人独立move_base)
每台机器人独立启动move_base,拥有独立全局规划器 + 独立局部规划器:
- 全局规划器(彩色长曲线:蓝/黄/紫)
接收本机2D Nav Goal目标点,基于本机全局代价地图(静态立柱+其他机器人),规划全局参考路径。 - 局部规划器(红色短线)
跟踪全局路径,读取本机实时局部代价地图(实时立柱+邻近机器人),滚动预测多条局部轨迹,输出速度指令/robotX/cmd_vel给本机底盘。
推荐局部规划器:TEB Planner(多机器人场景更优,支持考虑机器人外形、运动约束,对多机交会避障效果优于DWA)
代价地图两层:
global_costmap:静态地图 + 静态立柱障碍物 + 其他机器人位姿(慢速更新)local_costmap:实时3D点云障碍物 + 邻近机器人动态障碍物(高频更新)
两层都启用VoxelLayer处理3D点云。
5. 多机协同调度模块(可选上层任务层)
- 任务分配节点:下发多个目标点给不同机器人;
- 冲突检测节点:监控机器人之间距离,当距离过近可发送暂停指令,避免拥堵;
- 任务状态反馈:收集各机器人是否到达目标、是否堵死。
6. RViz可视化配置(截图界面)
RViz添加多个显示插件,按命名空间区分:
- PointCloud2:全局环境点云(灰色立柱);
- VoxelGrid:分别订阅
/robot0/move_base/local_costmap/voxel_grid、/robot1/...,对应蓝、黄、紫体素; - Path:分别订阅各机器人
GlobalPlanner/plan(彩色长路径)、DWAPlannerROS/trajectory(红色局部轨迹); - RobotModel:加载多台机器人模型;
- TF:查看所有机器人TF;
- 工具:
2D Nav Goal,可以选择命名空间,给指定机器人下发导航目标。
三、节点拓扑(ROS1)
【机器人robot0】
sensor_node → /robot0/cloud_raw → cloud_filter_node → /robot0/cloud_obstacle
amcl_node(/robot0/) → /robot0/amcl_pose
move_base(/robot0/)
├─ global_costmap(VoxelLayer) → GlobalPlanner → /robot0/move_base/GlobalPlanner/plan
└─ local_costmap(VoxelLayer+ObstacleLayer动态障碍物层) → TEB/DWA → /robot0/cmd_vel
base_driver(/robot0/)
【机器人robot1】
sensor_node → /robot1/cloud_raw → cloud_filter_node → /robot1/cloud_obstacle
amcl_node(/robot1/) → /robot1/amcl_pose
move_base(/robot1/)
├─ global_costmap(VoxelLayer) → GlobalPlanner → /robot1/move_base/GlobalPlanner/plan
└─ local_costmap(VoxelLayer+ObstacleLayer) → TEB/DWA → /robot1/cmd_vel
base_driver(/robot1/)
【全局共享】
map_server:加载全局静态地图,发布 /map
multi_robot_obstacle_node:订阅所有机器人pose,广播各机器人占位信息,供各机器人costmap动态障碍物层订阅
四、完整工作流程
- 启动
map_server加载全局静态地图; - 每台机器人上电,启动机载传感器、点云滤波、AMCL定位;RViz使用
2D Pose Estimate对每台机器人初始化位姿; - 各机器人启动本机
move_base,代价地图加载VoxelLayer与动态障碍物层; - 上层调度/RViz使用
2D Nav Goal分别为不同机器人下发目标点; - 每台机器人独立全局规划生成本机彩色全局路径;
- 局部规划器实时读取3D立柱点云 + 邻近机器人位姿,生成本机红色局部预测轨迹,输出
/cmd_vel控制底盘; - 各机器人持续发布自身位姿,作为动态障碍物被其他机器人代价地图感知,实现多机互相避障;
- 机器人抵达目标后,等待新任务。
五、关键参数与调优要点
- VoxelLayer参数:统一设置
z_min/z_max,只保留机器人高度范围内障碍物; - 动态障碍物层:设置机器人膨胀半径,把其他机器人作为占位栅格;
- 规划器推荐TEB Planner:支持多机器人交互避障,可设置机器人之间安全距离;
- TF必须全部对齐到同一个
map坐标系,否则RViz中机器人和点云错位; - 通信:多机器人建议使用局域网,ROS1多机通信需要配置
ROS_MASTER_URI,使用同一roscore(集中式)或分布式多roscore(更稳定);ROS2天然支持分布式,推荐大型多机场景。
六、方案优缺点 & 扩展
✅ 优点:单机独立感知规划,一台机器人故障不影响其他机器人;支持3D点云Voxel避障,可以区分不同高度障碍物;可视化直观。
❌ 缺点:ROS1命名空间配置繁琐;多机距离很近时,局部规划容易震荡;算力消耗随机器人数量增加。
扩展方向:
- 多机器人SLAM:未知环境下,多机器人协同建图(cartographer multi-robot);
- 任务分配:基于拍卖算法实现多机器人巡逻、多点巡检任务;
- 编队控制:机器人保持固定编队运动;
- 故障监测:机器人卡住、定位丢失自动上报。
七、可交付文件清单
如果你需要,我可以提供:
- ROS1 launch文件模板(带robot命名空间,一键启动多机器人)
costmap_common_params.yaml(VoxelLayer + 动态障碍物层完整yaml)- TEB Planner参数配置文件
- Mermaid流程图,可以直接放进课程设计/毕设报告
你需要哪个?

问了三次以上,终于有用了。

✅ 图中机器人模型:四旋翼无人机(Quadrotor,四轴飞行器)
这个是蓝桥云课ROS云实践平台经典多机仿真案例(zhangrelay案例)。
1. 结构说明
- 本体:四旋翼(4个螺旋桨)飞行器,RViz里黑色十字四叶片就是4个旋翼。
- 运动模型:全向6自由度飞行器模型(3个平移+3个旋转),不是地面轮式机器人。
- 建模文件:使用 URDF 描述机器人连杆、旋翼、传感器,在RViz通过
RobotModel插件可视化。 - 传感器配置:搭载3D激光/深度相机,输出3D点云,所以可以生成图中的彩色Voxel体素代价地图,做三维环境避障导航。
2. 动力学特性
四旋翼模型特点:
- 4个电机驱动4组螺旋桨,依靠旋翼推力控制升降、平移、旋转;
- 属于欠驱动非线性系统,不能直接侧向平移,靠姿态倾斜产生水平分力实现移动;
- 本仿真中,每架无人机独立运行一套导航栈(Voxel体素代价地图+TEB局部规划器),实现多无人机在立柱环境下协同避障。
3. 配套仿真信息
- 环境:立柱障碍三维场景;
- 多机方案:多台四旋翼,使用ROS命名空间隔离话题;
- 可视化内容:
- 彩色曲线:每台无人机全局导航路径;
- 红色短线:局部规划器预测的飞行轨迹;
- 彩色方块:各无人机独立Voxel体素占用栅格(3D代价地图);
- 灰色立柱:环境3D点云障碍物。
注意:虽然是空中无人机,案例中沿用了地面机器人
move_base导航框架(2.5D导航,在水平面规划路径,固定高度飞行)。
4. URDF结构简要
URDF连杆:
base_link:机身中心刚体rotor_0 ~ rotor_3:4个旋翼连杆(RViz显示的黑色四叶片)laser_link:挂载3D雷达/深度相机,用于获取环境点云。
如果你需要,我可以给这个四旋翼URDF模型的示例代码。
结论:之前方案不完全错误,但存在关键缺陷,因为我误判为地面轮式机器人,而实际是四旋翼无人机(多机空中2.5D导航)
下面区分【保留正确部分】、【需要修正错误部分】、【更新后的完整ROS方案】
✅ 之前方案里仍然正确的内容
- **感知部分(Voxel体素代价地图、3D点云处理)**完全成立
- 点云滤波、地面分割、
VoxelLayer体素栅格原理不变; - RViz可视化部分(PointCloud2、VoxelGrid、Path、多机namespace命名空间、TF)的逻辑完全匹配截图。
- 点云滤波、地面分割、
- 多机器人通信架构、命名空间隔离思路 正确
- 多机共用
map全局坐标系,每台机器人独立一套感知/定位/规划; - 其他无人机作为动态障碍物加入代价地图,多机互避障逻辑没问题。
- 多机共用
- 全局规划器(A)生成全局参考路径*的逻辑不变。
❌ 之前方案的核心错误(根源:把无人机当成地面轮式底盘)
- 底盘模块错误
之前写的是轮式底盘,接收/cmd_vel(Twist)给轮子 。
但对象是四旋翼无人机 :- 无人机不能直接使用普通
base_driver轮式驱动; - 底层不是轮式里程计,是无人机飞控;
- 输出控制指令不再是单纯平面Twist,需要位置/姿态/高度控制。
- 无人机不能直接使用普通
- 规划器适用场景的误区
之前直接推荐DWA/TEB(原生为地面轮式机器人设计)。 这个案例属于2.5D导航:固定飞行高度,只在水平面做路径规划 ,所以仍然可以借用move_base/Nav2做平面路径规划,但局部规划输出的Twist不能直接发给轮子,要增加一层无人机控制器,将Twist速度指令转为无人机期望姿态/推力。 - 定位模块细节偏差
地面机器人用轮式里程计;无人机定位一般是:IMU + 视觉/激光里程计 + 可选外部定位(如UWB),不是轮式odom。
补充:这个经典仿真案例是2.5D平面导航 :无人机维持恒定高度,只做XY平面避障,高度单独闭环控制,不是真正全3D空间路径规划。所以可以复用move_base的2D规划框架,但底层执行层必须替换成无人机飞控。
修正后的ROS多四旋翼无人机2.5D导航方案(适配你截图场景)
1. 整体架构
硬件:多台四旋翼无人机(机载3D激光/深度相机 + IMU + 飞控)
软件:ROS1,Namespace多机隔离;2.5D导航(XY平面规划,Z高度独立控制)
数据流:
机载3D传感器→ 点云预处理 → Voxel体素代价地图 → move_base(全局A* + TEB局部规划)→/cmd_vel平面速度指令 → 无人机位置控制器 → 飞控(姿态/推力控制)→ 四旋翼电机。额外独立一条控制环路:高度闭环,维持无人机固定飞行高度。
2. 模块修正说明
(1)感知模块【不变,沿用之前】
每台无人机机载点云,地面分割、VoxelLayer体素栅格,将立柱障碍物投影到XY平面,生成2D代价地图;
代价地图动态障碍物层:订阅其他无人机位姿,将别的无人机作为动态障碍物。
(2)定位模块【修正】
不再是轮式里程计+AMCL,无人机定位方案:
- 方案A(仿真常用,本案例):仿真器直接提供无人机真值位姿
/odom; - 方案B(真实无人机):LIO-SAM / FAST-LIO 激光惯性里程计,输出
odom,配合AMCL或者直接LIO建图定位;
TF树依然:map → robotX/odom → robotX/base_link,雷达挂载在base_link下。
(3)导航规划层【小幅修正】
依然使用move_base + TEB Planner(这个案例标准配置)
- 全局规划:A*,生成彩色全局路径(截图紫/黄/蓝长线);
- 局部规划TEB:生成红色局部预测轨迹,输出
/cmd_vel(XY平面线速度+偏航角速度);
⚠️ 重点:TEB输出的
/cmd_vel只是平面运动期望,不能直接发给电机,必须增加中间控制节点。
(4)无人机控制执行层【完全重写,之前方案最大漏洞】
增加位置控制节点 (drone_controller)
- 输入:
/cmd_vel(move_base输出的平面速度) - 独立高度控制器:维持设定飞行高度,单独输出垂直方向推力;
- 位置环 → 姿态环 → 推力分配:把期望的水平速度转换成四旋翼的姿态角,再解算4个电机转速;
- 输出给飞控:期望姿态 / 电机推力指令;
- 飞控底层:四旋翼动力学模型,控制4个螺旋桨。
仿真环境(如gazebo)中,存在四旋翼模型插件,接收位置/姿态指令,模拟无人机动力学。
3. 节点拓扑修正版(ROS1,多四旋翼)
【robot0 无人机0】
仿真传感器 → /robot0/cloud_raw → 点云滤波 → /robot0/cloud_obstacle
定位节点(LIO/仿真真值) → /robot0/odom 、TF
move_base(/robot0/)
├─ global_costmap(VoxelLayer) → GlobalPlanner → /robot0/move_base/GlobalPlanner/plan
└─ local_costmap(VoxelLayer+动态障碍物层) → TEB → /robot0/cmd_vel
drone_controller(/robot0/) # 新增!无人机位置控制器
↓
gazebo四旋翼模型/飞控插件 → 4旋翼动力学仿真
robot1、robot2结构完全一致,命名空间隔离
【全局】
map_server发布静态地图
multi_drone_obstacle_node:订阅所有无人机pose,作为动态障碍物
4. 工作流程修正要点
- 仿真启动,加载多架四旋翼URDF模型;
- 每台无人机启动定位、3D点云感知;
- move_base做水平面路径规划,输出平面速度;
drone_controller接收平面速度,同时独立闭环维持飞行高度;- 控制器解算姿态、电机推力,驱动四旋翼飞行;
- 多机互相感知对方位姿,作为动态障碍物避障。
5. 关键区别总结
| 项目 | 之前错误描述 | 修正后(四旋翼无人机) |
|---|---|---|
| 执行机构 | 轮式底盘,电机驱动轮子 | 四旋翼飞行器,4螺旋桨,欠驱动飞控 |
| 里程计 | 轮式里程计 | 激光惯性里程计/仿真真值odom |
| cmd_vel用途 | 直接驱动底盘 | 仅代表水平面期望速度,需要位置控制器转换 |
| 高度控制 | 地面,Z固定为0 | 独立高度闭环,维持飞行高度(2.5D导航) |
6. 补充说明
这个案例不是真正的全3D导航 ,它只是固定高度,在水平面规划,所以还能继续使用move_base这套2D导航栈。如果是真正3D无人机导航(可以上下绕障碍物),则不能使用move_base,需要
move_base_3d或者专门无人机导航框架(如mavros + mavnav)。
如果你需要,我可以把完整修正后的方案整理成可以直接粘贴进毕业设计/报告的正式版本。