写在最前面的话
为什么做该博客?该博客的特点是什么?
随着DeepSeek、ChatGPT等AI技术的崛起,促使机器人技术发展到了新的高度,诞生了宇树科技、特斯拉为代表的人形机器人,四足机器人等等,越来越多的科技巨头涌入机器人赛道,行业对于相关人才的需求也随之达到了顶峰。本博客的内容是替你阅读所有关于机器人的经典书籍,采用书籍瘦身计划,帮你提炼出核心内容,采用最通俗易懂的语言来解释原理,将书读薄。大大缩短学习时间,助你快速成为机器人时代的佼佼者。


文章目录
一、书籍介绍
《ROS2机器人开发 从入门到实践》是一本从零基础到实战落地的机器人开发指南,通过"基础理论+工具详解+项目实战"的三阶学习路径,带你掌握机器人操作系统ROS2核心架构。书中不仅包含通信机制、URDF建模等必备知识,更有SLAM导航、机械臂控制等12个工业级案例,配合Git代码库和仿真环境配置指南,帮助开发者快速实现从算法仿真到真机部署的完整闭环。无论是学生、工程师还是科研人员,都能通过本书构建系统的ROS2开发能力,抢占机器人技术前沿阵地。
二、第7章 自主导航—让机器人自己动起来(提炼总结)
7.1节 机器人导航介绍(提炼总结)
- 自主导航要解决两个问题:
1、目的地在哪
2、要怎么走
7.1.1节 同步定位与地图构建(提炼总结)
- 利用里程计可以获得机器人的位置信息,利用激光雷达可以获取环境的距离信息,把二者结合,就可以一边移动一边记录障碍物信息
1、启动6.5节的仿真,新建终端输入
rviz2
将Fixed Frame修改为odom,执行add-by topic,添加Odometry和LaserScan两个话题到Displays中,将LaserScan下的Decay Time修改为1000,表示保留过去1000s的雷达数据,把Odometry下的Keep修改为10000,表示保留过去10000个里程计数据
2、使用键盘控制机器人前进一段距离,接着转弯,会发现在前进的过程中,轨迹和障碍物信息都被记录了下来,但在转弯过程中障碍物的信息出现了很大的偏差
如果只是简单的对数据进行叠加,会因为传感器速率同步和噪声等问题导致出现错误,因此,SLAM(Simultaneous Localization and Mapping 同步定位与地图构建)技术就被提了出来,它结合特征提取和滤波等算法,来解决机器人定位与建图的问题
- SLAM通过机器自身的传感器获取环境信息,将这些信息进行处理后记录下来,就可以形成一张地图,根据传感器的不同,可以将SLAM分为激光SLAM和视觉SLAM两种
1、激光SLAM主要使用激光雷达这一类传感器获取环境的深度信息,然后标记障碍物和自由空间进行建图和定位
2、视觉SLAM需要先使用相机等视觉传感器获取图像信息,然后通过图像处理和特征提取来进行建图和定位
7.1.2节 机器人导航(提炼总结)
- 解决地图和定位问题后,需要考虑如何导航的问题。
1、第一步是确认一条从当前位置到目标位置之间的路线,确认路线这一步我们称为全局路径规划。
2、按照全局路线行走时,可能会出现一些障碍物,障碍物时小范围动态的,所以会针对当前小范围,重新创建一张局部的代价地图,然后进行路径规划,确认局部路线这一步骤,称为局部路径规划。
3、有时还需要面对特殊情况,比如行走卡住,此时尝试后退或播放语言等行为,对于这些遇到故障问题时的脱困动作,称为恢复行为
7.2节 使用slam_toolbox完成建图(提炼总结)
- SLAM通过传感器获取环境信息后进行定位和建图,ROS2提供很多SLAM功能包,针对二维激光场景,slam_toolbox开箱即用,接下来使用它构建一张地图
7.2.1节 构建第一张导航地图(提炼总结)
1、安装slam_toolbox,输入如下命令
sudo apt install ros-$ROS_DISTRO-slam-toolbox
2、新建chapt7/chapt7_ws/src目录,将6.5节的fishbot_description功能包复制到src文件夹下,打开终端重新构建功能包,然后启动仿真
3、在chapt7_ws目录下运行如下代码,构建功能包
colcon build
4、在chapt7_ws目录下,添加环境变量
source install/setup.bash
5、在chapt7_ws目录下,运行节点
ros2 launch fishbot_description gazebo_sim.launch.py
6、打开新的终端,输入命令,启动slam_toolbox,进行在线建图
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=True
slam_toolbox输入有两个,第一个是订阅来自雷达的/scan话题,用于获取雷达数据,第二个是获取里程计坐标系odom到机器人坐标系base_footprint之间的变换,这些数据都有时间戳,所以设置了use_sim_time:=True表示使用来自Gazebo的仿真时间,以防止因时间戳造成数据不合法
7、slam_toolbox产生的地图会通过/map话题进行发布,使用rviz订阅话题进行显示
rviz2
修改Fixed Frame为map,执行add-by topic,添加/map和/camera_sensor/image_raw话题
8、打开rqt,使用rqt-tf-tree查看当前tf结构
rqt
可以看到slam_toolbox发布了map到odom之间的坐标转换
9、打开键盘控制节点,控制机器人移动,对整个环境的地图进行记录
ros2 run teleop_twist_keyboard teleop_twist_keyboard
7.2.2节 将地图保存为文件(提炼总结)
1、安装保存地图的工具nav2_map_server,使用如下命令
sudo apt install ros-$ROS_DISTRO-nav2-map-server
2、创建一个导航功能包,将地图放到里面,在chapt7_ws/src/下新建功能包fishbot_navigation2
ros2 pkg create fishbot_navigation2 --build-type ament_cmake --dependencies rclcpp --license Apache-2.0
3、在功能包fishbot_navigation2新建maps目录,打开终端,进入maps目录,运行如下命令保存地图
ros2 run nav2_map_server map_saver_cli -f room
map_saver_cli是nav2_map_server提供保存地图的命令行,-f room表示地图名称为room。map_saver_cli会订阅map话题来获取最新地图,然后生成一张pgm格式的图片和对应的yaml格式的描述文件
pgm格式是一种图片格式,使用系统默认的图像查看器可以打开
- yaml格式用于描述地图的各种信息:
1、image用于描述地图文件的名称
2、mode表示地图的类型,trinary表示地图中的每个像素点有三种可能的状态:障碍物占据状态用黑色表示;无障碍物状态用白色表示;未探索的未知状态用灰色表示
3、resolution表示地图的分辨率,设置为0.05,表示每个像素对应的物理尺寸为0.05m
4、origin表示地图坐标系的原点,单位是米,默认设置在启动建图的位置
5、negate表示是否对地图进行取反操作,0表示不取反
6、occupied_thresh和free_thresh两个参数用于设置占据、自由和未知之间的分界线,如果把像素点的值映射到用0~1之间的数值表示,free_thresh:0.25表示小于0.25就认为该像素对应的位置是自由状态,occupied_thresh:0.65表示大于或等于0.65就认为该像素对应的位置是占据状态,而它们之间的就是未知状态 - 占据格栅地图:地图是基于传感器观测的数据生成的,而传感器是有噪声的,即使再好的传感器也存在误差,所以某个地方是障碍物还是自由空间并不能百分比确定,于是就把整个地图划分成一个个小格子,某个格子被障碍物占据的概率与像素值进行映射,所以称为占据栅格地图