用urdf给自己的ROS小车编写模型

3.3 使用urdf编写自己的ROS小车模型

3.3.1 常见的ROS小车结构有哪些?

下面就是常见的ROS小车,相信在大家的脑海里已经有了自己小车的样子,下面我和大家一起使用urdf对ros小车建模。

image-20200901075813068

这里只对urdf进行简单介绍,然后就带大家使用urdf最基础的标签,建立机器人的urdf机器人模型。关于更多细节,请参看官网:http://wiki.ros.org/urdf/Tutorials

3.3.2 什么是urdf?建模的原因?

什么是urdf?

URDF(Unified Robot Description Format),统一机器人描述格式。 在 ROS 中,大家通常使用 urdf 对机器人模型进行描述,主要的作用就是维护机器人关节的 tf 树以及用于机器人模型3D 可视化的作用,关于其他的作用,这里并没有使用到。

建模的原因?

关于机器人TF树,这里要对它进行详细说明,为的是让大家清楚建立机器人模型的一个主要原因。

ROS中的很多软件包都需要机器人发布tf变换树,那么什么是tf变换树呢?

抽象的来讲,一棵tf变换树定义了不同坐标系之间的平移与旋转变换关系。

具体来说,我们假设有一个机器人,包括一个机器人移动平台和一个安装在平台之上的激光雷达,以这个机器人为例,定义两个坐标系,一个坐标系以机器人移动平台的中心为原点,称为base_link参考系,另一个坐标系以激光雷达的中心为原点,称为base_laser参考系。

image-20200903220127848

假设在机器人运行过程中,激光雷达可以采集到距离前方障碍物的数据,这些数据当然是以激光雷达为原点的测量值,换句话说,也就是base_laser参考系下的测量值。现在,如果我们想使用这些数据帮助机器人完成避障功能,当然,由于激光雷达在机器人之上,直接使用这些数据不会产生太大的问题,但是激光雷达并不在机器人的中心之上,在极度要求较高的系统中,会始终存在一个雷达与机器人中心的偏差值。这个时候,如果我们采用一种坐标变换,将及激光数据从base_laser参考系变换到base_link参考下,问题不就解决了么。于是我们就需要定义这两个坐标系之间的变换关系。

为了定义这个变换关系,假设我们已知激光雷达安装的位置在机器人的中心点上方20cm,前方10cm处。这就根据这些数据,就足以定义这两个参考系之间的变换关系:当我们获取激光数据后,采用(x: 0.1m, y: 0.0m, z: 0.2m)的坐标变换,就可以将数据从base_laser参考系变换到base_link参考系了。当然,如果要方向变化,采用(x: -0.1m, y: 0.0m, z: -0.20m)的变换即可。

从上边的示例看来,参考系之间的坐标变换好像并不复杂,但是在复杂的系统中,存在的参考系可能远远大于两个,如果我们都使用这种手动的方式进行变换,估计很快你就会被繁杂的坐标关系搞蒙了。ROS提供的tf变换就是为解决这个问题而生的,tf功能包提供了存储、计算不同数据在不同参考系之间变换的功能,我们只需要告诉tf树这些参考系之间的变换公式即可,这颗tf树就可以用树的数据结构管理我们所需要的参考系变换。

image-20200903220846457

如上图所示,每两个相邻的坐标系之间都有变换关系,也就是tf变换。我们需要通过机器人的urdf模型文件,向tf树发布机器人相关tf和关节状态,这也是建立机器人urdf模型的主要原因之一。

3.3.3 介绍urdf部分细节

大家都知道,几乎所有机器人都可以用连杆和关节组成;对于不同形状的机器人,连杆大小和关节的分布不同。urdf就是采用这用方式,使用连杆link和关节joint共同组成机器人结构。

robot

image-20200903224032351

link

描述机器人某个刚体部分的外观和物理属性。

包括大小(size)、颜色(color)、形状(shape)、惯性参数(inertial matrix)、碰撞参数(collision properties)等。

如下面所示,描述一个原点origin设置为零,坐标系无任何旋转,几何形状geometry为半径=0.075m,长度=0.104m的圆柱,物理属性material颜色为黄色,可设置三基色rgb和透明度a。

    <link name="base_link">                                   <!-- 连杆的名字,自定义,也可以理解为一个三维坐标系 -->
        <visual>                                              <!-- 可视化标签 -->
            <origin xyz=" 0 0 0" rpy="0 0 0" />               <!-- 原点设置标签:原点为集合中心上,欧拉角为零,无任何方向旋转 -->
            <geometry>                                        <!-- 几何形状标签 -->
                <cylinder radius="0.075" length = "0.104"/>   <!-- 此形状圆柱,若为方形 <box size="0.03 0.157 0.03" /> 参数长宽高、若为球体 <sphere radius="0.0125" /> 参数半径  -->
            </geometry>
            <material name="yellow">                          <!-- 物理属性标签,此name的颜色并不起作用,用作示意 -->
                <color rgba="1 0.4 0 1"/>                     <!-- 可设置连杆rgb三基色和a透明度 -->
            </material>
        </visual>
    </link>

joint

描述机器人关节的运动学和动力学属性;

包括关节运动的位置和速度限制;根据具体的关节运动形式分为六种类型。

image-20200902081549987

