ROS Gazebo安装入门及仿真室内环境和小车实现(十九)

目录

安装

简介

URDF与Gazebo基本集成流程

创建功能包

编写URDF文件 

启动Gazebo并显示模型

 launch 文件实现:

命令行启动(去掉launch中的第三行加载模型)

 集成到launch里启动

 URDF集成Gazebo相关设置

collision 

 inertial

颜色设置 

 URDF集成Gazebo实操

框架搭建 

 编写封装惯性矩阵算法的 xacro 文件

 底盘修改

驱动轮修改

支撑轮修改

 传感器修改

 雷达修改

Gazebo仿真环境搭建

方式一:用别人的仿真环境 

 方式二:自己搭建环境

 方式三:自定义仿真环境

 下载官方模型库


安装

Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,gzebo会默认被安装。

运行使用命令gazeborosrun gazebo_ros gazebo

注意1:在 Ubuntu20.04 与 ROS Noetic 环境下,gazebo 启动异常以及解决

  • 问题1:VMware: vmw_ioctl_command error Invalid argument(无效的参数)

    解决:

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

    source .bashrc

  • 问题2:[Err] [REST.cc:205] Error in REST request

    解决:sudo gedit ~/.ignition/fuel/config.yaml

    然后将url : https://api.ignitionfuel.org使用 # 注释

    再添加url: https://api.ignitionrobotics.org

  • 问题3:启动时抛出异常:[gazebo-2] process has died [pid xxx, exit code 255, cmd.....

    解决:killall gzserverkillall gzclient

注意2:如果 gazebo没有安装,请自行安装:

1.添加源:

sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" 
>
 /etc/apt/sources.list.d/gazebo-stable.list'

wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

2.安装:

第一步
sudo apt update
第二步
sudo apt install gazebo11 
第三步
sudo apt install libgazebo11-dev

简介

URDF 需要集成进 Rviz 或 Gazebo 才能显示可视化的机器人模型,前面已经介绍了URDF 与 Rviz 的集成,本节主要介绍:

  • URDF 与 Gazebo 的基本集成流程;
  • 如果要在 Gazebo 中显示机器人模型,URDF 需要做的一些额外配置;
  • 关于Gazebo仿真环境的搭建。

URDF与Gazebo基本集成流程

URDF 与 Gazebo 集成流程与 Rviz 实现类似,主要步骤如下:

  1. 创建功能包,导入依赖项

  2. 编写 URDF 或 Xacro 文件

  3. 启动 Gazebo 并显示机器人模型

创建功能包

 

编写URDF文件 

 

<!-- 
    创建一个机器人模型(盒状即可),显示在 Gazebo 中 
-->

<robot name="mycar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="yellow">
                <color rgba="0.5 0.3 0.0 1" />
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
        <inertial>
            <origin xyz="0 0 0" />
            <mass value="6" />
            <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
        </inertial>
    </link>
    <gazebo reference="base_link">
        <material>Gazebo/Black</material>
    </gazebo>

</robot>

 一个是设置碰撞参数一个是设置连杆矩阵的

注意, 当 URDF 需要与 Gazebo 集成时,和 Rviz 有明显区别:

1.必须使用 collision 标签,因为既然是仿真环境,那么必然涉及到碰撞检测,collision 提供碰撞检测的依据。

2.必须使用 inertial 标签,此标签标注了当前机器人某个刚体部分的惯性矩阵,用于一些力学相关的仿真计算。

3.颜色设置,也需要重新使用 gazebo 标签标注,因为之前的颜色设置为了方便调试包含透明度,仿真环境下没有此选项。

如果是标准集合体,复制visual的geometry和origin即可 

        <collision>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>

惯性矩阵

<mass value>代表的是质量此处为6kg

 <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />

        <inertial>
            <origin xyz="0 0 0" />
            <mass value="6" />
            <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
        </inertial>

启动Gazebo并显示模型

 launch 文件实现:

<include file="$(find gazebo_ros)/launch/empty_world.launch" />这个是直接用默认gazebo配置无需新建 empty_world.launch

这个launch是在gazebo_ros包里的

<launch>

    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" textfile="$(find demo02_urdf_gazebo)/urdf/urdf01_helloworld.urdf" />

    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

跟rviz不同还需要一行命令让gazebo显示机器人模型

<include file="$(find gazebo_ros)/launch/empty_world.launch" />
<!-- 启动 Gazebo 的仿真环境,当前环境为空环境 -->
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />

<!-- 
    在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
    -urdf 加载的是 urdf 文件
    -model mycar 模型名称是 mycar
    -param robot_description 从参数 robot_description 中载入模型
    -x 模型载入的 x 坐标
    -y 模型载入的 y 坐标
    -z 模型载入的 z 坐标
-->

 args="-urdf -model mycar -param robot_description"  />

-urdf 要用urdf类型数据 

-model mycar 模型取名叫mycar

 -param robot_description要加载的模型是从 robot_description获取的

命令行启动(去掉launch中的第三行加载模型)

 

 

 此时gazebo是空的

启动命令传给gazebo参数

 集成到launch里启动

 

 

 此时就完成了

 URDF集成Gazebo相关设置

 较之于 rviz,gazebo在集成 URDF 时,需要做些许修改,比如:必须添加 collision 碰撞属性相关参数、必须添加 inertial 惯性矩阵相关参数,另外,如果直接移植 Rviz 中机器人的颜色设置是没有显示的,颜色设置也必须做相应的变更。

collision 

 如果机器人link是标准的几何体形状,和link的 visual 属性设置一致即可。

 inertial

 惯性矩阵的设置需要结合link的质量与外形参数动态生成,标准的球体、圆柱与立方体的惯性矩阵公式如下(已经封装为 xacro 实现):

推导见下面的链接

(67条消息) ROS漫漫长路(一)——Gazebo中机器人圆柱,球,长方体惯性矩阵推导与代码实现_lzzzzzzm的博客-CSDN博客_长方体的惯性矩阵

 转动惯量的SI单位为kg·m²。对于一个质点,I=mr²,其中,m是其质量,r是质点和转轴的垂直距离。

 

所以对称物体的ixy ixz iyz iyx iyz izx izy为0 

(因为积分为0)

 球体惯性矩阵

<!-- Macro for inertia matrix -->
    <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>

圆柱惯性矩阵

<xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

 立方体惯性矩阵

 <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>

 需要注意的是,原则上,除了 base_footprint 外,机器人的每个刚体部分都需要设置惯性矩阵,且惯性矩阵必须经计算得出,如果随意定义刚体部分的惯性矩阵,那么可能会导致机器人在 Gazebo 中出现抖动,移动等现象。

颜色设置 

 在 gazebo 中显示 link 的颜色,必须要使用指定的标签:

<gazebo reference="link节点名称">
     <material>Gazebo/Blue</material>
</gazebo>

PS:material 标签中,设置的值区分大小写,颜色可以设置为 Red Blue Green Black .....

 URDF集成Gazebo实操

需求描述:

将之前的机器人模型(xacro版)显示在 gazebo 中

实现流程:

  1. 需要编写封装惯性矩阵算法的 xacro 文件

  2. 为机器人模型中的每一个 link 添加 collision 和 inertial 标签,并且重置颜色属性

  3. 在 launch 文件中启动 gazebo 并添加机器人模型

框架搭建 

 编写封装惯性矩阵算法的 xacro 文件

新建文件复制以下代码

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <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>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

把之前的小车xacro实现复制进来 

具体见 

(15条消息) ROS xacro URDF优化(十七)_啥也不是的py人的博客-CSDN博客https://blog.csdn.net/weixin_50920579/article/details/124189174?spm=1001.2014.3001.5501

 修改car.urdf.xacro

要增加包含惯性矩阵的xacro

 

 底盘修改

因为直接用的之前的rviz的xacro文件,所以要对应进行修改

对link增加<collision>属性

 跟visual保持一致就行

 

 调用xacro interia matrix


<!-- diaoyong interia matrix  -->
<xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_link_radius}" h="${base_link_length}">

