ROS——Gazebo仿真——四轮小车(SmartCar)详细教程

321
1
2020年11月13日 09时36分
  • 文章目录
  1. 教程描述
  2. 准备工作
    2.1 创建工作空间
    2.2 创建ROS硬件描述包
  3. 小车模型示意图
  4. 创建urdf描述文件
  5. 创建launch文件
  6. rviz模型展示
    6.1 添加Displays
    6.2 修改参数
  7. 可能遇到的问题
    7.1 No transform from [base_link] to .
    参考文献:

1 教程描述

本教程参考古月前辈的SmartCar教程,教程写的非常全面,对自己的ROS学习有很大的帮助,在此先谢过。在学习的过程中发现他的教程比较精简,而且使用的ROS版本比较旧,因此在看着教程复现的过程中会出现一些麻烦,因此便想着在他教程的基础上丰富下内容,增加一些个人的见解,同时将学习过程中遇到的问题、问题的解决方法一并写出来,供其他新学者参考,若有问题之处还望大家指出,以便可以即使纠正。

 

主要实现内容为在ROS环境下基于Gazebo仿真软件创建一个四轮小车,并实现小车的控制,如下图所示,接下来教程将会进行详细解释。

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图

2. 准备工作

2.1 创建工作空间
创建ROS工作空间,命名为SmartCar,并在该工作空间中创建src文件

 

mkdir -p /SmartCar/src

 

初始化工作空间

 

cd /SmartCar
catkin_init_workspace

 

2.2 创建ROS硬件描述包

 


cd /src
roscreate-pkg smartcar_description urdf

 

3. 小车模型示意图

小车的车体主要由以下两部分构成:25cm x 16cm x 5cm的长方体作为小车的车体,直径5cm、高2cm的圆柱作为小车的轮子,四个轮子尺寸一样,只是安装位置不同。

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(1)

 

4. 创建urdf描述文件

在smartcar_description文件夹下创建urdf文件夹,并创建智能车的描述文件smartcar.urdf,写入下述代码:

 

<?xml version="1.0"?> 
<robot name="smartcar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.25 .16 .05"/>
            </geometry>

            <origin rpy="0 0 1.57075" xyz="0 0 0"/>

            <material name="blue">
                <color rgba="0 .5 .8 1"/>
            </material>
        </visual>
    </link>

    <link name="right_front_wheel">  
        <visual>  
            <geometry>  
                <cylinder length=".02" radius="0.025"/>  
            </geometry>  

            <material name="black">  
                <color rgba="0 0 0 1"/>  
            </material>  
        </visual>  
    </link>  

    <joint name="right_front_wheel_joint" type="continuous">  
        <axis xyz="0 0 1"/>  
        <parent link="base_link"/>  
        <child link="right_front_wheel"/>  
        <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>  
        <limit effort="100" velocity="100"/>  
        <joint_properties damping="0.0" friction="0.0"/>  
    </joint>  

    <link name="right_back_wheel">  
    <visual>  
        <geometry>  
        <cylinder length=".02" radius="0.025"/>  
        </geometry>  
        <material name="black">  
        <color rgba="0 0 0 1"/>  
        </material>  
    </visual>  
    </link>  

    <joint name="right_back_wheel_joint" type="continuous">  
        <axis xyz="0 0 1"/>  
        <parent link="base_link"/>  
        <child link="right_back_wheel"/>  
        <origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>  
        <limit effort="100" velocity="100"/>  
        <joint_properties damping="0.0" friction="0.0"/>  
    </joint>  

    <link name="left_front_wheel">  
        <visual>  
            <geometry>  
                <cylinder length=".02" radius="0.025"/>  
            </geometry>  
            <material name="black">  
                <color rgba="0 0 0 1"/>  
            </material>  
        </visual>  
    </link>  

    <joint name="left_front_wheel_joint" type="continuous">  
        <axis xyz="0 0 1"/>  
        <parent link="base_link"/>  
        <child link="left_front_wheel"/>  
        <origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>  
        <limit effort="100" velocity="100"/>  
        <joint_properties damping="0.0" friction="0.0"/>  
    </joint>  

    <link name="left_back_wheel">  
        <visual>  
            <geometry>  
                <cylinder length=".02" radius="0.025"/>  
            </geometry>  
            <material name="black">  
                <color rgba="0 0 0 1"/>  
            </material>  
        </visual>  
    </link>  

    <joint name="left_back_wheel_joint" type="continuous">  
        <axis xyz="0 0 1"/>  
        <parent link="base_link"/>  
        <child link="left_back_wheel"/>  
        <origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>  
        <limit effort="100" velocity="100"/>  
        <joint_properties damping="0.0" friction="0.0"/>  
    </joint>  

    <link name="head">  
        <visual>  
            <geometry>  
                <box size=".02 .03 .03"/>  
            </geometry>  
            <material name="white">
                <color rgba="1 1 1 1"/>  
            </material>  
        </visual>  
    </link>  

    <joint name="tobox" type="fixed">  
        <parent link="base_link"/>  
        <child link="head"/>  
        <origin xyz="0 0.08 0.025"/>  
    </joint>  