如下面所示,描述了一个链接 父link 和 子link,绕y 轴可持续旋转的节关节joint。

    <joint name="left_wheel_joint" type="continuous">  <!-- name关节名字、type关节类型-->
        <origin xyz="0.0 0.0785 -0.085" rpy="0 0 0"/>  <!-- 关节无尺寸大小 ,origin原点必须参照parent link设置。这里表示该关节以父link原点为准,设置在向y轴正方向0.0785m,向z轴负方向0.085m的地方 -->
        <parent link="base_link"/>                     <!-- 父link名字 -->
        <child link="left_wheel_link"/>                <!-- 子link名字 -->
        <axis xyz="0 1 0"/>                            <!-- 此节点绕y轴旋转 -->
    </joint>

关于 origin xyz=" 0 0 0" rpy=“0 0 0” 的参数还是有点说法的,一般连杆的原点坐标xyz都设置为零,但是rpy(欧拉角:弧度制)有时候会变化。一般关节的原点都有坐标,rpy都设置为零。

欧拉角RPY分别代表Roll(滚转角),Pitch(俯仰角),Yaw(偏航角),分别对应绕XYZ轴旋转。旋转的正方向是,从XYZ轴的箭头方向看过去,顺时针为正,逆时针为负。

image-20200903225150005

比如这里 origin xyz=“0 0 0” rpy=“1.5707 0 0” ,就表示连杆模型绕X轴顺时针旋转1.5707rad=90度。

3.3.4 使用urdf建立自己的ROS小车模型

  • 在自己的工作空间下建立机器人模型描述功能包
cd ~/catkin_test_ws/src/
catkin_create_pkg robot_description urdf xacro
  • 创建urdf、launch、config、meshes文件夹
cd robot_description/
mkdir urdf launch config meshes

image-20200903234727328

urdf存放机器人模型文件

launch存放相关启动文件

config 保存rviz的配置文件,可用可不用 ,使用rviz保存配置的时候用来存放的位置。

meshes存放urdf引用的模型渲染文件,可用可不用,如果有渲染的模型文件就用,没有也没关系。

  • 编写ROS小车urdf模型文件
cd urdf/
vim robot_with_laser.urdf

urdf文件内容如下:

<?xml version="1.0" ?>
<robot name="robot">

    <link name="base_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="0.16" radius="0.20"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>

    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.06" length = "0.025"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.06" length = "0.025"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="front_caster_joint" type="continuous">
        <origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="0.015" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="back_caster_joint" type="continuous">
        <origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_caster_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="back_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="0.015" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <link name="laser_link">
		<visual>
			<origin xyz=" 0 0 0 " rpy="0 0 0" />
			<geometry>
				<cylinder length="0.05" radius="0.05"/>
			</geometry>
			<material name="black"/>
		</visual>
    </link>

    <joint name="laser_joint" type="fixed">
        <origin xyz="0 0 0.105" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="laser_link"/>
    </joint>

</robot>
  • 检查urdf模型整体结构
cd ~/catkin_test_ws/src/robot_description/urdf
urdf_to_graphiz robot_with_laser.urdf

这里生成两个文件,查看pdf如下图。

image-20200904004620960

  • 编写显示模型的launch文件
cd ..
cd launch
vim dispaly_robot_with_laser.launch

launch的内容如下:

<launch>
	<param name="robot_description" textfile="$(find robot_description)/urdf/robot_with_laser.urdf" />

	<!-- 运行joint_state_publisher_gui节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
	
	<!-- 运行robot_state_publisher节点,发布tf,将机器人的连杆关节之间的关系,通过TF的形式,整理成三维姿态发布出去  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
	
</launch>
  • 运行luanch文件
cd ~/catkin_test_ws
catkin_make
source devel/setup.bash
rospack	profile
roslaunch robot_description dispaly_robot_with_laser.launch 

将出现下面这样的错误,原因是,joint_state_publisher_gui功能包默认没有安装。

image-20200904001051051

解决方法:

sudo apt-get install ros-kinetic-joint-state-publisher
sudo apt-get install ros-kinetic-joint-state-publisher-gui

将出现下面一个这样的gui调试窗口。

image-20200904001821018

  • 使用rviz查看自己的机器人模型
rviz

按照图中序号添加机器人模型。
image-20200904002130944

然后将Fixed Frame 选择base_link,就出现你要小车模型了。

image-20200904002501975

通过joint_state_publisher_gui可以控制模型,自行尝试。按照上面的方法,还可以将TF添加的rviz中显示,如下图这个样子。

image-20200904003005097

3.3.5 总结

这里只是给出了,一个最简单的ROS小车urdf文件功能包编写流程,对于新手来说这就是一个参考的流程。过程中需要注意的地方,都在文章中重点说明了。如果需要更加细化的了解urdf,可以参考官网。但是,这里描述的内容,对于ROS小车已经绰绰有余了。

urdf的缺点:

  • 模型冗长
  • 参数修改麻烦
  • 没有参数计算能力等等

下一章,我们使用xacro优化urdf文件。

以往文章,点击访问。

上一篇ROS小车开发需要的ROS基础
系列文章从零搭建ROS机器人

如果你感觉,我的文章比较适合你,关注我,给你不一样的惊喜。

稿定设计导出-20200810-205521
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhao_ke_xue/article/details/108396430