前面我们学习了ROS的一些基础知识,现在我们来学习ROS环境下的Gazebo仿真。

本文所需的源码下载地址为

https://github.com/guyuehome/guyueclass

文章目录

  • 〇、写在前面
    • 1.rosdep问题
    • 2.Gazebo闪退问题
  • 一、优化物理仿真模型
    • 1.使用xacro文件优化URDF模型
      • 1.1 xacro简介
      • 1.2 xacro的使用
        • 常量定义
        • 常量使用与计算
        • 宏定义
        • 宏调用
        • 文件包含
      • 1.3 ros_control功能包
        • 1.3.1 ros_control是什么
    • 2.完善机器人模型的物理仿真
      • 2.1 为link添加惯性参数和碰撞属性
      • 2.2 为link添加gazebo标签
      • 2.3 为joint添加传动装置
      • 2.4 添加gazebo控制器插件
      • 2.5 在gazebo中加载机器人模型
  • 二.Gazebo仿真
    • 1.下载模型
    • 2 .初次运行Gazebo
      • 准备工作
      • 打开Gazebo
      • 控制小车
    • 3.在Gazebo中创建模型
      • Insert 直接添加
      • Building Editor 绘制
    • 4.物理环境运动仿真
      • 打开环境
      • 键盘控制
    • 5.摄像头仿真
    • 6.深度相机仿真
    • 7.激光雷达仿真
    • 8.SLAM仿真
      • 8.1 准备工作
      • 8.2 Gmapping SLAM
        • 激光雷达
        • 深度相机
      • 8.3 Hector SLAM
      • 8.4 Cartographer SLAM
      • 8.5 RTAB SLAM
    • 9.自主导航仿真

〇、写在前面

在第一篇笔记中我使用的是Ubuntu 20和ROS noetic,但为了方便学习和适应网上资料,我们在这里更改为Ubuntu 18和ROS melodic。在切换的过程中请注意以下几点:

1.rosdep问题

ROS melodic的安装有这么一步,会经常报错。

sudo rosdep init
rosdep update

主要原因是ROS服务器在国外,访问经常掉线。在这里我们参考了以下两个解决方案。

https://blog.csdn.net/Kenny_GuanHua/article/details/116845781

http://www.autolabor.com.cn/book/ROSTutorials/chapter1/12-roskai-fa-gong-ju-an-zhuang/124-an-zhuang-ros.html

具体方法如下(不保证长期有效)

网站https://ghproxy.com/支持Github的资源代理,非常好用,我们将用此代理加速rosdep对Github的访问,进而解决rosdep update失败问题。

我们要做的,是在rosdep的若干个脚本文件中,把https://ghproxy.com/添加到相应URL前面即可。

  1. 首先修改rosdep下载资源的脚本文件:/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py,把以下行添加到脚本中的download_rosdep_data()函数中,以应用代理服务:
# 打开sources_list.py
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py
# 在download_rosdep_data()函数中添加这一句
url="https://ghproxy.com/"+url
  1. 然后,用同样的方法修改/usr/lib/python2.7/dist-packages/rosdistro/__init__.py里面的DEFAULT_INDEX_URL参数,如下:
# 打开__init__.py
sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/__init__.py
# 将DEFAULT_INDEX_URL的网址前加上https://ghproxy.com/
DEFAULT_INDEX_URL = 'https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'
  1. 接着,以下4个文件中也使用了raw.githubusercontent.com网址,同样的方法把https://ghproxy.com/添加到网址前:
# 第36行
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py# 第72行
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py# 第39行
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/rep3.py# 第68行 和 第119行
sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py
  1. 最后,在 /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py 的第204行添加如下代码:
# 打开gbpdistro_support.py
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
# 在第204行添加如下代码
gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url

之后可正常执行

sudo rosdep init
rosdep update

2.Gazebo闪退问题

请输入如下进行测试

# 这将会打开Gazebo并显示三个简单的形状
roslaunch gazebo_ros shapes_world.launch

如果失败请运行如下,并重启终端。

echo "export SVGA_VGPU10=0" >> ~/.bashrc

一、优化物理仿真模型

1.使用xacro文件优化URDF模型

