【ROS】中级操作学习整理-gazebo机器人仿真

系列文章目录

·【ROS】中级操作学习整理-gazebo机器人仿真

·【ROS】中级操作学习整理-TF坐标变换

·【ROS】中级操作学习整理-传感器建模

·【ROS】中级操作学习整理-激光SLAM

对于ROS的学习,其实我很早就开始了,先是跟着古月居老师的【ROS入门21讲】学了一遍,对ROS有了一个大概的认识,但是当时学完的感觉就是很懵逼,只知道跟着写代码,一些概念和程序多半是死记硬背,一遍学下来感觉什么也记不住,主要原因可能是当时刚上大二,C++基础一般,学习能力也比较弱(大一摸鱼混了一年),自己的理解能力很差,学完一遍后也没及时应用(没加实验室是我很后悔的),导致我学玩一边只记得一些很寻常的概念。

现在在做SLAM方向,要把ROS捡起来再学一遍了,对于前面的基础课程,可以看入门21讲,个人感觉中科院的ROS讲的也很不错,当然,最经典的还是roswiki的入门教程,我感觉很足够了,这里就不介绍初级教程了,直接进入中级篇。

对于一些ROS学习方法和路线,我整理在了这篇文章中

一、gazebo介绍

 gazebo是ROS的常用组件之一,是用来进行机器人仿真的平台,采用统一的机器人描述格式,可以对机器人的物理力学性能进行仿真,另外gazebo还提供了插件,可以在仿真环境中,通过我们自己编写的程序对机器人进行控制,也可以对机器人的传感器进行仿真,反正就是很方便,具体的介绍很多教程都有,我就不说了,直接开始正题。

打开gazebo的语句:

roslaunch gazebo_ros empty_world.launch

二、机器人模型描述

要实现物理上逼真的动力学仿真,必须足够详细的描述对象,一般详细的建模分为三部分:动力学模型、碰撞模型和视觉模型,对于有控制关节的机器人,还需要指定运动学模型。

1.运动学模型

gazebo中的机器人认为是由一系列的连杆和关节组成的,这与机器人学中的机器人描述相同,建模方法有DH法和改进DH法,在gazebo中使用的机器人描述格式为urdf格式,它使用xml语言,采用标签的方法进行书写,下面这段例子:

<link name="base_footprint">

</link>

<joint name="base_footprint_joint" type="fixed">
    <origin xyz="0 0 0" rpy="0 0 0" />        
    <parent link="base_footprint"/>
    <child link="base_link" />
</joint>

<link name="base_link">
    <visual>

    </visual>
</link>

定义了两个连杆(base_footprint个base_link)之间用一个关节(base_footprint_joint)连接,link标签中,没有定义任何其他属性,只说了连杆的名字,关节标签中说明了连杆的名字和关节类型(比如平动、转动、浮动等),origin标签说明了关节坐标系的位姿(平移和旋转),parent标签说明了父关节,child标签说明了子关节。

下面我们为其中的连杆添加更多的信息。

2.视觉模型

这个很好理解,就是用于图形显示,视觉模型通常和碰撞模型相同,但是视觉模型有更高的保真度,在视觉模型部分,我们可以为机器人添加颜色、反射率、透明度、材料等描述,一般用的比较多的参数是材料、颜色和形状


        <link name="base_footprint">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <geometry>
                    <box size="0.001 0.001 0.001" />
                </geometry>
            </visual>
        </link>

        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />        
            <parent link="base_footprint"/>
            <child link="base_link" />
        </joint>

        <link name="base_link">
            <visual>
                <origin xyz=" 0 0 0" rpy="0 0 0" />
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow" />
            </visual>
        </link>

在这段代码中,我们为关节添加了一个视觉模型标签visual,这个标签中有一些参数:

  • origin:视觉模型的坐标系位姿
  • geometry:连杆形状,这里只有一些简单的模型,比如圆柱(cylinder)、立方体(box),如果想要更逼真的效果,可以使用mesh标签进行渲染
  • material:材料、颜色、透明度等,这里我直接写的name=,是因为我在上面自定义了yellow的内容(RGB数值)

经过视觉模型的定义,我们的小车加载到gazebo环境中就可以看到它的样子了。

 图片是我定义了更多的参数,包括摄像头,这只是说明一下效果。

3.动力学模型

动力学模型主要定义每个连杆的质量属性和惯性,相当于对连杆本身特性的一个描述,常用的参数是质量和惯性矩阵

