ROS中阶笔记(七):机器人SLAM与自主导航—SLAM功能包的使用(上)

本文涉及的产品
资源编排,不限时长
简介: ROS中阶笔记(七):机器人SLAM与自主导航—SLAM功能包的使用

1 机器人必备条件


1.1 硬件要求


(1)差分轮式机器人,可使用twist速度指令控制

$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear   # linear:xyz方向上的线速度,单位是m/s;
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular  # angular:xyz方向上的角速度,单位是rad/s。
  float64 x
  float64 y
  float64 z


(2)机器人必须安装激光雷达等测距设备,可以获取环境深度信息。

(3)最好使用正方形和圆形的机器人,其他外形的机器人虽然可以使用但是效果可能不佳。


1.2 深度信息


1.2.1 激光雷达

$ rosmsg show sensor_msgs/LaserScan           # 查看激光雷达消息结构
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min 
float32 angle_max    
float32 angle_increment  
float32 time_increment 
float32 scan_time  
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
angle_min:可检测范围的起始角度; (—180——180度 )
angle_max:可检测范围的终止角度,与angle_min组成激光雷达的可检测范围;
angle_increment:相邻数据帧之间的角度步长;
time_incremen:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用。
scan_time:采集一帧数据所需要的视觉;
rang_min:最近可检测深度的阈值;
rang_max:最远可检测深度的阈值;
ranges:一帧深度数据的存储数组。
intensities:每个激光点的强度


1.2.2 kinect


Kinect等GRB-D摄像头,也可以通过红外摄像头获取周围环境的深度信息。


depthimage_to_laserscan功能包:将三维点云数据转换为二维激光雷达数据;

<!--depthimage_to_laserscan节点,将点云深度数据转换成激光数据-->
<node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" output="screen">
    <remap from="image" to="/kinect/depth/image_raw"/>
    <remap from="camera_info" to=/kinect/depth/camera_info"/>
    <remap froam="scan" to="/scan"/>
    <param name="output_frame_id" value="/camera_link"/>
</node>


1.3 里程计信息


$ rosmsg show nav_msgs/odometry
pose:机器人当前位置坐标,包括机器人的XYZ三轴位置与方向参数,以及用于校正误差的方差矩阵
twist:机器人当前的运动状态,包括XYZ三轴的线速度与角速度,以及用于校正误差的方差矩阵。
注意:ROS中所有的坐标系都是右手坐标系。
————————————————

aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTUwMjE4MzI5ODcucG5n.png

1.4 仿真环境


在视频中给出了一个仿真环境:


$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch     # 启动仿真环境
# 使用Building Editor创建仿真环境cloister.world


2 SLAM功能包的使用方法


论文参考:https://openslam-org.github.io/gmapping.html


2.1 gmapping


2.1.1 gmapping 功能包


基于激光雷达

Rao-Blackwellized 粒子滤波算法

二维栅格地图

需要机器人提供里程计信息


OpenSlam开源算法

输出地图话题:nav_msgs/OccupancyGrid


$ rosmsg show nav_msgs/OccupancyGrid 


aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTgwOTQxNTE5NjcucG5n.png


2.1.2 栅格地图取值原理


aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTgxMDA0MjQ4NzEucG5n.png

2.1.3 gmapping安装


$ sudo apt-get install ros-kinetic-gmapping


aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTgwOTQ4MDIyNjkucG5n.png

2.1.4 配置gmapping节点


参考: http://wiki.ros.org/gmapping


catkin_ws/src/mbot_navigation/launch/gmapping.launch


<launch>
    <arg name="scan_topic" default="scan" />
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
        <param name="odom_frame" value="odom"/>
        <param name="map_update_interval" value="5.0"/>
        <!-- Set maxUrange < actual maximum range of the Laser -->
        <param name="maxRange" value="5.0"/>
        <param name="maxUrange" value="4.5"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <param name="lstep" value="0.05"/>
        <param name="astep" value="0.05"/>
        <param name="iterations" value="5"/>
        <param name="lsigma" value="0.075"/>
        <param name="ogain" value="3.0"/>
        <param name="lskip" value="0"/>
        <param name="srr" value="0.01"/>
        <param name="srt" value="0.02"/>
        <param name="str" value="0.01"/>
        <param name="stt" value="0.02"/>
        <param name="linearUpdate" value="0.5"/>
        <param name="angularUpdate" value="0.436"/>
        <param name="temporalUpdate" value="-1.0"/>
        <param name="resampleThreshold" value="0.5"/>
        <param name="particles" value="80"/>
        <param name="xmin" value="-1.0"/>
        <param name="ymin" value="-1.0"/>
        <param name="xmax" value="1.0"/>
        <param name="ymax" value="1.0"/>
        <param name="delta" value="0.05"/>
        <param name="llsamplerange" value="0.01"/>
        <param name="llsamplestep" value="0.01"/>
        <param name="lasamplerange" value="0.005"/>
        <param name="lasamplestep" value="0.005"/>
        <remap from="scan" to="$(arg scan_topic)"/>
    </node>
</launch>

2.1.5 启动gmapping演示(激光雷达)


分别开启三个终端运行以下命令:

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch    # 启动仿真环境
$ roslaunch mbot_navigation gmapping_demo.launch  # 启动建图节点,灰色地图建成,黑色障碍物
$ roslaunch mbot_teleop mbot_teleop.launch        #启动键盘控制节点 

