《ROS理论与实践》学习笔记(八)机器人SLAM建图

在学习《ROS理论与实践》课程时,记录了学习过程中的编程练习,课后作业以及发现的问题,后续会对尚未解决的问题继续分析并更新,纯小白,仅供参考。
本次学习笔记关于课程中的第八讲:机器人SLAM建图 。主要学习了SLAM原理、ROS机器人与数据结构、常用SLAM功能包应用。


课程内容

常用SLAM功能包应用

首先对课程代码包进行编译,出现以下错误:

$ qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

原因是没有安装qt4-qmake功能包,解决方法:

$ sudo apt-get install qt4-qmake

再次编译又出现以下问题:

$ CMake Error at /usr/share/cmake-3.10/Modules/FindQt4.cmake:628 (message):
  Could NOT find QtCore.

原因是CMake找不到QT4,解决方法:

$ sudo apt install cmake gcc g++ qt{4,5}-qmake libqt4-dev

再次编译又出现以下问题:

$ Could not find a package configuration file provided by "move_base_msgs"

原因是缺少move_base_msgs这个消息,来自navigation功能包,解决方法:

$ sudo apt-get install ros-melodic-navigation

gmapping

1.简介
gmapping功能包是最常用的slam功能包应用之一,需要机器人提供深度信息、IMU信息和里程计信息,基于激光雷达,使用了OpenSlam开源算法,输出的地图话题为:nav_msgs/OccupancyGrid
2.功能包安装

$ sudo apt-get install ros-melodic-gmapping

在这里插入图片描述
3.启动例程(激光雷达):

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

4.保存地图:

$ rosrun map_server map_saver -f cloister_gmapping

地图将会保存为yaml配置文件和pgm图片文件
实际运行效果:
在这里插入图片描述在这里插入图片描述
5.启动例程(Kinect):

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

使用Kincet会产生机器人位置跳变的情况,尤其是在缺少特征点的情况下

hector

1.简介
hector也是最常用的slam功能包应用之一,相比于gmapping不需要里程计信息
2.安装hector_slam

$ git clone https://github.com/tu-darmstadt-rps-pkg/hector_slam.git

在这里插入图片描述2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation hector_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

在这里插入图片描述

如果在转弯时速度过快,使用hector容易出现上图这样的打滑现象,这是因为hector仅使用深度信息

cartographer

1.简介
cartographer基于图网络的优化方法,在计算资源有限的情况下,实时获取相对较高精度的2D地图,来自谷歌开源
2.安装功能包

$ sudo apt-get install ros-melodic-cartographer-*

2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation cartographer_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

3.保存地图

$ rosservice call /finish_trajectory 0
$ rosservice call /write_state "{filename:'${HOME}/mymap.pbstream'}"
$ rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/mymap -pbstream_filename=${HOME}/mymap.pbstream -resolution=0.05

在这里插入图片描述

rtabmap

1.简介
rtabmap用于三维建图
2.功能包安装

$ sudo apt-get install ros-melodic-rtabmap-ros

2.启动例程

$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation rtabmap_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

3.查看见图结果

$ rtabmap-databaseViewer ~/.ros/rtabmap.db

本讲作业

1.在Gazebo中构建一个用于建图和导航的虚拟环境

Building Editor工具的具体用法在之前提过,在这里直接创建了如下的world,命名为ch9_myroom
在这里插入图片描述

2.将自己构建的机器人模型放置到虚拟环境中,使用gmapping和hector功能包实现SLAM地图构建

需要将激光雷达加入到自己构建的xacro模型中,这里贴出了新增的代码:

 <xacro:include filename="$(find mybot_description)/urdf/sensors/lidar_gazebo.xacro" />
 
 <xacro:property name="lidar_offset_x" value="0.1" />
 <xacro:property name="lidar_offset_y" value="0" />
 <xacro:property name="lidar_offset_z" value="0.06" />
 
 <!-- lidar -->
 <joint name="lidar_joint" type="fixed">
     <origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" />
     <parent link="base_link"/>
     <child link="laser_link"/>
 </joint>

 <xacro:rplidar prefix="laser"/>

启动刚创建的world文件并且把自己的模型放进去:

<launch>

    <!-- 设置launch文件的参数 -->
    <arg name="world_name" value="$(find mybot_gazebo)/worlds/ch9_myroom.world"/>
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(arg world_name)" />
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mybot_description)/urdf/nmybot_all_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mrobot -param robot_description"/> 

</launch>

