今天开始学习机器人导航模块
关键技术:
1.全局地图(全局概览图:定位+路径规划)
2.自身定位(确定在地图中的位置)
3.路径规划(全局路径规划+局部路径规划)
4.运动控制(控制前进速度方向)
5.环境感知(感知周围环境)
SLAM:即时定位与地图构建,机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和地图进行自身定位,同时在自身定位的基础上建造增量式地图,以绘制出外部环境的完全地图,SLAM只是实现地图构建和及时定位
里程计定位:
优点:里程计定位信息是连续的,没有离散的跳跃
缺点:里程计存在累计误差,不利于长距离或长期定位
会产生误差:路面不平、测速不准、车轮打滑、长距离、长时间运行会导致误差累积
传感器定位:
优点:比里程计定位更精确
缺点:传感器定位会出现跳变的情况,且传感器定位在标志物较少的环境下,精度会大打折扣
gmapping是ROS开源社区中较为常见且比较成熟的SLAM算法之一,gmapping可以根据移动机器人里程计数据和激光雷达数据来绘制二维的栅格地图
#声明地图图片资源的路径 image: /home/fan20/demo05_ws/src/nav_demo/map/nav.pgm #地图刻度尺单位是 米每像素 resolution: 0.050000 #地图的位姿信息(按照右手坐标系地图右下角相对于rviz中的原点信息) #值1:x方向上的偏移量 #值2:y方向上的偏移量 #值3:地图的偏航角度(弧度) origin: [-50.000000, -50.000000, 0.000000] #是否取反 negate: 0 #地图中的障碍物判断 #判断规则:白色是可通行区 黑色是障碍物 蓝灰色是未知区域 #地图中的每个象素都有取值[0,255] 白色:255 黑色:0 像素值设为x #根据像素值计算比例 p=(255-x)/255 白色0 黑色1 #判断是否是障碍物 p>占用阈值 就是障碍物 小于就视为无物,可以自由通行 #占用阈值 occupied_thresh: 0.65 #空闲阈值 free_thresh: 0.196amcl适用于2D移动机器人的概率定位系统,实现了自适应蒙特卡洛定位的方法,根据已有的地图使用粒子滤波器推算机器人位置
| 对比项 | base_link | base_footprint |
|---|---|---|
| 实体属性 | 真实机身刚体(URDF 存在该 link) | 纯虚拟坐标系,无物理部件 |
| Z 轴高度 | 离地有高度(正数,底盘离地间隙) | Z=0,完全贴合地面 |
| 旋转 / 姿态 | 车身真实倾斜(上坡、颠簸会俯仰滚转) | 永远平行地面,抵消车身离地高度 |
| TF 关系 | 父系通常为 map/odom;子系是雷达、相机、轮子 | 父系 base_link,只有垂直平移 TF(无旋转) |
| 使用场景 | 传感器数据、机器人三维模型、机械臂、里程计计算 | 导航路径规划、代价地图、运动控制、避障 |
amcl定位
joint_state_publisher + robot_state_publisher 作用详解
1. 两个节点分工
joint_state_publisher
- 功能:发布/joint_states话题
- 内容:机器人所有关节(轮子、机械臂活动关节)的角度数据
- 场景:
- 无硬件真实关节时,提供默认 0 角度关节数据
- 可视化 URDF 模型必须依赖这个话题,否则 RViz 机器人模型不显示、模型散架
- 如果你是差分轮小车:左右驱动轮、万向轮都会生成关节数据
robot_state_publisher
- 核心功能:接收
/joint_states+ URDF 机器人模型,实时计算、发布全部 TF 坐标变换 - 输出 TF:
- base_link ↔ wheel_left / wheel_right
- base_link ↔ laser / camera / imu
- base_link ↔ base_footprint(如果 URDF 配置了)
- 导航 / AMCL 刚需:AMCL、map_server、move_base 全程依赖 TF 树获取机器人底盘、雷达坐标关系,没有 TF 直接报错、定位失效
2. 为什么跑 AMCL 导航必须同时启动二者?
① RViz 可视化前提
不启动:RViz 添加 RobotModel 插件后一片空白,看不到小车模型,无法直观观察定位、雷达点云匹配地图。
② AMCL 定位依赖雷达 TF 变换
AMCL 需要知道:激光雷达相对于底盘 base_link 的坐标(TF),才能把激光点云匹配到地图上做粒子滤波定位。 robot_state_publisher 负责解析 URDF 生成雷达→底盘 TF,缺失则:
- RViz 激光点云飘飞
- AMCL 无法计算激光与地图匹配,定位直接失效
③ 完整 TF 树是导航基础
后续建图、代价地图、路径规划全部依靠 TF 坐标系。缺少这两个节点,TF 树断裂,所有导航功能瘫痪。
补充区分
- joint_state_publisher:只发关节角度(原始数据)
- robot_state_publisher:根据关节角度 + URDF 模型算出全部坐标变换 TF(导航核心)
代价地图是导航包(move_base/nav2)基于栅格地图生成的带危险权值的二维栅格图层。 原始静态地图只有「占用 / 空闲」两种状态;代价地图给每一个格子分配代价值,代表靠近该格子的危险程度,规划器根据代价选择安全路线。
代价地图的组成(多层叠加):
1、静态层 ---SLAM绘制的静态地图
2、障碍物层---导航中传感器感知的障碍物
3、膨胀层--为了避免膨胀而设计的安全区
4、自定义层--根据业务自设计的地图数据
自主导航
全局路径(绿色)/本地路径(红色)