1.1 xacro简介

URDF模型是一种经典的物理模型,但其存在一些问题使其不适合在Gazebo中直接使用。这些问题包括:

  • 模型冗长,重复较多
  • 参数修改麻烦
  • 没有参数计算功能

xacro模型是适合在Gazebo中使用的模型,其特点包括:

  • 精简模型代码

    • 创建宏定义
    • 文件包含
  • 提供可编程接口
    • 常量
    • 变量
    • 数学计算
    • 条件语句

1.2 xacro的使用

常量定义

<xacro:property name="M_PI" value="3.1415926"/>
<xacro:property name="base_mass"   value="1" />
<xacro:property name="base_radius" value="0.20"/>
<xacro:property name="base_length" value="0.16"/>

常量使用与计算

<xacro:macro name="sphere_inertial_matrix" params="m r"><inertial><mass value="${m}" /><inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /></inertial>
</xacro:macro>

注意:所有数学运算都会被转换为浮点数计算以保证精度。

宏定义

<!-- Macro for robot caster -->
<xacro:macro name="caster" params="prefix reflect"><joint name="${prefix}_caster_joint" type="continuous"><origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/><parent link="base_link"/><child link="${prefix}_caster_link"/><axis xyz="0 1 0"/></joint><link name="${prefix}_caster_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${caster_radius}" /></geometry><material name="black" /></visual><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${caster_radius}" /></geometry></collision>      <sphere_inertial_matrix  m="${caster_mass}" r="${caster_radius}" /></link><gazebo reference="${prefix}_caster_link"><material>Gazebo/Black</material></gazebo>
</xacro:macro>

宏调用

<caster prefix="front" reflect="-1"/>
<caster prefix="back"  reflect="1"/>

文件包含

<xacro:include filename="$(find mbot_description)/urdf/mbot_base_gazebo.xacro" />

1.3 ros_control功能包

1.3.1 ros_control是什么

  • ROS为开发者提供的机器人控制中间件
  • 包含一些列控制器接口、传动接口、硬件接口等