另外设置一下全局变量

<xacro:property name="base_mass" value="2" />

 最后是颜色设置

    <gazebo reference="base_link">
      <material>Gazebo/Yellow</material>
    </gazebo>

此处就完成了车体部分设置

然后执行一下看看有没有错

 

 可以看到车体正常显示了

雷达和摄像头还没有正常显示

驱动轮修改

添加<collision>

 

 添加颜色

 添加惯性矩阵

 

运行

 可以看到多出了红色的轮子

支撑轮修改

 设置<collision>

 添加惯性矩阵

 

 设置颜色

 运行

 传感器修改

<collision> 

 

惯性矩阵 

 

 

颜色设置 

 雷达修改

先改支架

 

惯性矩阵修改 

 

 颜色修改

 雷达修改

 

惯性矩阵调用 

 

 颜色修改

运行

 运行成功

Gazebo仿真环境搭建

 

到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木... 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境

  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

方式一:用别人的仿真环境 

以下为素材链接可以直接git clone下载 

 GitHub - zx595306686/sim_demoicon-default.png?t=M3K6https://github.com/zx595306686/sim_demo.git

 

新建目录并且把.world放进去 

 

 新建launch环境

 world_name是固定参数

启动

 方式二:自己搭建环境

启动gazebo

 

然后自己搭建再另存为即可 

 

另存为即可 

 

 方式三:自定义仿真环境

 

创建墙体 

 

创建门窗 

 

改变材质,改变颜色 

 

 

使用官方提供的插件

当前 Gazebo 提供的仿真道具有限,还可以下载官方支持,可以提供更为丰富的仿真实现,具体实现如下:

 下载官方模型库

git clone https://github.com/osrf/gazebo_models

之前是:hg clone https://bitbucket.org/osrf/gazebo_models但是已经不可用

注意: 此过程可能比较耗时

3.2 将模型库复制进 gazebo

将得到的gazebo_models文件夹内容复制到 /usr/share/gazebo-*/models

3.3 应用

重启 Gazebo,选择左侧菜单栏的 insert 可以选择并插入相关道具了

  • 4
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值