在 TurtleBot3 上实现同步建图与导航(在线 SLAM)

系统架构

通过同时运行gmapping(建图)和move_base(导航)来实现,但需要注意两者之间的协调,特别是地图的更新和共享。

步骤概述:

  1. 修改gmapping_demo.launch文件,使其发布的地图话题与导航使用的地图话题一致,并调整参数以适应动态地图。

  2. 修改navigation.launch文件(或创建一个新的融合launch文件),使其同时启动gmapping和move_base,并确保地图服务器使用gmapping实时发布的地图。

  3. 注意:在导航中使用动态地图时,需要配置move_base以订阅实时更新的地图。

[Gazebo仿真环境]
     |
     v
[gmapping SLAM节点] <---> [move_base导航节点]
     | 发布动态地图          | 使用动态地图
     v                     v
[map_server动态地图服务]   [全局/局部路径规划]
     |
     v
[RViz可视化]

1. launch启动文件

<launch>
  <!-- TurtleBot3 型号设置 -->
  <arg name="model" default="waffle_pi" doc="model type [burger, waffle, waffle_pi]"/>
  
  <!-- Gazebo 仿真环境 -->
  <include file="$(find turtlebot3_gazebo)/launch/turtlebot3_house.launch">
    <arg name="model" value="$(arg model)" />
  </include>
  
  <!-- 融合的SLAM和导航节点 -->
  <include file="$(find nav)/launch/turtlebot3_gmapping.launch" />
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" />
  
  <node pkg="rviz" type="rviz" name="rviz" required="true"
        args="-d $(find nav)/rviz/online_slam.rviz"/>
</launch>

2. 新建地图配置文件

dynamic_map.yaml

# 动态地图配置
image: dynamic_map.pgm
resolution: 0.05
origin: [0.0, 0.0, 0.0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

3. 修改建图参数

<include file="$(find nav)/launch/turtlebot3_gmapping.launch">
    <arg name="model" value="$(arg model)"/>
    <param name="map_update_interval" value="1.0"/> 
    <param name="delta" value="0.05"/>
</include>
# 各参数含义
<param name="map_update_interval" value="0.5"/>  <!-- 降低地图更新间隔 -->
<param name="linearUpdate" value="0.1"/>         <!-- 线性运动阈值触发更新 -->
<param name="angularUpdate" value="0.1"/>        <!-- 角度运动阈值触发更新 -->
<param name="temporalUpdate" value="0.5"/>       <!-- 时间阈值触发更新 -->
<param name="particles" value="80"/>             <!-- 减少粒子数以提高性能 -->

4. 修改导航参数

  <!-- 导航节点 -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
    
    <rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find nav)/param/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav)/param/move_base_params.yaml" command="load" />
    <rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
    
    <param name="global_costmap/global_frame" value="map"/>
    <param name="global_costmap/robot_base_frame" value="base_footprint"/>
    <param name="global_costmap/laser_scan_sensor/sensor_frame" value="base_scan"/>
    <param name="global_costmap/laser_scan_sensor/topic" value="scan"/>
    <param name="global_costmap/laser_scan_sensor/data_type" value="LaserScan"/>
    <param name="global_costmap/static_map" value="false" />
    <param name="global_costmap/rolling_window" value="true"/>
    <param name="global_costmap/width" value="10.0" />
    <param name="global_costmap/height" value="10.0" />
    <param name="global_costmap/resolution" value="0.05"/>
    <param name="global_costmap/map_topic" value="/dynamic_map"/>
    
    <param name="local_costmap/global_frame" value="odom"/>
    <param name="local_costmap/robot_base_frame" value="base_footprint"/>
    <param name="local_costmap/laser_scan_sensor/sensor_frame" value="base_scan"/>
    <param name="local_costmap/laser_scan_sensor/topic" value="scan"/>
    <param name="local_costmap/laser_scan_sensor/data_type" value="LaserScan"/>
    <param name="local_costmap/update_frequency" value="10.0"/>
    <param name="local_costmap/publish_frequency" value="5.0"/>
    <param name="local_costmap/static_map" value="false"/>
    <param name="local_costmap/rolling_window" value="true"/>
    <param name="local_costmap/width" value="3.0"/>
    <param name="local_costmap/height" value="3.0"/>
    
    <param name="planner_frequency" value="1.0"/>
    <param name="controller_frequency" value="5.0"/>
    <param name="controller_patience" value="3.0"/>
    <param name="conservative_reset_dist" value="1.0"/>
    <arg name="model" value="$(arg model)" />
  </node>

5. 地图更新

  <!-- 动态地图服务器 -->
  <node pkg="map_server" type="map_server" name="dynamic_map_server" args="/home/suo/catkin_ws/src/maps/dynamic_map.yaml">
    <param name="frame_id" value="map"/>
    <remap from="map" to="dynamic_map"/>
    <remap from="map_metadata" to="dynamic_map_metadata"/>
  </node>