建图完毕,保存地图


$ rosrun map_server map_saver -f cloister_gmapping  
# cloister_gmapping是文件名的意思,是自己保存文件名的意思
# 保存的路径在当前/home文件夹下,有两个文件.pgm和.yaml


2.1.6 启动gmapping(kinect)


建图效果不佳(不推荐)


$ roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

2.2 hector_slam


2.2.1 hector_slam功能包


基于激光雷达

高斯牛顿方法

二维栅格地图

不需要里程计数据

输出地图话题:

nav_msgs/OccupancyGrid

aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTgxMjUzMDkzNjEucG5n.png


2.2.2 安装hector_slam


$ sudo apt-get install ros-kinetic-hector-slam


aHR0cHM6Ly9naXRlZS5jb20vSVQtY3V0ZS9QaWNiZWQvcmF3L21hc3Rlci9pbWcvaW1hZ2UtMjAyMDA1MTgxMzAzNDE3NTAucG5n.png

2.2.3 配置hector_mapping节点


参数说明可参考:http://wiki.ros.org/hector_slam

catkin_ws/src/mbot_navigation/launch/hector.launch


<launch>
    <node pkg = "hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
        <!-- Frame names -->
        <param name="pub_map_odom_transform" value="true"/>
        <param name="map_frame" value="map" />
        <param name="base_frame" value="base_footprint" />
        <param name="odom_frame" value="odom" />
        <!-- Tf use -->
        <param name="use_tf_scan_transformation" value="true"/>
        <param name="use_tf_pose_start_estimate" value="false"/>
        <!-- Map size / start point -->
        <param name="map_resolution" value="0.05"/>
        <param name="map_size" value="2048"/>
        <param name="map_start_x" value="0.5"/>
        <param name="map_start_y" value="0.5" />
        <param name="laser_z_min_value" value = "-1.0" />
        <param name="laser_z_max_value" value = "1.0" />
        <param name="map_multi_res_levels" value="2" />
        <param name="map_pub_period" value="2" />
        <param name="laser_min_dist" value="0.4" />
        <param name="laser_max_dist" value="5.5" />
        <param name="output_timing" value="false" />
        <param name="pub_map_scanmatch_transform" value="true" />
        <!-- Map update parameters -->
        <param name="update_factor_free" value="0.4"/>
        <param name="update_factor_occupied" value="0.7" />    
        <param name="map_update_distance_thresh" value="0.2"/>
        <param name="map_update_angle_thresh" value="0.06" />
        <!-- Advertising config --> 
        <param name="advertise_map_service" value="true"/>
        <param name="scan_subscriber_queue_size" value="5"/>
        <param name="scan_topic" value="scan"/>
    </node>
</launch>
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
26天前
|
Ubuntu 机器人 Linux
|
3月前
|
机器人 C++ Python
ROS2教程 02 功能包
本文是关于ROS2(机器人操作系统2)中功能包(package)管理的教程,介绍了如何检查功能包的依赖、创建新功能包、列出可执行文件、列出所有功能包、查询功能包的位置和描述信息,以及为C++和Python功能包配置必要的文件。
93 0
|
3天前
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
【10月更文挑战第22天】ROS2的学习过程和应用,介绍DDS系统的框架和知识。
|
26天前
|
传感器 数据可视化 机器人
【ROS速成】半小时入门机器人ROS系统简明教程之可视化系统(三)
半小时入门机器人ROS系统简明教程之可视化系统
|
26天前
|
机器人
【ROS速成】半小时入门机器人ROS系统简明教程之安装测速(二)
半小时入门机器人ROS系统简明教程之安装测速
|
3月前
|
机器人 Shell 开发者
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
这篇文章是关于ROS2(Robot Operating System 2)中功能包、依赖管理、工作空间配置和编译的教程,涵盖了ROS2工作空间的概念、如何获取和安装功能包的依赖、构建工作空间的步骤,以及如何创建和管理ROS2功能包,包括使用命令行工具对功能包进行操作的方法。
330 0
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
|
3月前
|
存储 缓存
02 ROS创建工作空间和功能包
如何在ROS中创建工作空间和功能包,包括初始化工作空间、编译、设置环境变量以及使用`catkin_create_pkg`创建新功能包的步骤。
52 1
|
5月前
|
机器人 定位技术 C++
技术笔记:ROS中测试机器人里程计信息
技术笔记:ROS中测试机器人里程计信息
|
6月前
|
传感器 人工智能 监控
智能耕耘机器人
智能耕耘机器人
130 3
|
28天前
|
人工智能 搜索推荐 机器人
挑战未来职场:亲手打造你的AI面试官——基于Agents的模拟面试机器人究竟有多智能?
【10月更文挑战第7天】基于Agent技术,本项目构建了一个AI模拟面试机器人,旨在帮助求职者提升面试表现。通过Python、LangChain和Hugging Face的transformers库,实现了自动提问、即时反馈等功能,提供灵活、个性化的模拟面试体验。相比传统方法,AI模拟面试机器人不受时间和地点限制,能够实时提供反馈,帮助求职者更好地准备面试。
35 2

推荐镜像

更多