什么是URDF¶
全称为 Unified Robot Description Format ,翻译为中文为 统一机器人描述性格式
那么这里我们可以确定,**URDF**是用来描述机器人的,通过一些特定的格式将机器人具体的描述出来,供计算机进行理解操作。
URDF描述规范¶
- 用一个文件描述一个机器人模型
- 文件的后缀为
.urdf
- 文件的内容格式为
xml
格式 - xml根节点为
robot
通过创建一个hello.urdf
文件我们来认知一下URDF的基本规范:
<?xml version="1.0"?>
<robot name="hello">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</visual>
</link>
</robot>
连杆介绍
什么是link¶
link 我们称之为连杆。在官方介绍中,用a rigid body
描述link
。
a rigid body
:僵硬的躯体。意思是不可移动的,固定的。
在URDF描述性语言中,link是用来描述物理特性的。
- 描述视觉显示
- 描述碰撞属性
- 描述物理惯性
我们用xml格式来表达连杆如下:
<link name="my_link">
<visual></visual>
<collision></collision>
<inertial></inertial>
</link>
visual视觉显示
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
geometry形状¶
box盒装
<box size="1 1 1" />
cylinder圆柱状
<cylinder length="0.6" radius="0.2"/>
sphere球状
<sphere radius="1" />
mesh指向对应的文件¶
origin位置姿态
<origin xyz="0 0 0" rpy="0 0 0" />
material材质¶
<material name="blue">
<color rgba="0 0 1.0 1.0"/>
</material>
通用启动的launch文件
<launch>
<arg name="model" default="geometry_box.urdf"/>
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find demo_urdf)/rviz/urdf.rviz" />
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find demo_urdf)/urdf/$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
启动: 仿真
roslaunch demo_tf config.launch mode:=geometry_box.urdf 后面参数自己改,不传的话默认geometry_box.urdf
----------------------------------------------------
link 代码:
*.文件
<?xml version="1.0" encoding="UTF-8" ?>
<robot name="box">
<!-- 写法2 纹理2 -->
<material name="mycolor">
<!-- [0, 255]
rgba取值是[0,1]
blue: 0 0 255 255
-->
<color rgba="0.8 0.4 0 1"/>
</material>
<!-- link -->
<link name="base">
<!-- visual -->
<visual>
<!-- 位置和姿态
位置 :xyz="0 0 0"
姿态 rpy是弧度值: 3.14/2=1.57/2=0.785
-->
<origin xyz="0 0 0" rpy="0.785 0.785 0.785" />
<!-- 形状 -->
<geometry>
<!-- size 用来描述长宽高(x, y, z) -->
<box size="1 2 3"/>
<!-- 圆柱体 半径和高度 单位米 -->
<!--<cylinder length="0.6" radius="0.2" />-->
<!-- 球体 半径单位米 -->
<!--<sphere radius="1"/>-->
<!-- 纹理文件 加载已经创建好的 3d模型文件-->
<!-- <mesh filename="package://demo_urdf/meshes/bowl.dae"/>-->
<!--<mesh filename="package://demo_urdf/meshes/cft.dae"/>-->
</geometry>
<!--写法1 纹理 1 -->
<material name="blue">
<!-- [0, 255]
rgba取值是[0,1]
取值 需要的值/255
blue: 0 0 255 255
-->
<color rgba="0 0 1 0.5"/>
</material>
<!-- 写法2 纹理2 -->
<!--<material name="mycolor"/>-->
</visual>
</link>
<!-- link -->
<link name="link2">
<visual>
<origin xyz="0 0 0.5"/>
<geometry>
<box size="0.3 0.3 1"/>
</geometry>
<material name="c2"/>
</visual>
</link>
<!-- 连接点 fixed 固定 -->
<joint name="joint1" type="fixed">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
</joint>
<!-- 连接点 revolute 旋转-->
<joint name="joint1" type="revolute">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
<axis xyz="0 1 0"/>
<limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
</joint>
<!-- 连接点 continuous旋转,没有旋转弧度限制可以一直旋转-->
<joint name="joint1" type="continuous">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
<axis xyz="0 1 0"/>
<!-- <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />-->
</joint>
<!-- 连接点 prismatic 滑动-->
<joint name="joint1" type="prismatic">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
<axis xyz="0 0 1"/>
<!-- 限定范围
limit主要是限制child的旋转的范围。
lower和upper限制了旋转的弧度范围
effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
velocity限制了转动时的速度,单位为米/秒或m/s
-->
<limit effort="30" velocity="1.0" lower="-1.5" upper="1.5" />
</joint>
</robot>
连接点代码:
<?xml version="1.0" encoding="UTF-8" ?>
<robot name="box">
<material name="c1">
<color rgba="0.8 0.4 0 0.8"/>
</material>
<material name="c2">
<color rgba="0 0 1 0.8"/>
</material>
<!-- link -->
<link name="base">
<visual>
<geometry>
<box size="0.2 0.2 0.6"/>
</geometry>
<material name="c1"/>
</visual>
</link>
<!-- link -->
<link name="link2">
<visual>
<origin xyz="0 0 0.5"/>
<geometry>
<box size="0.3 0.3 1"/>
</geometry>
<material name="c2"/>
</visual>
</link>
<!-- 连接点 fixed 固定 -->
<joint name="joint1" type="fixed">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
</joint>
<!-- 连接点 revolute 旋转-->
<joint name="joint1" type="revolute">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<axis xyz="0 1 0"/>
<limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
</joint>
<!-- 连接点 continuous旋转,没有旋转弧度限制可以一直旋转-->
<joint name="joint1" type="continuous">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
<axis xyz="0 1 0"/>
<!-- <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />-->
</joint>
<!-- 连接点 prismatic 滑动-->
<joint name="joint1" type="prismatic">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<axis xyz="0 0 1"/>
<!-- 限定范围
limit主要是限制child的旋转的范围。
lower和upper限制了旋转的弧度范围
effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
velocity限制了转动时的速度,单位为米/秒或m/s
-->
<limit effort="30" velocity="1.0" lower="-1.5" upper="1.5" />
</joint>
</robot>
xacro 代码:
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">
<!-- xacro
variable
-->
<!-- base box all properties -->
<xacro:property name="box_size_x" value="0.2" />
<xacro:property name="box_size_y" value="0.5" />
<xacro:property name="box_size_z" value="0.3" />
<!-- link -->
<link name="base">
<!-- visual -->
<visual>
<geometry>
<box size="${box_size_x * 2} ${box_size_y + 0.4} ${box_size_z / 2}"/>
</geometry>
</visual>
</link>
</robot>
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">
<material name="c1">
<color rgba="0.8 0.4 0 0.8"/>
</material>
<material name="c2">
<color rgba="0 0 1 0.8"/>
</material>
<xacro:macro name="mylink" params="name size color xyz:='0 0 0'">
<link name="${name}">
<visual>
<origin xyz="${xyz}"/>
<geometry>
<box size="${size}"/>
</geometry>
<material name="${color}"/>
</visual>
</link>
</xacro:macro>
<!-- link -->
<!-- <link name="base">-->
<!-- <visual>-->
<!-- <geometry>-->
<!-- <box size="0.2 0.2 0.6"/>-->
<!-- </geometry>-->
<!-- <material name="c1"/>-->
<!-- </visual>-->
<!-- </link>-->
<xacro:mylink name="base" size="0.2 0.2 0.6" color="c1"/>
<!-- link -->
<!-- <link name="link2">-->
<!-- <visual>-->
<!-- <origin xyz="0 0 0.5"/>-->
<!-- <geometry>-->
<!-- <box size="0.3 0.3 1"/>-->
<!-- </geometry>-->
<!-- <material name="c2"/>-->
<!-- </visual>-->
<!-- </link>-->
<xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="c2"/>
<joint name="joint1" type="revolute">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<axis xyz="0 1 0"/>
<!-- 限定范围
limit主要是限制child的旋转的范围。
lower和upper限制了旋转的弧度范围
effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
velocity限制了转动时的速度,单位为米/秒或m/s
-->
<limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
</joint>
</robot>
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">
<material name="c1">
<color rgba="0.8 0.4 0 0.8"/>
</material>
<material name="c2">
<color rgba="0 0 1 0.8"/>
</material>
<xacro:macro name="MyColor" params="name">
<material name="${name}">
<xacro:if value="${name=='red'}">
<color rgba="1.0 0 0 1.0"/>
</xacro:if>
<xacro:if value="${name=='green'}">
<color rgba="0 1.0 0 1.0"/>
</xacro:if>
<xacro:if value="${name=='blue'}">
<color rgba="0 0 1.0 1.0"/>
</xacro:if>
<xacro:if value="${name=='white'}">
<color rgba="1.0 1.0 1.0 1.0"/>
</xacro:if>
</material>
</xacro:macro>
<!-- link -->
<link name="base">
<visual>
<origin xyz="0 0 0" rpy="0.785 0.785 0.785"/>
<geometry>
<box size="0.5 1 1.5"/>
</geometry>
<xacro:MyColor name="white"/>
</visual>
</link>
</robot>
已整理的xacro 通用d代码模板
*.xacro 文件
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">
<material name="c1">
<color rgba="0.8 0.4 0 0.8"/>
</material>
<material name="c2">
<color rgba="0 0 1 0.8"/>
</material>
<xacro:macro name="MyColor" params="name">
<material name="${name}">
<xacro:if value="${name=='red'}">
<color rgba="1.0 0 0 1.0"/>
</xacro:if>
<xacro:if value="${name=='green'}">
<color rgba="0 1.0 0 1.0"/>
</xacro:if>
<xacro:if value="${name=='blue'}">
<color rgba="0 0 1.0 1.0"/>
</xacro:if>
<xacro:if value="${name=='white'}">
<color rgba="1.0 1.0 1.0 1.0"/>
</xacro:if>
</material>
</xacro:macro>
<!-- <xacro:macro name="mylink" params="name size color xyz:='0 0 0'">-->
<!-- <link name="${name}">-->
<!-- <visual>-->
<!-- <origin xyz="${xyz}"/>-->
<!-- <geometry>-->
<!-- <box size="${size}"/>-->
<!-- </geometry>-->
<!-- <material name="${color}"/> -->
<!-- </visual>-->
<!-- </link>-->
<!-- </xacro:macro>-->
<xacro:macro name="mylink" params="name size colorname xyz:='0 0 0'">
<link name="${name}">
<visual>
<origin xyz="${xyz}"/>
<geometry>
<box size="${size}"/>
</geometry>
<!-- <material name="${color}"/> -->
<xacro:MyColor name="${colorname }"/>
</visual>
</link>
</xacro:macro>
<!--<xacro:mylink name="base" size="0.2 0.2 0.6" color="c1"/>-->
<!-- <xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="c2"/>-->
<xacro:mylink name="base" size="0.2 0.2 0.6" color="red"/>
<xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="blue"/>
<joint name="joint1" type="revolute">
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<parent link="base"/>
<child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
<axis xyz="0 1 0"/>
<!-- 限定范围
limit主要是限制child的旋转的范围。
lower和upper限制了旋转的弧度范围
effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
velocity限制了转动时的速度,单位为米/秒或m/s
-->
<limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
</joint>
</robot>
配置默认使用xml打开urdf文件;
ps: 项目第一次创建时就可以选择xml打开,但是你第一次选择的是txt默认打开的话需要在这个设置里把它改过来
4.1 删除默认txt文件打开
4.2添加默认xml文件方式打开urdf文件
报这个错误时: Could not find the GUI, install the 'joint_state_publisher_gui' package
安装:
sudo apt install ros-melodic-joint-state-publisher-gui