基于ROS2+Gazebo+RViz2的TurbleBot3仿真开发环境搭建
关键词:
-
ROS2:一个用于开发机器人系统的开源框架,提供从通信到硬件抽象等一系列功能,使开发者能够快速构建复杂的机器人应用。
- 通信机制 (Data Distribution Service, DDS):基于DDS的发布/订阅模型,支持多对多通信,自动发现机制,QoS设置。
- 节点 (Nodes):代表系统中的一个功能单元或模块,去中心化架构,生命周期管理。
- 实时性支持:针对实时系统优化,与DDS集成实现高效通信管理和任务调度。
- 安全性 (Security):集成加密通信、认证和授权管理,确保数据通信的安全性。
-
Gazebo:一个用于机器人仿真的3D物理引擎,支持机器人模型的虚拟测试和验证。
- 仿真引擎:负责物理模拟和渲染。
- 插件系统:集成额外的功能,如传感器模拟。
- 世界文件:定义仿真环境。
- 模型文件:定义机器人和其他对象。
-
RViz2:ROS2中的3D可视化工具,用于展示和调试传感器数据和机器人状态。
- 显示面板:展示不同类型的数据。
- 工具:与可视化数据交互。
- 配置文件:定义RViz2的布局和显示设置。
-
TurtleBot3:一个低成本的ROS兼容机器人平台,用于教育和研究,具备硬件和软件的开源设计。
- 硬件:包括机器人底盘、传感器(如激光雷达、摄像头)、计算机等。
- 软件:包括ROS节点、驱动程序、传感器处理算法等。
1 ROS2/Gazebo与Turtlebot3安装
Ubuntu 22.04下de安装:Ubuntu (deb packages) — ROS 2 Documentation: Humble documentation
Ubuntu 22.04下从源码安装:Ubuntu (source) — ROS 2 Documentation: Humble documentation
教程:Tutorials — ROS 2 Documentation: Humble documentation
1.1 准备工作
参考:Ubuntu (Debian 包) — ROS 2 Documentation: Humble 文档。
首先确保已启用 Ubuntu Universe 软件源:
sudo apt install software-properties-common
sudo add-apt-repository universe
然后使用 apt 添加 ROS2 GPG 密钥:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key F42ED6FBAB17C654
接下来将软件源添加到您的源列表中:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
在设置完软件源后,请更新apt存储库缓存。
sudo apt update
ROS2 包是建立在频繁更新的 Ubuntu 系统上的。在安装新的包之前,始终建议确保您的系统是最新的。
sudo apt upgrade
1.2 安装ROS2+Gazebo
安装ROS2 Humble版本:
sudo apt install -y ros-humble-desktop #ROS2桌面版环境 sudo apt install -y ros-humble-gazebo-ros* #Gazebo仿真与ROS集成 sudo apt install -y ros-humble-cartographer #SLAM算法库 sudo apt install -y ros-humble-cartographer-ros #SLAM与ROS集成 sudo apt install -y ros-humble-navigation2 #Navigation2导航栈 sudo apt install -y ros-humble-nav2-bringup #导航启动配置 sudo apt install -y ros-humble-robot-localization #机器人状态估计 sudo apt install -y python3-colcon-common-extensions #构建与测试工具 sudo apt install -y python3-vcstool #依赖管理工具
配置ROS2使用环境:
echo 'source /opt/ros/humble/setup.bash' >> ~/.bashrc source ~/.bashrc
1.3 安装TurtleBot3
在ROS2安装TurtleBot3:
sudo apt install ros-humble-turtlebot3 #TurtleBot3机器人软件包 sudo apt install ros-humble-turtlebot3-simulations #TurtleBot3仿真软件包 sudo apt install ros-humble-turtlebot3-cartographer sudo apt install ros-humble-turtlebot3-navigation2
1.4 启动Gazebo不同环境
在ROS2下使用Gazebo,Humble已经默认安装了gezebo11.0。
设置GAZEBO_MODEL_PATH变量, 指定机器人类型为burger:
echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/tb3_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models' >> ~/.bashrc echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc source ~/.bashrc
TurtleBot3 提供了三种主要的硬件平台,分别是 Burger、Waffle 和 Waffle Pi。
以下是 TurtleBot3 三种硬件平台(Burger、Waffle、Waffle Pi)的简化对比:
1. 相同点
-
核心组件: OpenCR 控制器、LDS-01 激光雷达、IMU、DYNAMIXEL 电机。
-
软件支持: 兼容 ROS/ROS2,支持 SLAM、导航、避障。
-
应用场景: 教育、研究、开发。
2. 不同点
特性 | Burger | Waffle | Waffle Pi |
---|---|---|---|
尺寸 | 小型(圆形) | 中型(方形) | 中型(方形) |
摄像头 | 无 | 可选 | 默认配备 |
适用场景 | 入门级、低成本 | 高级研究、多传感器 | 视觉导航、深度学习 |
扩展性 | 较低 | 较高 | 较高 |
2 TurtleBot3使用
2.1 启动Fake Node
启动Fake Node:
ros2 launch turtlebot3_fake_node turtlebot3_fake_node.launch.py
2.2 启动empty地图、world地图、house地图
新开终端,启动Gazebo,并带有地图:
ros2 launch turtlebot3_gazebo empty_world.launch.py
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
2.3 TurtleBot3遥控、自走避障
TurtleBot3的控制方式:
ros2 run turtlebot3_teleop teleop_keyboard #键盘控制
ros2 run turtlebot3_gazebo turtlebot3_drive #自走避障程序
2.4 RViz2模型显示
利用来显示小车模型步骤:
- 启动Gazebo:
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
- 启动:
ros2 launch turtlebot3_bringup rviz2.launch.py
2.5 TurtleBot3建图
ROS2下实现TurtleBot3建图步骤:
- 新开终端,运行Gazebo:
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
- 新开终端,运行建图:
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
- 新开终端,小车自走避障建图:
ros2 run turtlebot3_gazebo turtlebot3_drive
- 小车随机移动,并进行建图,并查看建立的地图,新开终端,保存地图:
ros2 run nav2_map_server map_saver_cli -f ~/map
2.6 TurtleBot3导航
ROS2下进行导航步骤:
- 修改/opt/ros/humble/share/turtlebot3_navigation2/param/burger.yaml配置文件内容"robot_model_type: "differential" 变为robot_model_type: "nav2_amcl::DifferentialMotionModel" 地图就可正常显示。
- 新开终端,运行Gazebo:
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
- 新开终端,导航:
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=/home/al/map.yaml #需要指定地图的绝对路径,要不地图不能正常加载。
- 点击2D Pose Estimate初始化位姿:
- 点击Nav2 Goal选择目标点进行导航:
- VMware Workstation错误解决:
解决方法:编辑虚拟机设置->硬件->关闭加速3D图形。
3 模块功能、插件、以及模块之间交互
3.1 ROS2 模块
核心功能:作为中间件,负责不同模块之间的通信和协调,提供机器人系统的开发框架和工具。
组件介绍:
- ros-humble-desktop:ROS2 Humble 版本的桌面环境包,包含基本的ROS2工具和库,用于开发和测试ROS应用程序。
-
ros-humble-gazebo-ros* 是ROS2 Humble版本中用于将Gazebo仿真环境与ROS2集成的一系列软件包,包括ros-humble-gazebo-ros2-control、ros-humble-gazebo-ros2-control-demos等,使得 Gazebo 仿真中的机器人模型能够与ROS2进行通信和交互,允许在仿真环境中模拟机器人传感器和执行器的行为,并通过ROS2控制机器人。
-
ros-humble-cartographer是ROS2 Humble版本中集成的Cartographer SLAM算法库,用于机器人同时定位与地图构建,能够在未知环境中创建精确的地图并定位机器人,提供了高效的SLAM功能,适用于各种机器人平台和应用场景。
-
ros-humble-cartographer-ros是ROS2 Humble版本中Cartographer SLAM算法与ROS集成的软件包,使得Cartographer算法能够在ROS2环境中运行,方便开发者利用ROS2的通信和工具进行 SLAM 开发和调试,实现机器人在未知环境中的定位和地图构建.
-
ros-humble-nav2-bringup 是ROS2 Humble 版本中用于快速启动和配置 Navigation2 导航栈的软件包,包含了启动导航功能所需的配置文件和脚本,方便开发者一键启动导航系统,并根据实际需求进行参数调整和功能定制.
-
ros-humble-navigation2 是ROS2 Humble 版本中的导航栈,提供了一整套用于机器人导航的工具和算法,包括全局路径规划、局部路径规划、避障、运动控制等功能,支持机器人在复杂环境中实现自主导航和路径优化.
-
ros-humble-robot-localization 是ROS2Humble 版本中的机器人状态估计包,提供了一种用于估计机器人状态(如位置、速度、姿态等)的方法,结合多种传感器数据(如 IMU、GPS、轮速等)进行融合,通过扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)等算法,为机器人提供准确的定位和姿态估计,支持导航、路径规划和控制等任务。
-
nav2_map_server 是ROS2中的一个功能包,用于管理和提供地图数据服务。它负责加载、保存和发布地图信息,使得其他节点(如 SLAM、导航等)能够访问和使用地图数据。通过提供地图服务接口,nav2_map_server 支持地图的加载、保存、查询等功能,确保地图数据的一致性和可用性,为机器人导航和环境感知提供了基础支持。
-
rclcpp/rclpy 是ROS2的客户端库,分别用于C++和Python编程语言。它们提供了创建ROS2节点、发布和订阅消息、提供和调用服务、执行动作等核心功能的接口和工具,使得开发者能够使用 C++ 或 Python 编写ROS2节点和应用程序,实现机器人系统的通信和功能开发。通过这些客户端库,开发者可以方便地与ROS2系统进行交互,构建复杂的机器人应用。
3.1.1 SLAM算法
SLAM(Simultaneous Localization and Mapping)即同步定位与地图构建,主要用于解决机器人在未知环境中的定位和地图构建问题。它使机器人能够在没有先验地图的情况下,通过传感器数据实时了解自身的位置,并构建出环境的地图,从而实现自主导航和探索。随着 AIGC 的发展,SLAM 开始融入更多的生成式人工智能技术,以提升其在复杂环境中的表现和应用范围。
- 基于激光雷达的 SLAM 算法
- Hector SLAM:采用高斯牛顿法进行帧-图匹配优化,构建栅格地图,适用于雷达帧率高且环境噪声较小的场景。AIGC 可以通过生成更精细的环境模型来辅助其在复杂地形中的建图。
- Gmapping:基于粒子滤波的算法,通过降低粒子数量缓解内存爆炸问题,适用于小场景的建图。AIGC 可以帮助优化粒子滤波过程中的概率模型。
- Karto SLAM:基于图优化的算法,适合大场景的建图,能够较好地处理回环检测。AIGC 可以通过生成更准确的环境特征来增强其回环检测能力。
- Cartographer:利用闭环检测消除累积误差,支持多线雷达,适用于复杂环境中的三维建图。AIGC 可以通过生成更丰富的环境细节来提升其地图精度。
- 基于视觉的 SLAM 算法
- ORB-SLAM3:基于 ORB 特征点进行匹配,结合视觉里程计和后端优化,适用于大规模环境和长时间运行。AIGC 可以通过生成更鲁棒的特征点来提高其在复杂光照条件下的匹配精度。
- VINS-Fusion:基于优化的多传感器状态估计器,适用于视觉-惯性 SLAM。AIGC 可以通过生成更精确的惯性数据来辅助其状态估计。
- 基于多传感器融合的 SLAM 算法
- RTAB-Map:支持丰富的传感器,包括 RGB-D 相机、双目、单线多线雷达、IMU 和 GPS,可以生成 2D 栅格地图和三维点云地图。AIGC 可以通过生成更详细的环境信息来增强其多传感器融合效果。
- FAST-LIO:基于多线激光雷达和 IMU,计算高效且强大,适合室外大规模的建图和导航。AIGC 可以通过生成更准确的环境模型来提升其导航精度。
- 结合 AIGC 的新型 SLAM 算法
- Go-SLAM:这是一个新的框架,它利用 3D 高斯 Splatting SLAM 来重建动态环境,同时在场景表示中嵌入对象级信息。该框架采用先进的对象分割技术,为每个高斯 splat 分配一个唯一的标识符,该标识符对应于它所表示的对象。因此,系统促进了开放词汇查询,允许用户使用自然语言描述来定位对象。
- SL-SLAM:基于深度学习的多功能 SLAM 系统,将 Superpoint 特征点提取模块整合到系统中,并将其作为唯一的表示形式贯穿始终。此外,系统中用 Lightglue 替换了传统的特征匹配方法,显著提高了在复杂环境中的鲁棒性和准确性。
这些 SLAM 算法各有优缺点,适用于不同的应用场景和硬件配置。AIGC 的发展为 SLAM 技术带来了新的机遇,通过生成更精细、更准确的环境信息和特征,可以显著提升 SLAM 系统在复杂环境中的表现和应用范围。开发者可以根据具体的项目需求和硬件条件选择合适的 SLAM 算法进行应用开发,并结合 AIGC 技术进一步优化其性能.
3.2 Gazebo模块
核心功能:提供物理仿真环境,模拟机器人模型的虚拟测试和验证,生成传感器数据并接收控制指令。
组件介绍:
- gazebo_ros_control:提供ROS2控制接口的插件,使得ROS2控制器能够与Gazebo仿真环境中的机器人模型进行交互。
- gazebo_ros_laser:模拟激光雷达数据的插件,用于在Gazebo仿真中生成激光雷达传感器的模拟数据。
- gazebo_ros_camera:模拟摄像头数据的插件,用于在Gazebo仿真中生成摄像头传感器的模拟数据。
- gazebo_ros_imu:模拟 IMU(惯性测量单元)数据的插件,用于在Gazebo仿真中生成IMU传感器的模拟数据。
3.3 RViz2 模块
核心功能:3D 可视化工具,用于展示和调试传感器数据、机器人状态及环境信息,帮助开发者直观地理解和分析机器人行为。
组件介绍:
- rviz_default_plugins:默认可视化插件,提供了RViz2中常用的可视化功能,如显示点云、标记、路径等。
- turtlebot3_rviz:TurtleBot3 的可视化配置文件,用于在RViz2中展示TurtleBot3机器人的传感器数据和状态信息。
3.4 TurtleBot3 Software 模块
核心功能:实现 TurtleBot3 机器人的核心功能,包括 SLAM、导航、控制和避障等,与硬件和ROS2进行交互。
组件介绍:
-
ros-humble-turtlebot3是ROS2 Humble版本中针对TurtleBot3机器人平台的软件包,提供了TurtleBot3机器人的 ROS 节点、驱动程序、传感器处理算法等,使得TurtleBot3机器人能够与ROS2系统无缝集成,支持 SLAM、导航、控制等机器人功能的实现和开发,方便开发者在 TurtleBot3 上进行机器人应用的开发和测试。
-
ros-humble-turtlebot3-simulations 是ROS2 Humble 版本中用于TurtleBot3机器人仿真的软件包,提供了在Gazebo仿真环境中模拟TurtleBot3机器人行为和传感器数据的功能,包括各种仿真场景、机器人模型、传感器插件等,使得开发者能够在仿真环境中进行机器人算法的开发、测试和验证,降低了开发成本和风险,提高了开发效率。
-
ros-humble-turtlebot3-cartographer 是ROS2 Humble 版本中用于在TurtleBot3机器人上集成Cartographer SLAM算法的软件包,使得 TurtleBot3 机器人能够利用 Cartographer 算法进行同时定位与地图构建,支持在未知环境中创建精确的地图并定位机器人,提供了高效的 SLAM 功能,适用于 TurtleBot3 的 SLAM 应用开发和测试。
-
turtlebot3_teleop 是用于远程控制TurtleBot3机器人的软件包,提供了通过键盘或其他输入设备发送控制指令的功能,允许用户实时操控机器人运动,常用于机器人的手动驾驶、调试和测试等场景,方便开发者和用户与机器人进行交互和操作。
-
turtlebot3_gazebo 是用于在Gazebo仿真环境中模拟TurtleBot3机器人行为的软件包,提供了TurtleBot3机器人的仿真模型、传感器插件和仿真场景等,使得开发者能够在仿真环境中对 TurtleBot3 进行各种测试和验证,如 SLAM、导航、避障等算法的开发和调试,降低了开发成本和风险,提高了开发效率。
-
ros-humble-turtlebot3-navigation2 是ROS2Humble 版本中用于在 TurtleBot3 机器人上集成 Navigation2 导航栈的软件包,使得TurtleBot3机器人能够利用Navigation2提供的导航工具和算法,实现自主导航和路径规划功能,支持在复杂环境中进行避障、路径优化等操作,方便开发者在 TurtleBot3 上开发和测试导航应用。
-
turtlebot3_bringup 是用于启动和配置TurtleBot3机器人系统的软件包,提供了启动机器人所需的基本节点和配置文件,包括传感器驱动节点、机器人状态发布节点、参数配置等,使得开发者能够快速启动 TurtleBot3 机器人,并确保机器人系统正常运行和与ROS2环境的兼容,为后续的机器人应用开发和功能实现奠定了基础。
-
turtlebot3_fake_node 是一个模拟TurtleBot3机器人行为的ROS2节点,用于在没有真实硬件的情况下进行开发和测试。它模拟了TurtleBot3的传感器数据和运动控制,生成与真实机器人相似的传感器消息(如激光雷达、IMU等)并响应控制指令,使得开发者可以在仿真环境中测试和验证机器人算法,如 SLAM、导航等,降低了开发成本和风险,提高了开发效率。
3.5 TurtleBot3 Hardware 模块
核心功能:TurtleBot3 机器人的硬件平台,包括主控制器、传感器等组件,负责实际的机器人操作和数据采集。
以下是 TurtleBot3 硬件模块的详细说明,包括模块中的芯片及其运行的操作系统:
- 底盘
- 功能:由多个轻质的塑料部件组成,设计紧凑,尺寸小巧,提供足够的稳定性和灵活性。
- 轮子和轮胎
- 功能:配备两个主动轮和一个万向轮,能够实现前进、后退、转向等基本运动。
- 主控计算模块
- Raspberry Pi 3 Model B
- 芯片:采用四核 1.2 GHz 的 ARM Cortex-A53 处理器。
- 操作系统:通常运行 Raspbian 操作系统,也支持其他基于 Linux 的操作系统。
- 功能:提供强大的计算能力,支持运行 ROS 等操作系统和开发环境。
- Raspberry Pi 3 Model B
- OpenCR 控制板
- 芯片:基于 STM32F407VGT6 Cortex-M4 处理器。
- 操作系统:运行 FreeRTOS 操作系统。
- 功能:用于与 ROS 通信和控制机器人,具有内置的 IMU 传感器,提供精确的运动跟踪能力。
- 传感器
- 激光雷达 (LDS)
- 功能:360° 激光距离传感器,用于环境扫描和避障。
- IMU
- 功能:包含陀螺仪和加速度计,用于测量机器人的姿态和运动。
- 摄像头(仅 Waffle Pi 版本)
- 芯片:使用 Sony IMX219 8 百万像素图像传感器。
- 功能:用于视觉识别。
- 激光雷达 (LDS)
- 电机和执行器
- DYNAMIXEL 电机
- 芯片:内置智能控制芯片,负责电机的精确控制和状态监测。
- 功能:用于驱动机器人的轮子,提供稳定的运动控制。
- DYNAMIXEL 电机
- 电源
- 电池:使用 11.1V 1800mAh 的锂聚合物电池。
- 电源适配器:输入为 100-240V AC,输出为 12V DC。
这些模块和芯片共同构成了 TurtleBot3 的硬件系统,使其能够执行各种机器人任务,如 SLAM、路径规划和自主导航等.
3.6 Development Tools 模块
核心功能:提供支持 TurtleBot3 开发和调试的各种工具,包括代码编辑器、版本控制工具和构建工具等。
组件介绍:
- python3-colcon-common-extensions 是一个 Python 包,为ROS2项目提供了额外的构建和测试工具,扩展了colcon构建工具的功能,使得开发者能够更方便地进行项目的构建、测试和管理,支持多种构建和测试选项,提高了开发效率和项目的可维护性。
-
python3-vcstool 是一个 Python 包,用于管理ROS2项目的依赖关系,支持多种版本控制系统(如 Git、SVN、Mercurial 等),能够方便地获取和更新项目所需的依赖库和工具,简化了项目的依赖管理和配置过程,确保项目依赖的一致性和完整性。
- colcon/ament:ROS2 构建工具,用于构建和管理ROS2项目,支持多种构建和测试功能。
3.7 总结
该架构图清晰地展示了 TurtleBot3 的软硬件开发环境,包括:
- Gazebo ↔ ROS2:
- Gazebo → ROS2: Gazebo 生成的传感器数据(如激光雷达点云、摄像头图像、IMU 数据等)通过gazebo_ros插件发布到ROS2话题上,供ROS2中的其他节点(如 SLAM、导航等)订阅和使用。
- ROS2 → Gazebo:ROS2中的控制器节点通过gazebo_ros_control插件向 Gazebo 发送控制指令,驱动仿真机器人模型运动,实现仿真控制。
- ROS2 ↔ RViz2:
- ROS2 → RViz2:ROS2发布的传感器数据、机器人状态、导航信息等通过 ROS 话题传递给 RViz2,RViz2 订阅这些话题,获取数据并进行可视化展示,帮助开发者直观地了解机器人在环境中的行为和性能。
- RViz2 → ROS2: RViz2 通过交互工具(如 2D Pose Estimate、Nav2 Goal 等)向ROS2发送指令,辅助进行机器人调试和控制,如初始化机器人位姿、设置导航目标等。
- TurtleBot3 Hardware ↔ TurtleBot3 Software:
- TurtleBot3 Hardware → TurtleBot3 Software: TurtleBot3 硬件组件(如 OpenCR 控制器、LDS-01 激光雷达等)采集的传感器数据通过驱动程序传递给 TurtleBot3 Software 中的相应节点,如 SLAM 节点接收激光雷达数据进行地图构建,IMU 节点接收 IMU 数据进行姿态估计等。
- TurtleBot3 Software → TurtleBot3 Hardware: TurtleBot3 Software 中的控制节点根据算法计算出的控制指令,通过驱动程序发送给 TurtleBot3 硬件组件,驱动机器人运动,如差速驱动控制器节点发送速度指令给 OpenCR 控制器,控制机器人前进、后退、转向等。
- TurtleBot3 Software ↔ ROS2:
- TurtleBot3 Software → ROS2: TurtleBot3 Software 中的各个功能模块(如 SLAM、导航、控制等)将计算结果和状态信息发布到ROS2话题上,供ROS2中的其他节点订阅和使用,如 SLAM 节点发布地图数据和机器人位姿信息,导航节点发布路径规划结果等。
- ROS2 → TurtleBot3 Software:ROS2中的其他节点(如遥控节点、外部控制节点等)通过 ROS 话题向 TurtleBot3 Software 中的相应模块发送指令和数据,如遥控节点发送控制指令给控制模块,外部控制节点发送目标点给导航模块等。