#mermaid-svg-UFrO4UmNjHlsVoBG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .label text{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .node rect,#mermaid-svg-UFrO4UmNjHlsVoBG .node circle,#mermaid-svg-UFrO4UmNjHlsVoBG .node ellipse,#mermaid-svg-UFrO4UmNjHlsVoBG .node polygon,#mermaid-svg-UFrO4UmNjHlsVoBG .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-UFrO4UmNjHlsVoBG .node .label{text-align:center;fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .node.clickable{cursor:pointer}#mermaid-svg-UFrO4UmNjHlsVoBG .arrowheadPath{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-UFrO4UmNjHlsVoBG .flowchart-link{stroke:#333;fill:none}#mermaid-svg-UFrO4UmNjHlsVoBG .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-UFrO4UmNjHlsVoBG .edgeLabel rect{opacity:0.9}#mermaid-svg-UFrO4UmNjHlsVoBG .edgeLabel span{color:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-UFrO4UmNjHlsVoBG .cluster text{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-UFrO4UmNjHlsVoBG .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-UFrO4UmNjHlsVoBG text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-UFrO4UmNjHlsVoBG .actor-line{stroke:grey}#mermaid-svg-UFrO4UmNjHlsVoBG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-UFrO4UmNjHlsVoBG #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .sequenceNumber{fill:#fff}#mermaid-svg-UFrO4UmNjHlsVoBG #sequencenumber{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG #crosshead path{fill:#333;stroke:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .messageText{fill:#333;stroke:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-UFrO4UmNjHlsVoBG .labelText,#mermaid-svg-UFrO4UmNjHlsVoBG .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-UFrO4UmNjHlsVoBG .loopText,#mermaid-svg-UFrO4UmNjHlsVoBG .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-UFrO4UmNjHlsVoBG .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-UFrO4UmNjHlsVoBG .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-UFrO4UmNjHlsVoBG .noteText,#mermaid-svg-UFrO4UmNjHlsVoBG .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-UFrO4UmNjHlsVoBG .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-UFrO4UmNjHlsVoBG .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-UFrO4UmNjHlsVoBG .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-UFrO4UmNjHlsVoBG .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .section{stroke:none;opacity:0.2}#mermaid-svg-UFrO4UmNjHlsVoBG .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-UFrO4UmNjHlsVoBG .section2{fill:#fff400}#mermaid-svg-UFrO4UmNjHlsVoBG .section1,#mermaid-svg-UFrO4UmNjHlsVoBG .section3{fill:#fff;opacity:0.2}#mermaid-svg-UFrO4UmNjHlsVoBG .sectionTitle0{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .sectionTitle1{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .sectionTitle2{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .sectionTitle3{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-UFrO4UmNjHlsVoBG .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .grid path{stroke-width:0}#mermaid-svg-UFrO4UmNjHlsVoBG .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-UFrO4UmNjHlsVoBG .task{stroke-width:2}#mermaid-svg-UFrO4UmNjHlsVoBG .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .taskText:not([font-size]){font-size:11px}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-UFrO4UmNjHlsVoBG .task.clickable{cursor:pointer}#mermaid-svg-UFrO4UmNjHlsVoBG .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UFrO4UmNjHlsVoBG .taskText0,#mermaid-svg-UFrO4UmNjHlsVoBG .taskText1,#mermaid-svg-UFrO4UmNjHlsVoBG .taskText2,#mermaid-svg-UFrO4UmNjHlsVoBG .taskText3{fill:#fff}#mermaid-svg-UFrO4UmNjHlsVoBG .task0,#mermaid-svg-UFrO4UmNjHlsVoBG .task1,#mermaid-svg-UFrO4UmNjHlsVoBG .task2,#mermaid-svg-UFrO4UmNjHlsVoBG .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutside0,#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutside2{fill:#000}#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutside1,#mermaid-svg-UFrO4UmNjHlsVoBG .taskTextOutside3{fill:#000}#mermaid-svg-UFrO4UmNjHlsVoBG .active0,#mermaid-svg-UFrO4UmNjHlsVoBG .active1,#mermaid-svg-UFrO4UmNjHlsVoBG .active2,#mermaid-svg-UFrO4UmNjHlsVoBG .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-UFrO4UmNjHlsVoBG .activeText0,#mermaid-svg-UFrO4UmNjHlsVoBG .activeText1,#mermaid-svg-UFrO4UmNjHlsVoBG .activeText2,#mermaid-svg-UFrO4UmNjHlsVoBG .activeText3{fill:#000 !important}#mermaid-svg-UFrO4UmNjHlsVoBG .done0,#mermaid-svg-UFrO4UmNjHlsVoBG .done1,#mermaid-svg-UFrO4UmNjHlsVoBG .done2,#mermaid-svg-UFrO4UmNjHlsVoBG .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-UFrO4UmNjHlsVoBG .doneText0,#mermaid-svg-UFrO4UmNjHlsVoBG .doneText1,#mermaid-svg-UFrO4UmNjHlsVoBG .doneText2,#mermaid-svg-UFrO4UmNjHlsVoBG .doneText3{fill:#000 !important}#mermaid-svg-UFrO4UmNjHlsVoBG .crit0,#mermaid-svg-UFrO4UmNjHlsVoBG .crit1,#mermaid-svg-UFrO4UmNjHlsVoBG .crit2,#mermaid-svg-UFrO4UmNjHlsVoBG .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-UFrO4UmNjHlsVoBG .activeCrit0,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCrit1,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCrit2,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-UFrO4UmNjHlsVoBG .doneCrit0,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCrit1,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCrit2,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-UFrO4UmNjHlsVoBG .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-UFrO4UmNjHlsVoBG .milestoneText{font-style:italic}#mermaid-svg-UFrO4UmNjHlsVoBG .doneCritText0,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCritText1,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCritText2,#mermaid-svg-UFrO4UmNjHlsVoBG .doneCritText3{fill:#000 !important}#mermaid-svg-UFrO4UmNjHlsVoBG .activeCritText0,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCritText1,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCritText2,#mermaid-svg-UFrO4UmNjHlsVoBG .activeCritText3{fill:#000 !important}#mermaid-svg-UFrO4UmNjHlsVoBG .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-UFrO4UmNjHlsVoBG g.classGroup text .title{font-weight:bolder}#mermaid-svg-UFrO4UmNjHlsVoBG g.clickable{cursor:pointer}#mermaid-svg-UFrO4UmNjHlsVoBG g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-UFrO4UmNjHlsVoBG g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-UFrO4UmNjHlsVoBG .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-UFrO4UmNjHlsVoBG .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-UFrO4UmNjHlsVoBG .dashed-line{stroke-dasharray:3}#mermaid-svg-UFrO4UmNjHlsVoBG #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG .commit-id,#mermaid-svg-UFrO4UmNjHlsVoBG .commit-msg,#mermaid-svg-UFrO4UmNjHlsVoBG .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-UFrO4UmNjHlsVoBG g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-UFrO4UmNjHlsVoBG g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-UFrO4UmNjHlsVoBG g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-UFrO4UmNjHlsVoBG .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-UFrO4UmNjHlsVoBG .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-UFrO4UmNjHlsVoBG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-UFrO4UmNjHlsVoBG .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-UFrO4UmNjHlsVoBG .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-UFrO4UmNjHlsVoBG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-UFrO4UmNjHlsVoBG .edgeLabel text{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UFrO4UmNjHlsVoBG .node circle.state-start{fill:black;stroke:black}#mermaid-svg-UFrO4UmNjHlsVoBG .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-UFrO4UmNjHlsVoBG #statediagram-barbEnd{fill:#9370db}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-state .divider{stroke:#9370db}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-UFrO4UmNjHlsVoBG .note-edge{stroke-dasharray:5}#mermaid-svg-UFrO4UmNjHlsVoBG .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-UFrO4UmNjHlsVoBG .error-icon{fill:#522}#mermaid-svg-UFrO4UmNjHlsVoBG .error-text{fill:#522;stroke:#522}#mermaid-svg-UFrO4UmNjHlsVoBG .edge-thickness-normal{stroke-width:2px}#mermaid-svg-UFrO4UmNjHlsVoBG .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-UFrO4UmNjHlsVoBG .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-UFrO4UmNjHlsVoBG .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-UFrO4UmNjHlsVoBG .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-UFrO4UmNjHlsVoBG .marker{fill:#333}#mermaid-svg-UFrO4UmNjHlsVoBG .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-UFrO4UmNjHlsVoBG {color: rgba(0, 0, 0, 0.75);font: ;}应用功能包base_controller控制器插件:- 不直接接触硬件- 从抽象层请求资源arm_controller控制器插件foo_controller控制器插件RobotHW机器人硬件抽象:- 管理硬件资源- 处理硬件冲突机器人速度控制位置控制力控制