启动课程代码包中关于gmapping的launch文件,主要是启动了gmapping功能包中的slam_gmapping节点,并对节点作了参数配置,然后启动rviz做可视化
最后启动键盘控制节点,让机器人运动一周,得到如下图结果
在这里插入图片描述
可以看到gmapping建图结果还是比较准确的

下图是使用hector功能包完成的建图结果
在这里插入图片描述使用hector功能包完成建图任务,不需要里程计信息,所以相对gmapping会出现打滑的现象,尤其地图边缘会出现误差,但总体上完成了建图任务。


结语

本讲主要学习了SLAM原理、ROS机器人与数据结构、常用SLAM功能包应用,了解四种常用的建图方法,最后通过自己建立world模型并进行建图的作业,加深了印象。

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
mbot机器⼈巡线程序_mBot机器⼈编程——⽤机器⼈的逻辑思 考问题 mBot机器⼈编程 ——⽤机器⼈的逻辑思考问题 ⽂/陈林 提到机器⼈,想必⼤家都不会陌⽣。但如果问到什么是机器⼈时,似乎⼼中的答案并不是那么的确切了,甚⾄不知道如何回答这个问题。如 果你也对什么是机器⼈这个问题感到⽆从回答的话,那就对了,因为国际上并未有⼀个准确的定义。 什么是机器⼈? 如果你尝试去百度,你会得到:机器⼈(Robot)是⼀种能够半⾃主或全⾃主⼯作的智能机器。⽽你查阅辞海时,⼜能得到:⼀种可以接受感 应到周围变化及输⼊的机器,通常具有某种程度的⼈造智慧。⽽维基百科⾥描述的是:机器⼈包括⼀切模拟⼈类⾏为或思想与模拟其他⽣物 的机械。因此,每次课我都会⿎励孩⼦们尝试为⾃⼰所理解的机器⼈下⼀个定义。这次我也收获到了很多不同的答案,有认为机器⼈是能独 ⽴完成某⼀具体事情的机械装置,有认为机器⼈是能协助⼈完成⼯作的机器,也有同学认为机器⼈就是拓展⼈类某⼀能⼒的机械。 你为什么学习机器⼈? 机器⼈已经逐渐⾛⼊了我们的⽣活,为⼈们带来了巨⼤的便利,我们⼏乎可以预⾔,机器终将取代我们绝⼤部分的⼯作,为⼈们的⽣活带来 巨⼤的便利,包括医疗、公共服务、家庭⽣活和教育等。对的,在教育中,机器⼈除了可以充当我们的AI⽼师,如"有道"提供的"AI"英 语教育等,还可以作为学习和⾛进机器⼈世界的⼀个教育载体。很少有⼀门学科能同时涵盖了数学、物理、计算机、机械⼯程等领域。因 此,学习机器⼈可以做到多学科的融合。 如何学习机器⼈? 说起机器⼈的历史,早在1959年,机器⼈之⽗约瑟夫·恩格尔伯格便制造了世界上第⼀台⽤于⼯业⽣产的可编程机器⼈。到如今,机器⼈ 已经可以做到如索菲亚那种对答如流,能做出超过60多种表情的机器⼈,⼜或者如同波⼠顿公司⽣产的能奔跑和空翻的敏捷机器⼈。机器 ⼈发展如此迅速,要想学习机器⼈,就需要知道最根本的底层逻辑。尽管拓展到智能硬件,我们依然可以这样说,绝⼤部分的智能机械实现 逻辑都是:接收信息 处理信息 输出控制指令。因此我们的课程中包含了⼤量的项⽬,并且每⼀个项⽬都是遵循这样的逻辑实现的。 ⽤mBot机器⼈来开启你的学习之旅! mBot是MakeBlock公司⽣产的⾯向⼴⼤青少年的教育机器⼈,它⽀持形化编程和c语⾔代码编程。其机器⼈⼤脑主板集成了RGB彩灯、 红外接收模块、蜂鸣器、电源模块和红外发射模块等。且包含了直流电件、红外遥控、蓝⽛、超声波、灰度传感器等多种外设。⾮常适合我 们初学者作为第⼀个⼊门编程和机器⼈的教具。 我们都做了些什么项⽬? 机器⼈的组装 学习mBot机器⼈的第⼀步,就是组装你⾃⼰的机器⼈,从每⼀个模块的搭到拧上第⼀个颗螺丝再到装上电池贴上标签。是的,每⼀步都 由你⾃⼰完成,让你的机器⼈赋予上特殊的意义。 轨迹⾏⾛ 组装好的你的机器⼈了!快来试试机器⼈能跑起来吗?⾛个正⽅形试试: 超声避障 超声波模块会发出40Khz的超声波,并在阈值时间内,等待返回波,当接收到返回波时,利⽤声⾳在空⽓中的传播速度便可以计算出障碍物 的距离,当距离过近时认定为有障碍,通过控制电机让机器⼈转开。对的,机器⼈编程中,程序的⼀⼤结构就是分⽀语句。对于机器⼈⽽ ⾔,有太多的不确定性了,需要通过假设的⽅法来将接收到的信息分情况处理。这也就是规则,当它掌握的规则越多,它就越智能。 机器⼈⾛迷宫 机器⼈⾛迷宫灵感来源于"电脑⿏"⾛迷宫竞赛,我们的机器⼈在超声波的帮助下,能够轻松分辨出前⽅是否有障碍物,这样也就⾜够⾛⼀ 个简单的迷宫了。同学们尝试了利⽤随机数实现在碰到墙壁时,随机左右转,防⽌陷⼊死循环。最后在多次尝试后,挑战成功! 循线机器⼈ 利⽤双灰度传感器,加上四条规则: 1. 左边看到⽩⾊右转(左偏了) 2. 右边看到⽩⾊左转 3. 两边都为⽩停⽌ 4. 两边都为⿊前进 是的,⼈类之所以聪明,就是掌握了⼤量的规则,事物间的规则等。当我们教会机器⼈⼀些简单的规则后,它也就变得智能了。 送餐机器⼈ 很明显,我们的机器⼈⼏乎具备了简易送餐机器⼈的全部功能,能够按照指定线路⾏⾛,能够实时检测障碍物,最后就只差记录站点了。对 的,如果掌握变量的使⽤,你就可以尝试综合已经学习过的知识点,完成⼀个送餐机器⼈制作。 写在最后 初学机器⼈,你可能会发现,我们只不过是在交给机器⼈⼀些具体的规则,⽆论是让他完成智能声光控,亦或者让其送个餐,⾃动打扫⼀下 卫⽣等等,都是在不断的教会它更多的规则,让它在遇到问题的能够处理。⽽如果它变得能够处理⼀些突发性的问题,或者说当它能够创造 规则的时候,也就是⼈所具备的能⼒!⽽让机器⼈具备或延伸⼈的智能,也就是到了⼈⼯智能的领域了!
好的,以下是在ROS2功能包中创名为`launch`的文件夹,以及编写启动文件来启动Gazebo仿真环境和机器人模型的步骤: 1. 首先,在终端中进入ROS2功能包的根目录,创一个名为`launch`的文件夹: ``` cd /path/to/your/ROS2/package mkdir launch ``` 这里的`/path/to/your/ROS2/package`是指你的ROS2功能包的根目录。 2. 在`launch`文件夹中创一个名为`simulation.launch.py`的Python文件(也可以使用其他文件扩展名)。在该文件中编写启动Gazebo仿真环境和机器人模型的代码。 以下是一个简单的示例: ```python import os from launch import LaunchDescription from launch_ros.actions import Node from ament_index_python.packages import get_package_share_directory def generate_launch_description(): # 启动Gazebo仿真环境 gazebo_world_path = os.path.join(get_package_share_directory('your_robot_description'), 'worlds', 'robot_world.sdf') gazebo_node = Node(package='gazebo_ros', executable='gazebo', arguments=['-s', 'libgazebo_ros_factory.so', gazebo_world_path]) # 启动机器人控制器 robot_description_path = os.path.join(get_package_share_directory('your_robot_description'), 'urdf', 'robot_model.urdf') robot_state_publisher_node = Node(package='robot_state_publisher', executable='robot_state_publisher', arguments=[robot_description_path]) joint_state_publisher_node = Node(package='joint_state_publisher_gui', executable='joint_state_publisher_gui') rviz_node = Node(package='rviz2', executable='rviz2', arguments=['-d', os.path.join(get_package_share_directory('your_robot_description'), 'rviz', 'robot.rviz')]) return LaunchDescription([ gazebo_node, robot_state_publisher_node, joint_state_publisher_node, rviz_node ]) ``` 请注意,在该示例中,`your_robot_description`是指你的ROS2功能包中包含机器人模型和相关文件的包。你需要将其替换为你的实际包名称。 3. 保存`simulation.launch.py`文件并在终端中运行以下命令来启动仿真环境和机器人模型: ``` ros2 launch your_package launch/simulation.launch.py ``` 这里的`your_package`是指你的ROS2功能包的名称。 这样,你就可以在ROS2功能包中创一个名为`launch`的文件夹,并编写启动文件来启动Gazebo仿真环境和机器人模型了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值