Ubuntu 24.04 环境实战:ROS 2 Kilted 实现 SLAM 建图与 Nav2 导航

一、构建地图

1、安装依赖

安装 slam_toolbox 算法库:

bash 复制代码
sudo apt install ros-kilted-slam-toolbox

安装 TurtleBot3 全套支持包

bash 复制代码
sudo apt install ros-kilted-turtlebot3*

2、使用清华源

如果apt安装很慢,请先配置清华源:

bash 复制代码
sudo apt install curl gnupg2
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update

3、环境变量(必须)

bash 复制代码
sudo vim ~/.bashrc
bash 复制代码
export TURTLEBOT3_MODEL=burger
export GAZEBO_MODEL_PATH=/opt/ros/kilted/share/turtlebot3_gazebo/models
# 可选,硬件加速
export LIBGL_ALWAYS_SOFTWARE=0
bash 复制代码
source ~/.bashrc

4、更新防火墙(可选)

打开一个终端:

bash 复制代码
ros2 multicast receive

打开另一个终端:

bash 复制代码
ros2 multicast send

如果没有 receive Hello World 消息,则需要更新防火墙:

bash 复制代码
sudo ufw allow in proto udp to 224.0.0.0/4
sudo ufw allow in proto udp from 224.0.0.0/4

5、启动仿真

查看可用的 launch 文件:

bash 复制代码
ls /opt/ros/kilted/share/turtlebot3_gazebo/launch/
复制代码
empty_world.launch.py            spawn_turtlebot3.launch.py       turtlebot3_dqn_stage2.launch.py  turtlebot3_dqn_stage4.launch.py  turtlebot3_world.launch.py
robot_state_publisher.launch.py  turtlebot3_dqn_stage1.launch.py  turtlebot3_dqn_stage3.launch.py  turtlebot3_house.launch.py
bash 复制代码
source /opt/ros/kilted/setup.bash
# 空场景
ros2 launch turtlebot3_gazebo empty_world.launch.py
# world 场景
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
# house 场景
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

注意需要配置小车模型环境变量才会有小车:

bash 复制代码
# burger
export TURTLEBOT3_MODEL=burger
# waffle_pi(本文使用的小车)
export TURTLEBOT3_MODEL=waffle_pi

仿真启动后创建了以下节点:

复制代码
/robot_state_publisher
/ros_gz_bridge

仿真启动后创建了以下话题:

复制代码
/clock
/cmd_vel
/imu
/joint_states
/odom
/parameter_events
/robot_description
/rosout
/scan
/tf
/tf_static

6、运行建图

bash 复制代码
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=True

7、RViz可视化

bash 复制代码
ros2 run rviz2 rviz2

在RViz中进行设置

  • Fixed Frame:设置为map
  • 添加:Map(话题/map)、LaserScan(话题/scan)、TF

注意,需要在仿真启动时添加小车,才能扫描到地图:

8、控制机器人移动

bash 复制代码
# 键盘控制
ros2 run turtlebot3_teleop teleop_keyboard

手动控制机器人走完一圈地图:

9、地图保存