ros_contral主要提供了四种控制器(Controllers)

  • joint_state_controller 状态控制器
  • joint_effort_controller 力控制器
  • joint_position_controller 位置控制器
  • joint_velocity_controller 速度控制器

2.完善机器人模型的物理仿真

2.1 为link添加惯性参数和碰撞属性

link标签一般包含三部分内容

  • visual,可视化
  • collision,碰撞检测
  • cylinder_inertial_matrix,惯性矩阵

我们看一个例程

<link name="${prefix}_caster_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${caster_radius}" /></geometry><material name="black" /></visual><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${caster_radius}" /></geometry></collision>      <sphere_inertial_matrix  m="${caster_mass}" r="${caster_radius}" />
</link>

2.2 为link添加gazebo标签

主要是为了显示颜色。

<gazebo reference="${prefix}_wheel_link"><material>Gazebo/Gray</material>
</gazebo>

2.3 为joint添加传动装置

<transmission name="${prefix}_wheel_joint_trans"><type>transmission_interface/SimpleTransmission</type><joint name="${prefix}_wheel_joint" ><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface></joint><actuator name="${prefix}_wheel_joint_motor"><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator>
</transmission>

2.4 添加gazebo控制器插件

<!-- controller -->
<gazebo><plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"><rosDebugLevel>Debug</rosDebugLevel><publishWheelTF>true</publishWheelTF># 机器人命名空间<robotNamespace>/</robotNamespace><publishTf>1</publishTf><publishWheelJointState>true</publishWheelJointState><alwaysOn>true</alwaysOn><updateRate>100.0</updateRate><legacyMode>true</legacyMode># 左右轮转动关节<leftJoint>left_wheel_joint</leftJoint><rightJoint>right_wheel_joint</rightJoint># 机器人模型的相关尺寸<wheelSeparation>${wheel_joint_y*2}</wheelSeparation><wheelDiameter>${2*wheel_radius}</wheelDiameter><broadcastTF>1</broadcastTF><wheelTorque>30</wheelTorque><wheelAcceleration>1.8</wheelAcceleration># 控制器订阅的速度指令<commandTopic>cmd_vel</commandTopic># 里程计参考坐标<odometryFrame>odom</odometryFrame> <odometryTopic>odom</odometryTopic> <robotBaseFrame>base_footprint</robotBaseFrame></plugin>
</gazebo>