</robot>

 

.urdf文件主要有两部分构成:和,两者的关系如下图所示。

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(2)

 

其中…主要描述模型硬件结构的属性信息,里面对轮子的形状、颜色、质量、惯性等信息进行了语言描述;…可以理解为两个…之间的连接间,如图中蓝色框所示,主要描述两个…之间的位置等固定连接信息。

 

文中的结构可以简化为下面的格式,定义一个robot标签,在标签中定义base_link和right_front_wheel两个标签,两个标签的后面跟着描述base_link和right_front_wheel关系的joint

 

<?xml version="1.0"?> 
<robot name="smartcar">
    <link name="base_link">
    ...
    </link>

    <link name="right_front_wheel">  
    ...
    </link>

    <joint name="left_front_wheel_joint" type="continuous">  
    ...
    </joint>
</robot>

 

在link中定义了小车的外观,以base_link为例。

 

<link name="base_link">
        <visual>   <!--视觉信息-->
            <geometry>    <!--几何形状信息-->
                <box size="0.25 .16 .05"/>    <!--形状为矩形盒子(还有其他可选形状,如圆、圆柱等),大小为"0.25 0.16 0.05"-->
            </geometry>

            <origin rpy="0 0 1.57075" xyz="0 0 0"/> <!--rpy代表欧拉角,绕着z轴转动90度;xyz代表在xyz三轴上的位移-->

            <material name="blue">    <!--材料信息-->
                <color rgba="0 .5 .8 1"/>    <!--定义颜色信息-->
            </material>
        </visual>
    </link>

 

在每个信息标签中除了上述的类型外还有其他的信息可以增加,需要的请自行查阅。

在joint中定义两个link的连接信息,以right_front_wheel_joint为例。

 

<joint name="right_front_wheel_joint" type="continuous">  
        <axis xyz="0 0 1"/>  
        <parent link="base_link"/>  
        <child link="right_front_wheel"/>  <!--将子link(right_front_wheel)连接到父link(base_link)上-->
        <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>  <!--连接位置-->
        <limit effort="100" velocity="100"/>  
        <joint_properties damping="0.0" friction="0.0"/>  
</joint>

 

对上述信息不太清楚的朋友可以再查阅相关资料,或者自己动手修改参数试试便知。

 

5. 创建launch文件

在/smartcar_description文件夹下建立launch文件夹,并创建智能车的launch文件 base.urdf.rviz.launch,描述代码如下:

 

<launch>
    <arg name="model" />
    <arg name="gui" default="False" />
    <param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
    <param name="use_gui" value="$(arg gui)"/>
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />
</launch>

 

在旧版本ROS中使用该语句启动rviz

 

6. rviz模型展示

在工作空间/SmartCar路径下,先source下工作空间的路径

 

source devel/setup.bash

 

然后运行.launch文件

roslaunch servo_description base.urdf.rviz.launch

 

这时候你会发现rviz会自动打开,rviz的配置如下:

 

6.1 添加Displays

自动打开的rviz如下图所示,需要我们自己添加现实的内容,从而显示出小车

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(3)

点击左下角的Add添加显示内容到Display

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(4)

 

选择RobotModel,并点击确认添加到Display

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(5)

 

6.2 修改参数

添加过RobotModel后rviz显示如下图,这时候还不可以正常显示小车,可以点击Display中“RobotModel”选项,并点击“Status:Error”查看详细错误提示,提示为“No transform from [base_link] to .”类型,这是需要修改Fixed Frame选项。

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(6)

 

修改Fixed Frame为base_link即可正常显示,如下图。

 

ROS——Gazebo仿真——四轮小车(SmartCar)详细教程插图(7)

 

7. 可能遇到的问题

7.1 No transform from [base_link] to .

没有修改Fixed Frame,详情请看6.2章节。
.urdf文件有误,可以使用下述语句查看

 

check_urdf smartcar.urdf

 

参考文献:

古月老师博客

发表评论

后才能评论

评论列表(1条)

  • 林洋 2020年11月23日 上午10:56

    小编 你好,我在运行过程中出现了这个错误问题,是什么原因呢?[base.urdf.rviz.launch] is neither a launch file in package [servo_description] nor is [servo_description] a launch file name
    The traceback for the exception was written to the log file
    某博客看到说是需要设置一下环境变量,尝试了一下并没有解决。