<link name="base_link">
        <visual>
            <geometry>
                <box size="${bodylen} ${bodywidth} ${bodyheight}"/>
            </geometry>
            <origin xyz="${bodyOX} ${bodyOY} ${bodyOZ}" rpy="0 0 0"/>
        </visual>
        <inertial>
            <!--assign almost all the mass to the main body box; set m= 100kg; treat I as approx m*r^2 -->
            <mass value="100" />
            <inertia ixx="10" ixy="0" ixz="0"
              iyy="10" iyz="0"
              izz="10" />
        </inertial>
    </link>

这里我为小车定义了动力学模型,它的主要参数就是质量mass和惯性矩阵inertia,关于关联矩阵的知识可以看机器人学。

4.碰撞模型

碰撞模型主要用来规定两个物体相互作用时的处理方法,主要参数是形状

<link name="base_link">
        <visual>
            <geometry>
                <box size="${bodylen} ${bodywidth} ${bodyheight}"/>
            </geometry>
            <origin xyz="${bodyOX} ${bodyOY} ${bodyOZ}" rpy="0 0 0"/>
        </visual>
        <collision>
            <geometry>
                <box size="${bodylen} ${bodywidth} ${bodyheight}"/>
            </geometry>
            <origin xyz="${bodyOX} ${bodyOY} ${bodyOZ}" rpy="0 0 0"/>
        </collision>
        <inertial>
            <!--assign almost all the mass to the main body box; set m= 100kg; treat I as approx m*r^2 -->
            <mass value="100" />
            <inertia ixx="10" ixy="0" ixz="0"
              iyy="10" iyz="0"
              izz="10" />
        </inertial>
    </link>

最后再为小车添加碰撞模型,使用collision标签,它的主要参数是坐标系位姿origin和形状geometry,它和视觉模型很像,你可以把它想象成透明度视觉模型,当有物体碰到这个模型时会发生碰撞。

在构建完机器人模型后,我们可以使用下面的代码,来检查我们的机器人模型是否正确

check_urdf mbot_with_camera_gazebo.urdf

显示结果如下:

 也可以使用下面的代码,直接生成更直观的pdf图:

urdf_to_graphiz mbot_with_camera_gazebo.urdf 

在当前目录下生成了一个pdf文件,如下图:

5.模型优化

除了urdf格式,ros提供了一种更加简便的方式去方便用户书写机器人模型,那就是xacro格式,这种格式可以使机器人模型更加模块化,可以定义通用参数、可以调用其他xacro文件、可以进行代数运算等等,最好的是其中描述机器人的格式和urdf一样,只是增加了简单的语法,方便我们使用,可以说很友好了。

下面是一些xacro文件语句的介绍:

 忘了说了,最上面的两行是用来说明xml的版本要求和机器人模型标签,这块学别人的写就行,不用记。

定义了xacro模型后,可以使用下面的语句将xacro格式转换为urdf格式,因为gazebo只认urdf格式

rosrun xacro xacro 你的xacro文件名.xacro > 生成的urdf文件名.urdf

也可以在launch文件中,直接写代码将xacro文件加入到gazebo环境中:

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

6.物理引擎

gazebo的另一个强大之处在于它支持各种各样的插件,这些插件包括传感器插件、关节控制插件等等,它们的存在可以方便用户便捷的对其进行可视化操作、获取其中关节的状态等,它们在xacro文件中一般是这样描述的:

 它是在gazebo标签下,使用plugin标签进行描述的,其中filename是指定使用到的插件静态库,下面设置了一些参数,比如移动控制的话题(commandTopic)、里程计坐标系(odometryFrame)具体更多插件的细节就不展开了,可以去roswiki查看。

我们也可以在gazebo标签下直接设置关于gazebo的各种参数,这里也不详细说,可以查看roswiki

三、话题使用

建立好机器人模型后,我们就可以在gazebo中把模型加载进来,然后根据它发布的一些话题对他进行一些操作了,写写好launch文件,将小车加载进gazebo环境:

<launch>

    <!-- 设置launch文件的参数 -->
    <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="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 mbot_description)/urdf/xacro/gazebo/mbot_with_camera_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>

执行代码:

roslaunch mbot_gazebo view_mbot_gazebo_empty_world.lanch

 然后我们查看一下有哪些话题,我们可以操作:

rostopic list

 有着一些列话题,其中有控制速度的/cmd_vel,摄像头拍摄的图像话题/camera/image_raw

我们可以使用键盘控制器来控制小车运动:

 也可以打开一个rviz或者qt,订阅一下摄像头的画面看一下:

打开rviz:

rosrun rviz rviz

打开rqt:

rqt_image_view


总结

大概就这样吧,这只是仿真中比较基础的一些操作,基本可以满足日常使用了,我们可以多看别人的文件,学习更多使用,平时能看懂就行,平时项目需要我们自己建模的场合也不多,另外也可以使用SolidWorks建模,然后转换成urdf格式,这样更加简便了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值