2.5 在gazebo中加载机器人模型

使用launch文件加载模型

<launch><arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/mbot_gazebo.xacro'" /><arg name="gui" default="true" /><param name="robot_description" command="$(arg model)" /><!-- 设置GUI参数,显示关节控制插件 --><param name="use_gui" value="$(arg gui)"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态  --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><!-- 运行robot_state_publisher节点,发布tf  --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /><!-- 运行rviz可视化界面 --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot.rviz" required="true" /></launch>

二.Gazebo仿真

1.下载模型

下载下列模型,并放置到~/.gazebo/models

https://github.com/osrf/gazebo_models

.gazebo目录需要在home目录下按Ctrl+h显示隐藏目录。

如果没有该目录请自行创建。

2 .初次运行Gazebo

准备工作

运行之前请将本章源码,即guyueclass-main/ros_basic/mbot_gazebo内的三个文件夹拷贝到我们的工作空间~/catkin_ws/src中。

工作空间的创建方法请参考本系列上一篇教程。

随后进入工作空间目录~/catkin_ws进行编译。

# 进入工作空间根目录
cd ~/catkin_ws# 编译工作空间
catkin_make

打开Gazebo

打开一个新的终端

# 打开Gazebo运行空间
roslaunch mbot_gazebo view_mbot_gazebo_empty_world.launch

此时可看到Gazebo环境中出现一辆圆形小车。

控制小车

查看话题列表

rostopic list

可见/cmd_vel速度指令接口。

# 发布速度消息
rostopic pub /cmd_vel geometry_msgs/Twist "linear:x: 0.5y: 0.0z: 0.0
angular:x: 0.5y: 0.0z: 0.0"

可见小车移动。

# 查看位置信息
rostopic echo /odom

此时可见终端打印小车位置信息。

3.在Gazebo中创建模型

Insert 直接添加

在Gazebo左侧栏中找到Insert,可直接添加已有的模型。

在File中的Save world as可以将当前环境保存下来。

Building Editor 绘制

点击Edit中的Building Editor,可自行绘制环境。

4.物理环境运动仿真

打开环境

# 打开Gazebo运行空间
roslaunch mbot_gazebo view_mbot_gazebo_play_ground.launch

此时可见有障碍物的环境。

键盘控制

# 启动键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

此时可用键盘控制移动。

5.摄像头仿真

打开环境

# 打开Gazebo运行空间
roslaunch mbot_gazebo view_mbot_with_camera_gazebo.launch

查看话题列表

rostopic list

可见/camera摄像头接口。

使用rqt_image查看画面,选择自己想看的topic

rqt_image

6.深度相机仿真

打开环境

# 打开Gazebo运行空间
roslaunch mbot_gazebo view_mbot_with_kinect_gazebo.launch

查看话题列表

rostopic list

可见/kinect摄像头接口。

使用RVIZ查看画面

rosrun rviz rviz

坐标系选择odom

添加Pointcloud2和Robotmodel

7.激光雷达仿真

打开环境

# 打开Gazebo运行空间
roslaunch mbot_gazebo view_mbot_with_laser_gazebo.launch

查看话题列表

rostopic list

可见/scan激光雷达接口。

使用RVIZ查看画面

rosrun rviz rviz

坐标系选择odom

添加laderscan和Robotmodel

