ROS学习笔记11~URDF

一、URDF简介

URDF(Unified Robot Description Format,统一机器人描述格式)是ROS中一个非常重要的机器人模型描述格式,ROS同时也提供URDF文件的C+解析器,可以解析URDF文件中使用XML格式描述的机器人模型。

1、< link >标签

< link >标签用于描述机器人某个刚体部分的外观和物理属性,包括尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等。

2、< joint >标签

< joint >标签用于描述机器人关节的运动学和动力学属性,包括关节运动的位置和速度限制。

3、< robot >标签

< robot >是完整机器人模型的最顶层标签,< link >和< joint >标签都必须包含在< robot >标签内。

4、< gazebo >标签

< gazebo >标签用于描述机器人模型在Gazebo中仿真所需要的参数,包括机器人材料的属性、Gazebo插件等。该标签不是机器人模型必需的部分,只有在Gazebo仿真时才需加入。

二、创建机器人URDF模型

1、创建功能包mrobot_description

$  catkin_create_pkg mrobot_description

mrobot_description功能包中分别创建 urdf、meshes、launch和config 四个文件夹。
(1)、urdf:用于存放机器人模型的URDF或xacro文件。
(2)、meshes:用于放置URDF中引用的模型渲染文件。
(3)、launch:用于保存相关启动文件。
(4)、config:用于保存rviz的配置文件。

创建结果如斜土所示:
在这里插入图片描述

2、创建URDF模型

(1) 定义机器人模型及名称

首先需要声明该文件使用XML描述,然后使用根标签定义一个机器人模型,并定义该机器人模型的名称是“mrobot_chassis”。根标签内的内容即为对机器人模型的详细定义。

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

(2) 描述机器人底盘 link

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

这一段代码用来描述机器人的底盘link,< visual >标签用来定义底盘的外观属性,在显示和仿真中,rviz或Gazebo会按照这里的描述将机器人模型呈现出来。我们将机器人底盘抽象成一个圆柱结构,使用< cylinde r>标签定义这个圆柱的半径和高;然后声明这个底盘圆柱在空间内的三维坐标位置和旋转姿态,底盘中心位于界面的中心点,所以使用< origin >设置起点坐标为界面的中心坐标。此外,使用< material >标签设置机器人底盘的颜色一黄色,其中的< color >便是黄色的RGBA值。

(3) 定义第一个关节 joint

    <joint name="base_left_motor_joint" type="fixed">
        <origin xyz="-0.055 0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="left_motor" />
    </joint>

这一段代码定义了第一个关节joint,用来连接机器人底盘和左边驱动电机,joint的类型是fixed类型,这种类型的joint是固定的,不允许关节发生运动。< origin >标签定义了 joint 的起点,我们将起点设置在需要安装电机的底盘位置。

(4)描述左侧电机模型

<link name="left_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.02" length = "0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

上面这一段代码描述了左侧电机的模型。电机的外形抽象成圆柱体,圆柱体的半径为0.02m,高为0.08m。下边的描述和机器人底盘的类似,定义了电机中心的起点位置和外观颜色。

之前定义了一个joint将电机连接到底盘上,电机的坐标位置是相对于joint计算的。在joint的位置坐标设置中,我们已经将joint放置到了安装电机的底盘位置,所以在电机模型的坐标设置中,不需要位置偏移,放置到(0,0,0)坐标即可。由于圆柱体默认是垂直地面创建的,需要把圆柱体围绕x轴旋转90°(使用弧度表示大约为0.75),才能成为电机的模样。

(5) 定义电机和轮子之间的 joint

 <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 0.0485 0" rpy="0 0 0"/>
        <parent link="left_motor"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

接着需要定义电机和轮子之间的joint。joint的类型是 continuous 型,这种类型的 joint 可以围绕一个轴进行旋转,很适合轮子这种模型。< origin >标签定义了joint的起点,将起点设置到安装轮子的位置,即电机的一端。< axis >标签定义该 joint 的旋转轴是正y轴,轮子在运动时就会围绕y轴旋转。

机器人底盘模型的其他部分都采用类似的方式描述,这里不再赘述。

整个URDF模型全部代码如下:

所有代码放入文件 mrobot_chassis.urdf

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

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

    <joint name="base_left_motor_joint" type="fixed">
        <origin xyz="-0.055 0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="left_motor" />
    </joint>

    <link name="left_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.02" length = "0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 0.0485 0" rpy="0 0 0"/>
        <parent link="left_motor"/>
        <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.033" length = "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="base_right_motor_joint" type="fixed">
        <origin xyz="-0.055 -0.075 0" rpy="0 0 0" />        
        <parent link="base_link"/>
        <child link="right_motor" />
    </joint>

    <link name="right_motor">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.02" length = "0.08" />
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.0485 0" rpy="0 0 0"/>
        <parent link="right_motor"/>
        <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.033" length = "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="front_caster_joint" type="fixed">
        <origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
    </joint>

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

</robot>

查看URDF模型整体结构

$  urdf_to_graphiz mrobot_chassis.urdf

在这里插入图片描述从上图可以看出,该机器人底盘模型有 6 个 link 和 5 个 joint。6个link包括1个机器人底板、2个电机、2个驱动轮和1个前向轮;5个joint负责将驱动轮、前向轮、电机安装到底板上,并设置相应的连接方式。

三、在rviz中显示模型

在功能包mrobot_description中launch文件夹下建立启动文件 display_mrobot_chassis_urdf.launch 。原码如下:

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

	<!-- 设置GUI参数,显示关节控制插件 -->
	<param name="use_gui" value="true"/>
	
	<!-- 运行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="state_publisher" />
	
	<!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot_urdf.rviz" required="true" />
</launch>

打开终端运行该 launch 文件

$ roslaunch mrobot_description display_mrobot_chassis_urdf.launch 

结果如下图所示:
在这里插入图片描述
运行成功后,不仅启动了rviz,而且出现了一个名为 “joint state publisher” 的 UI。这是因为我们在启动文件中启动了 joint state_publisher 节点,该节点可以发布每个 joint(除fixed类型)的状态,而且可以通过 UI 对 joint 进行控制。所以在控制界面中用鼠标滑动控制条,rviz 中对应的轮子就会开始转动。
除了joint_state_publisher,launch文件还会启动一个名为“robot state publisher”的节点,这两个节点的名称相似,所以很多人会把两者混淆,分不清楚它们各自的功能。与 joint_state publisher 节点不同,robot_state publisher 节点的功能是将机器人各个link、joint之间的关系,通过TF的形式整理成三维姿态信息发布出去。在rviz中,可以选择添加TF插件来显示各部分的坐标系。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值