6. 增加机器人本体坐标系变换

  <node pkg="tf" type="static_transform_publisher" name="base_footprint_to_base_link"
        args="0.0 0.0 0.0 0.0 0.0 0.0 base_footprint base_link 100"/>
  <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser_scan"
        args="0.0 0.0 0.0 0.0 0.0 0.0 base_link base_scan 100"/>
  <node pkg="tf" type="static_transform_publisher" name="base_link_to_imu_link"
        args="0.0 0.0 0.0 0.0 0.0 0.0 base_link imu_link 100"/>
  <node pkg="tf" type="static_transform_publisher" name="base_link_to_wheel_right_link"
        args="0.0 0.0 0.0 0.0 0.0 0.0 base_link wheel_right_link 100"/>
  <node pkg="tf" type="static_transform_publisher" name="base_link_to_wheel_left_link"
        args="0.0 0.0 0.0 0.0 0.0 0.0 base_link wheel_left_link 100"/>

7. 编译项目包

# 修改编译配置文件(CMakelists.txt)
install(DIRECTORY scripts launch param rviz
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
cd ~/catkin_ws
catkin_make_isolated --install --pkg nav

在这里插入图片描述

8. RViz 配置 (online_slam_nav.rviz)

在 RViz 中添加以下显示项:

  • Map: 订阅 /dynamic_map 话题,显示实时更新的地图
  • LaserScan: 订阅 /scan 话题
  • RobotModel: 显示机器人模型
  • Path: 订阅 /move_base/NavfnROS/plan 全局路径
  • Path: 订阅 /move_base/DWAPlannerROS/local_plan 局部路径
  • PoseArray: 订阅 /particlecloud 显示 gmapping 粒子
  • TF: 显示坐标变换

9. 运行

  • 启动融合系统:
# 启动
roslaunch nav online_slam.launch
#  启动键盘控制(保持终端激活)
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
# 保存地图
rosrun map_server map_saver -f ./maps/tmp_dynamic_map

在这里插入图片描述

  • 地图更新优化
# 在gmapping参数中添加
<param name="maxRange" value="5.0"/>  <!-- 限制最大范围减少计算量 -->
<param name="minimumScore" value="100"/> <!-- 提高匹配质量阈值 -->
<param name="ogain" value="1.5"/>     <!-- 优化高斯增益 -->

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 使用ROS2和TurtleBot3实车进行地 对于使用ROS2和TurtleBot3实现实车的地,过程涉及多个方面,包括但不限于准备硬件连接、配置软件环境以及执行特定的命令来启动必要的节点和服务。 #### 准备工作 确保物理机器人已正确组装并连接到计算机上。这通常意味着安装好所有传感器(如激光测距仪),并且这些设备能够被主机识别。此外,还需确认网络设置允许通过Wi-Fi或有线方式TurtleBot3通信[^1]。 #### 软件配置 在开始之前,需先完成ROS2环境的搭,并安装`turtlebot3_ros2`及相关依赖包。可以通过官方文档获取详细的安装指南。为了使时间同步功能正常运作,在启动文件中加入参数`use_sim_time:=False`,因为这是针对真实世界应用而非模拟环境的情况下的设定[^2]。 #### 执行流程 - **启动核心服务** 需要在新的终端里激活ROS2的工作空间,并运行如下指令以初始化roscore: ```bash source /opt/ros/humble/setup.bash ``` - **启动TurtleBot3驱动程序** 接下来在同一台机器上的另一个新打开的终端内发出下面这条语句用来加载底层控制板固件并向其发送指令从而让小车可以响应来自其他进程的消息: ```bash ros2 launch turtlebot3_bringup robot_launch.py ``` - **启动Cartographer SLAM** 当上述步骤完成后,在另一单独的新窗口中输入以下命令用于启动SLAM算法: ```bash ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=False ``` - **操控TurtleBot3移动** 若要手动驾驶TurtleBot3以便收集更多数据,则可以在另外一台电脑或者同一台电脑的不同终端里面调用teleoperation工具来进行远程操纵: ```bash ros2 run turtlebot3_teleop teleop_keyboard ``` 此时,随着TurtleBot3按照用户的指示行动,它会持续不断地接收到来自LIDAR的数据并将它们传递给正在工作的Cartographer模块;后者负责处理接收到的信息流进而逐步立起一张二维平面。 #### 地保存 当完成了整个区域扫描之后,记得要将最终形成的地导出成PGM像格式加上YAML描述文件的形式存档起来供以后重访路径规划时所用。为此可利用map_server组件提供的相应接口实现这一目标。 ```bash ros2 service call /map_saver/save_map std_srvs/srv/Empty "{}" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

具身小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值