bash 复制代码
ros2 run nav2_map_server map_saver_cli
复制代码
image: map_1774097735.pgm
mode: trinary
resolution: 0.050
origin: [-0.938, -2.073, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

二、自主导航

使用 Nav2 导航:

bash 复制代码
sudo apt install ros-kilted-navigation2
sudo apt install ros-kilted-nav2-bringup

1、启动仿真

bash 复制代码
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

2、启动导航

bash 复制代码
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=/home/sam/map_1774097735.yaml

4、设定机器人位置

在 RViz 工具栏选择 2D Pose Estimate 工具,在地图上点击机器人所在位置,拖动鼠标设定朝向。

4、设定目标位置

在 RViz 工具栏选择 Nav2 Goal 工具,在地图上点击机器人所在位置,拖动鼠标设定朝向。

5、导航结果

只需要设置好机器人位置与目标位置,机器人就会自主导航到目标位置:

三、补充:SALM 介绍

SLAM建图 是机器人学和计算机视觉中的核心问题。SLAM是同步定位与地图构建的缩写。

简单来说,SLAM要解决的是:当一个移动机器人(或设备)进入一个完全未知的环境时,它如何一边确定自己"在哪里"(定位),一边绘制出周围环境的"地图"(建图)

这两个问题相互依赖,形成一个闭环:要精确建图,需要准确的定位;而要准确定位,又需要一个精确的地图。SLAM算法就是为了同时解开这个"先有鸡还是先有蛋"的难题。

1、SLAM的核心流程

一个典型的SLAM系统通常包含以下几个步骤:

  1. 传感器数据读取:从相机、激光雷达、惯性测量单元等传感器获取原始数据。
  2. 前端里程计 :通过对比相邻时刻的传感器数据(如图像特征点、激光点云),估算机器人的相对运动(位姿变化)。这一步也叫前端,容易产生累积误差。
  3. 后端优化 :接收前端估算的位姿和回环检测信息,通过图优化或滤波等方法,对全局的轨迹和地图进行修正,消除累积误差。这一步也叫后端
  4. 回环检测:判断机器人是否回到了之前到过的位置。一旦检测成功,就能建立一个强约束,大幅修正累积误差,保证地图的全局一致性。
  5. 建图:根据优化后的位姿,将传感器数据融合成不同用途的地图(如栅格地图、点云地图、拓扑地图等)。

2、SLAM的主要分类

根据使用的核心传感器不同,SLAM主要分为两大类:

2.1、激光SLAM

这是早期最成熟、应用最广泛的SLAM技术,主要使用2D或3D激光雷达。

  • 原理:利用激光雷达测距精度高、角度分辨率高的特点,通过匹配不同时刻的激光点云数据(如ICP算法)来估计运动。
  • 优点精度高、速度快、稳定性好,计算量相对较小,地图(栅格地图)直观且便于导航规划。在室内服务机器人、扫地机器人、工业AGV等领域应用广泛。
  • 缺点:缺乏语义信息,在长直走廊或环境特征稀疏的场景下容易"走丢"(退化场景)。3D激光雷达成本较高。

代表性算法:Gmapping、Hector-SLAM、Karto-SLAM、Cartographer(谷歌开源,支持2D和3D)。

2.2、视觉SLAM

视觉SLAM主要使用单目、双目或深度相机(RGB-D)作为传感器。

  • 原理 :模拟人类视觉,从图像中提取特征点(如ORB特征),通过特征点的匹配和三角测量来估算运动。单目 相机存在尺度不确定性,双目RGB-D可直接获取深度信息。
  • 优点传感器成本低、体积小 ,能获取丰富的纹理、颜色和语义信息(能识别出"这是一把椅子"而非一个障碍物),便于物体识别和场景理解。
  • 缺点对环境光照敏感(过暗或过亮会失效),计算量大,依赖纹理特征(纯白墙壁容易失败),深度信息精度通常不如激光雷达。

代表性算法:ORB-SLAM系列(功能全面,支持单目、双目、RGB-D)、MonoSLAM(早期经典)、LSD-SLAM(半稠密)、SVO(半直接法)。

2.3、多传感器融合SLAM

近年来,单一的传感器难以应对所有复杂场景,多传感器融合成为主流趋势。

  • 常见组合激光雷达 + 惯性测量单元 (LIO-SAM)、视觉 + 惯性测量单元 (VINS-Fusion,视觉惯性系统)、激光雷达 + 视觉 + 惯性测量单元。惯性测量单元能提供高频的运动先验,在传感器数据短暂失效时起重要作用,显著提升系统的鲁棒性。

3、SLAM地图的类型

SLAM构建的"地图"并非单一的图片,根据用途不同,有多种表现形式:

  • 栅格地图 :将环境离散成网格,每个网格标明是"空闲"、"占用"还是"未知"。最常用于导航,如扫地机器人。
  • 点云地图 :由海量的三维点构成,直观但体积大,不能直接用于导航,常用于展示、后期处理路径规划
  • 拓扑地图 :将环境抽象为"节点"(如房间、路口)和"边"(连接路径),强调连通性,常用于高层次路径规划
  • 语义地图 :在几何地图的基础上增加"标签"(如门、桌子、行人),让机器理解环境,是迈向高级智能的关键。

4、技术挑战与发展趋势

尽管SLAM技术已经非常成熟,但在实际应用中仍面临一些挑战:

  1. 动态环境:场景中存在大量移动物体(人、车),传统算法假设环境静态,动态物体会导致建图出现"鬼影"或定位漂移。
  2. 长期运行:随时间推移,环境变化(光照、季节、物体摆放),如何实现长期稳定的重定位和地图更新是一个难题。
  3. 大尺度场景:在超大范围(如整个城市)运行时,地图存储、计算效率和回环检测的实时性面临巨大挑战。
  4. 与深度学习的结合:利用深度学习提取更鲁棒的特征点、进行动态物体剔除、直接生成语义地图,是当前研究和应用的热点方向。

5、SALM 总结

特性 激光SLAM 视觉SLAM
传感器 激光雷达 单目/双目/RGB-D相机
优点 精度高、稳定、速度快、地图直观 成本低、信息丰富、可识别语义
缺点 成本较高、缺乏语义、有退化场景 易受光照影响、依赖纹理、计算量大
地图形式 栅格地图、点云 稀疏/半稠密/稠密点云、网格
典型应用 扫地机器人、AGV、自动驾驶 AR/VR、无人机、室内服务机器人

总的来说 ,SLAM是机器人实现自主移动的基石技术。在实际落地项目中,多传感器融合已成为主流,通过取长补短,让机器人在各种复杂环境下都能稳定地"知道自己在哪,并知道周围长什么样"。如果你有具体的应用场景(如想做扫地机器人、自动驾驶、AR设备),我可以为你推荐更合适的技术路线和开源方案。

四、补充:Turtlebot3

TurtleBot3 是韩国ROBOTIS公司开发的新一代开源移动机器人平台,也是ROS(机器人操作系统)官方指定的教育科研平台。它继承了前代产品TurtleBot1和2的核心功能,但在体积、成本和模块化方面做了重大改进,是目前全球最受欢迎的ROS入门机器人之一。

1、定位与特点

TurtleBot3被设计为一款小巧、低价、完全可定制的ROS机器人平台,主要用于机器人教育、学术研究和产品原型开发。它的核心特点包括:

特点 说明
体积超小 Burger型号尺寸仅为138mm×178mm×192mm,约是前代产品的1/4大小,可轻松放入背包携带
低成本 相比前代产品大幅降低价格,是市面上最经济的、配备360°激光雷达的SLAM移动机器人之一
完全开源 硬件(电路图、PCB、3D CAD)、固件和软件全部开源,用户可自由下载、修改和分享
模块化设计 采用DYNAMIXEL智能舵机作为驱动轮,易于组装、维护和更换;结构可按需扩展
ROS官方支持 由Open Robotics管理品牌,与ROS生态系统无缝集成,软件资源丰富

2、两个主要型号

TurtleBot3目前提供两个核心型号,分别面向不同应用需求:

规格项目 Burger(汉堡) Waffle Pi(华夫派)
定位 入门级、紧凑型 高性能、扩展型
最大平移速度 0.22 m/s 0.26 m/s
最大旋转速度 2.84 rad/s (162.72 deg/s) 1.82 rad/s (104.27 deg/s)
最大负载 15kg 30kg
尺寸(长×宽×高) 138×178×192 mm 281×306×141 mm
重量 约1kg 约1.8kg
续航时间 约2小时30分 约2小时
主控单板机(SBC) Raspberry Pi 4(兼容Jetson Nano) Raspberry Pi 4(兼容Jetson Nano)
微控制器(MCU) OpenCR1.0(32-bit ARM Cortex-M7) OpenCR1.0(32-bit ARM Cortex-M7)
驱动舵机 DYNAMIXEL XL430-W250-T DYNAMIXEL XM430-W210-T
传感器 360°激光雷达(LDS-02) + 9轴IMU 360°激光雷达(LDS-02) + 9轴IMU + 树莓派相机
遥控器 RC-100B蓝牙遥控器(选配)

简单来说:Burger 是性价比极高的入门选择,适合学习SLAM、导航等基础ROS功能;Waffle Pi 增加了相机和更强的舵机,适合开展视觉处理、物体识别、自动驾驶等更复杂的研究。

3、核心硬件组成

TurtleBot3的硬件体系结构清晰,主要包含以下几个核心部分:

  1. 主控单板机(SBC):通常为Raspberry Pi 4(也可换成Jetson Nano),运行完整的ROS系统,负责高层计算(SLAM、导航、视觉处理等)。

  2. 微控制器(MCU):名为OpenCR1.0的开源控制板,负责底层实时控制,如读取传感器、驱动舵机、处理电机编码器等。板载9轴IMU(惯性测量单元)提供姿态信息。

  3. 执行器:两个DYNAMIXEL智能舵机直接驱动左右轮,实现差速转向。这种舵机可反馈位置、速度、电流等信息,控制精度高。

  4. 核心传感器

    • 360°激光雷达(LDS-02):测距范围120mm~3500mm,角度分辨率1°,是SLAM建图和导航的核心传感器。
    • 9轴IMU:包含三轴陀螺仪、三轴加速度计、三轴磁力计,辅助定位和姿态估计。
    • 相机(仅Waffle Pi):800万像素树莓派Camera Module v2.1,用于视觉感知任务。
  5. 能源:11.1V 1800mAh锂电池,续航约2~2.5小时。

4、软件与生态系统

TurtleBot3的强大不仅在于硬件,更在于其背后完整的软件生态:

  • ROS支持:同时支持ROS1(Melodic、Noetic)和ROS2(Foxy、Galactic、Humble、Jazzy等),官方提供完整的驱动包和示例程序。
  • 核心功能 :开箱即用地支持SLAM建图 (Gmapping、Cartographer)、自主导航 (Navigation Stack / Nav2)、自动泊车视觉跟随等功能。
  • 仿真支持:提供完整的Gazebo仿真模型,可在纯软件环境中开发和测试算法。
  • 应用扩展:社区和官方提供了丰富的应用案例,如多机器人编队、YOLO物体检测、ArUco标记追踪、家庭监控等。
  • 教学资源:配套有《ROS机器人编程》等官方教材,适合课程教学。

5、适用场景

基于其特点,TurtleBot3主要应用于:

  • ROS教学与入门:作为官方指定平台,拥有最丰富的教程和社区支持,是学习ROS的最佳硬件。
  • SLAM与导航算法研究:低成本验证激光/视觉SLAM、路径规划、自主避障等算法。
  • 机器人视觉应用:Waffle Pi型号可用于物体识别、目标跟踪、自动驾驶(AutoRace)等研究。
  • 多机器人协作:多个TurtleBot3可组成编队,进行协同控制、队形保持等实验。
  • 快速原型验证:在投入昂贵的定制机器人之前,用TurtleBot3快速验证算法或系统方案的可行性。

6、与其他版本的对比

TurtleBot系列目前有多个版本:

版本 特点
TurtleBot1 2010年发布,基于iRobot Roomba底盘,历史意义重大
TurtleBot2 2012年发布,基于Yujin Robot的Kobuki底盘,功能更完善
TurtleBot3 2017年发布,模块化、小型化、低成本,是当前主流
TurtleBot4 由ClearPath Robotics开发,基于iRobot Create3底盘,功能更强但模块化程度不如TB3

目前,TurtleBot3凭借其极佳的性价比、强大的开源生态和灵活的扩展性,仍是ROS学习和轻量级机器人研究的最佳选择之一

五、补充:Nav2 导航

Nav2 是 ROS 2 社区官方推出的专业级移动机器人自主导航框架,全称 Navigation2。作为 ROS 1 中经典导航栈 (Navigation Stack) 的继任者,Nav2 继承了其 15 年的技术积累,并针对 ROS 2 的架构特性进行了全新设计,旨在帮助移动机器人在复杂环境中安全、可靠地从 A 点移动到 B 点。

Nav2 的核心流程与 SLAM 紧密配合,如下图所示:
精确位姿
初始全局路径
里程计数据
路径执行状态反馈
异常/完成
传感器数据

激光雷达/相机/IMU
定位模块 AMCL

估计机器人在已知地图中的位置
地图服务器 Map Server

提供先验地图或SLAM实时构建的地图
全局规划器 Global Planner

(规划器服务器 Planner Server)

基于静态地图规划全局路径
局部规划器 Local Planner

(控制器服务器 Controller Server)

结合动态障碍物生成实时控制指令
速度指令

cmd_vel
机器人底盘

执行运动
行为树 BT Navigator

编排与监控导航任务
恢复行为 Recovery Server

处理卡困、避障失败等异常

简单来说,SLAM 是帮助机器人在陌生环境中回答"我在哪里?周围长什么样?"并建立地图的过程,而 Nav2 则是在已知地图(SLAM 建好的地图)的基础上,负责回答"我该如何到达那里?路上遇到障碍怎么办?"的问题,两者相辅相成。

1、Nav2 的核心架构与组件

Nav2 采用了一种高度模块化的服务器架构。它将导航任务拆分成多个独立的功能服务器,这些服务器通过行为树 (Behavior Tree, BT) 进行灵活编排与调度。这种设计的核心优势在于,我们可以像"搭乐高"一样,根据具体的机器人类型和应用场景,轻松替换或定制其中的算法。

其核心组件包括:

  • 规划器服务器 (Planner Server) :负责全局路径规划 。它使用预先构建好的静态地图(通常来自SLAM),在宏观层面规划出一条从起点到目标点、能避开已知固定障碍物的最优路径。常用的算法有 A * 和 Dijkstra

  • 控制器服务器 (Controller Server) :负责局部路径规划与运动控制 。它接收全局路径,并实时结合传感器(如激光雷达)探测到的动态障碍物信息,计算出机器人每一步的速度和角速度指令 (cmd_vel),确保机器人既能跟随全局路径,又能安全避障。常用算法包括 DWA (动态窗口法)TEB (时间弹性带)

  • 定位模块 (AMCL) :负责机器人定位 。在已知地图中,AMCL (自适应蒙特卡洛定位) 通过结合传感器数据和里程计数据,不断推算并修正机器人在当前地图中的精确位置。一个精确的定位是导航能够成功执行的前提。

  • 行为树导航器 (BT Navigator):这是 Nav2 的**"总指挥"**。它使用行为树来定义复杂的机器人行为,例如一个标准的"到点导航"行为树就包含了"规划路径 -> 执行路径 -> 成功/失败 -> 若失败则尝试恢复行为 -> 再次规划"等多个节点。行为树让导航逻辑更加清晰、可控且易于调试。

  • 恢复服务器 (Recovery Server) :负责异常处理。当导航遇到问题(如规划失败、长时间无法到达目标点)时,恢复服务器会启动一系列恢复行为,例如原地旋转 (Spin)、后退 (Backup)、清除代价地图 (Clear Costmap) 等,以帮助机器人摆脱困境。

  • 代价地图 (Costmap 2D):Nav2 感知世界的核心。它将传感器数据(激光点云、深度图)转化为一张栅格地图,每个格子都赋予一个"代价"值,代表该位置被占据的风险。Nav2 维护着两张代价地图:

    • 全局代价地图 (Global Costmap):基于静态地图生成,用于全局规划。
    • 局部代价地图 (Local Costmap):以机器人为中心,实时更新,用于局部避障。

2、核心优势与技术特点

  • 生产级质量与高度可扩展:Nav2 被全球超过 100 家公司用于实际产品中,拥有高自动化测试覆盖率,代码稳定可靠。其插件化架构允许开发者轻松集成自己定制的规划、控制或感知算法。

  • 支持广泛的机器人类型 :不仅支持传统的差速驱动全向驱动 机器人,也支持阿克曼底盘 (如汽车)和腿足式机器人

  • 高级应用功能 :除了基础导航,Nav2 还内置了自动充电对接 (Auto-Docking)循迹 (Waypoint Following)碰撞监控等高级功能,满足实际产品需求。

  • 行为树编排:相比 ROS 1 导航栈僵化的状态机,Nav2 的行为树模型让开发者可以像编写流程图一样设计机器人复杂的任务逻辑,例如"送餐到指定点 -> 播放语音 -> 等待用户取餐 -> 返回充电桩"。

3、与 TurtleBot3 的结合

回到之前的 TurtleBot3 ,它正是学习和运行 Nav2 的最佳入门平台。官方提供了完整的 Nav2 演示包,我们可以非常轻松地在 TurtleBot3 上体验完整的导航功能。流程通常如下:

  1. 建图:使用 SLAM 工具(如 Cartographer)控制 TurtleBot3 在未知环境中移动,构建出环境的地图。
  2. 保存地图:将建好的地图保存下来。
  3. 启动 Nav2:运行 Nav2 的启动文件,加载刚才保存的地图,并启动定位、规划和控制等所有服务器。
  4. 设置目标点:在 RViz 可视化工具中,用 2D Nav Goal 工具在地图上点击一个目标点。Nav2 便会接管机器人,自动规划路径并驱动机器人前往指定地点,同时实时避障。

总的来说,Nav2 是一个功能强大、架构先进且高度灵活的导航系统,它几乎成为了 ROS 2 机器人导航的事实标准。

参考资料

相关推荐
淮北4944 小时前
bash下好用的快捷键以及linux常用指令
linux·开发语言·ubuntu·bash
正点原子7 小时前
瑞芯微工业级芯加持,正点原子RK3562J开发板/核心板解锁嵌入式开发新可能!
linux·ubuntu·嵌入式
子木HAPPY阳VIP8 小时前
Ubuntu 22.04 换源+Docker安装+镜像加速
linux·ubuntu·docker
xyzhan9 小时前
使用Delphi开发混凝土生产车间自动化过程控制系统的仿真系统
运维·物联网·自动化·delphi·仿真·混凝土车间
浅念-9 小时前
Linux 基础命令与核心知识点
linux·数据结构·c++·经验分享·笔记·算法·ubuntu
终端鹿9 小时前
Vue3 + TypeScript 大型项目状态管理:Pinia 类型安全最佳实践
安全·ubuntu·typescript
有毒的教程10 小时前
Ubuntu 安装完成后网络配置教程
linux·网络·ubuntu
qq_1728055911 小时前
wsl ubuntu层开放22端口,主机windows层开放2222端口转发
linux·windows·ubuntu·wsl
新时代牛马11 小时前
Windows SSH 免密码登录 Ubuntu
运维·ubuntu·ssh