8.SLAM仿真

8.1 准备工作

  1. 将源码拷贝到工作空间
  2. 安装必要功能包

SLAM部分可能需要安装的功能包

# 点云转雷达
sudo apt-get install ros-melodic-depthimage-to-laserscan
cd ~/catkin_ws/src# 编译所需
git clone https://github.com/ros-planning/navigation_msgs.git
# gmapping
sudo apt-get install ros-melodic-gmapping
cd ~/catkin_ws/src# hector_slam
git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git
# cartographer
sudo apt-get install ros-melodic-cartographer-*
# 保存图片所需
sudo apt-get install ros-melodic-map-server
# rtabmap
sudo apt-get install ros-melodic-rtabmap-ros
  1. 编译
cd ~/catkin_wscatkin_make
  1. 打开环境
# 打开Gazebo运行空间
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch

8.2 Gmapping SLAM

  • 二维SLAM
  • 常用、稳定
  • 深度、IMU(可选)、里程计

激光雷达

# 激光雷达仿真环境
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch# Gmapping Demo
roslaunch mbot_navigation gmapping_demo.launch# 键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

使用键盘控制小车,完成建图。

# 保存地图
rosrun map_server map_saver -f cloister_gmapping

生成.pgm和.yaml文件,默认保存位置为home目录。

深度相机

# 激光雷达仿真环境
roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch# Gmapping Demo
roslaunch mbot_navigation gmapping_demo.launch# 键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

使用键盘控制小车,完成建图。

深度相机效果不好

  • 需要较多的特征点
  • 容易错位

8.3 Hector SLAM

  • 激光雷达
  • 不需要里程计
  • 激光雷达刷新率要高
  • 移动要慢
# 激光雷达仿真环境
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch# Hector Demo
roslaunch mbot_navigation hector_demo.launch# 键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

要慢慢移动,不然极易漂移

# 保存地图
rosrun map_server map_saver -f hector

8.4 Cartographer SLAM

  • 基于图网络
  • 可选里程计
# 激光雷达仿真环境
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch# Cartographer Demo
roslaunch mbot_navigation cartographer_demo.launch# 键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

运行失败

错误信息:

[cartographer_node-1] process has died [pid 2992, exit code -6, cmd /opt/ros/melodic/lib/cartographer_ros/cartographer_node -configuration_directory /home/work/catkin_ws/src/mbot_navigation/config -configuration_basename lidar.lua scan:=scan __name:=cartographer_node __log:=/home/work/.ros/log/8fcd0372-f5b3-11eb-b110-000c295e8fa7/cartographer_node-1.log].
log file: /home/work/.ros/log/8fcd0372-f5b3-11eb-b110-000c295e8fa7/cartographer_node-1*.log

8.5 RTAB SLAM

  • 三维SLAM
# 深度相机仿真环境
roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch# Rtabmap Demo
roslaunch mbot_navigation rtabmap_demo.launch# 键盘控制脚本
roslaunch mbot_teleop mbot_teleop.launch

使用键盘控制小车,完成建图。

查看建图结果。

rtabmap-databaseViewer ~/.ros/rtabmap.db

9.自主导航仿真

本部分代码在/guyueclass-main/planning&perception/mbot_navigation,请复制到工作空间中。

安装move_base导航框架

sudo apt-get install ros-melodic-navigation

配置move_base节点mbot_navigation/launch/move_base.launch

Gmapping建图仿真

# 打开激光雷达仿真环境
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch# 打开Gmapping仿真环境
roslaunch mbot_navigation nav_cloister_demo.launch# 运行定点移动程序
rosrun mbot_navigation move_test.py# 运行随机移动程序
rosrun mbot_navigation exploring_random.py

Gmapping自主建图仿真

# 打开激光雷达仿真环境
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch# 运行自主建图仿真环境
roslaunch mbot_navigation exploring_slam_demo.launch# 运行随机移动程序
rosrun mbot_navigation exploring_random.py

【ROS】ROS入门笔记-Gazebo仿真与实物测试篇相关推荐

  1. ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包

    ROS Noetic入门笔记(一)在ubuntu20.04中安装ROS Noetic并简单测试 ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包 ROS Noetic入门笔记 ...

  2. PHP代码审计入门笔记合集(共20篇)

    早安,我的朋友们. 今天是11月20号,离2021年只41天了,今年你的小目标完成了吗? 跟大家分享件事情,其实这几个月来,我一直在准备一场考试,值得高兴的是,就在前两天终于顺利通过CISSP考试,完 ...

  3. dobot moveit 包_越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩...

    功能包下载链接:https://download.csdn.net/download/qq_42145185/11256475 Magician Robotarm ====== 本文件夹中包含了多个为 ...

  4. Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM+Gazebo仿真运行ORB-SLAM2+各种相关库的安装

    文章目录 一.换源 1.1 通过软件更新 1.2 通过修改源文件 二.安装三方库 2.1 安装必要的依赖项 2.2 安装Pangolin 2.3 安装OpenCV3 2.4 安装Eigen3 三.安装 ...

  5. 越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩

    功能包下载链接:https://download.csdn.net/download/qq_42145185/11256475 Magician Robotarm ====== 本文件夹中包含了多个为 ...

  6. 从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇下)

    sunday功能包使用介绍以及开源 sunday我给自己机械臂的命名,原型是innfos的gluon机械臂.通过sw模型文件转urdf.Sunday项目主要由六个功能包sunday_descripti ...

  7. Linux入门笔记-尚硅谷韩顺平-基础篇实操篇

    文章目录 课程导论 基础篇 Linux入门 Linux介绍 Linux和Unix的关系 Linux和Windows比较 基础篇 Linux的目录结构 基本介绍 具体的目录结构 实操篇 vi和vim的使 ...

  8. ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot

    通过网页快速了解Linux(Ubuntu)和ROS机器人操作系统,请参考实验楼在线系统如下: 初级教程可参考:https://www.shiyanlou.com/courses/854 邀请码:U23 ...

  9. 宇树机器狗gazebo仿真

    宇树机器狗gazebo仿真 一, 安装ROS Noetic 1, 环境 虚拟机下安装好了ubuntu20.04,配置ubuntu软件仓库 允许使用restricted,universe,multive ...

最新文章

  1. 使用Chrome扩展金山词霸取词划意
  2. 方程组求解matlab实现(朴素高斯求解、LU分解、雅可比迭代方法、高斯-塞德尔方法、连续过松弛(SOR))
  3. 2022,普平数据中心招聘来啦!
  4. setNeedsDisplay看我就懂!
  5. Syslink Control使用技巧
  6. idea可以使用flash框架吗_可以使用 C# 的 Web 前端框架 Blazor
  7. 【SpringMVC】返回视图中包含数据(ModelAndView)
  8. css base64 图片背景
  9. Javascript 笔记与总结(2-8)对象2
  10. 【结课报告】游戏中的知识产权
  11. git push时,发生missing tree 或者 missing blob问题
  12. 百度小程序如何搭建对搜索更友好?
  13. 【游戏教程】《星界边境》游戏2D角色分析(一)跳跃、移动、站立动作拆分
  14. linux安全配置技术论文,基于linux平台的web安全技术研究apache安全大学论文.doc
  15. xp计算机连接不上网络打印机驱动,解决win10无法连接到XP计算机共享打印机
  16. 如何批量修改图片名称?
  17. 厦门大学计算机网络实验四
  18. 一文读懂机智云物联网APP开发
  19. 重温离散数学系列①之什么是证明
  20. kafka的Rebalance问题分析(续)

热门文章

  1. ThinkInJava 中文版-下载
  2. android 9.0 GMS 修改google 语音助手需求-- EEA版本需求
  3. linux+find参数详解,Linux下find命令详解
  4. GPS追踪工具Traccar体验
  5. Unable to read file for extraction: gdx64.dll
  6. 快来看这份 Matplotlib 使用小抄,不全找我
  7. 苹果公司雇佣前ATI图形芯片设计师
  8. 从输入URL到页面成功展示到浏览器的过程?
  9. Godot教程中文版-脚本2(Scripting2)
  10. 启动计算机引导windows10,win10电脑启动界面提示windows boot manager怎么解决