URDF

前言

最近需要对运动学以及动力学做一些相关仿真以及实现,故需要了解以及设计一些可视化模型,相关的知识点将会放到这里;另外需要说明的是,solidworks可以导出此部分文件,因此这部分内容作为了解即可,
或者是以后可能需要修改一些参数而需要用到的一部分知识。

简介

URDF(Unified Robot Description Format),统一机器人描述格式,是一种特殊的xml格式,用来描述一个机器人. 在ROS中,urdf功能包包含一个urdf格式文件的C++解析器,这样,任何通过统一编码格式设计的机器人都可以通过该解析器得到一个可视化的模型.

URDF创造的机器人模型包含的内容有:

连杆 link
关节 joint
运动学参数 axis
动力学参数 dynamics
可视化模型 visual
碰撞检测模型 collision

搭建模型

最终想要搭建的模型效果如下

下面一步步的说明搭建的过程(这里假设所有的包,如OpenManipulator Chain的源代码、URDF、Gazebo和MoveIt!都已安装好的前提下)

按如下所示创建testbot_description功能包,然后创建urdf目录。然后使用编辑器创建一个testbot.urdf文件,并输入下面的URDF例程。

cd ~/catkin_ws/src
catkin_create_pkg testbot_description urdf
cd testbot_description
mkdir urdf
cd urdf
vim testbot.urdf
<?xml version="1.0" ?>
<robot name="testbot">
<material name="black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
<material name="orange">
<color rgba="1.0 0.4 0.0 1.0"/>
</material>
<link name="base"/>
<joint name="fixed" type="fixed">
<parent link="base"/>
<child link="link1"/>
</joint>
<link name="link1">
<collision>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
<material name="black"/>
</visual>
<inertial>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

<joint name="joint1" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
</joint>
<link name="link2">
<collision>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
<material name="orange"/>
</visual>
<inertial>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

<joint name="joint2" type="revolute">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
</joint>
<link name="link3">
<collision>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 1"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 1"/>
</geometry>
<material name="black"/>
</visual>
<inertial>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

<joint name="joint3" type="revolute">
<parent link="link3"/>
<child link="link4"/>
<origin xyz="0 0 1.0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
</joint>
<link name="link4">
<collision>

<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
<material name="orange"/>
</visual>
<inertial>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
</robot>

URDF使用XML标签来描述机器人的每个组件。以URDF形式先描述机器人的名称、 基座(在URDF中将基座看作一个固定的连杆)的名称和类型、连接到基座的连杆,之后逐一说明连杆和关节的内容。连杆描述连杆的名称、大小、重量和惯性等。关节描述每个关节的名称、类型和连接的连杆。并且可以很容易地设置机器人的动力学元素、可视化和碰撞模型。URDF是以标签来开始,详细内容中通常会反复交替出现标签和标签,这两种标签都用于定义机器人的组件-连杆和关节。其中,为了与ROSControl共用,通常还包括用于设置关节和舵机之间的关系的标签;

material

material标签描述连杆的颜色和纹理等信息。在下面的例子中,定义了两种材质,黑色和橙色,以区分每个连杆。颜色是利用color标签,可以在rgba选项后面输入对应于红色、绿色和蓝色的三个0.0到1.0之间的一个数字来分别设置。最后一个数字的透明度(alpha)值为0.0到1.0,值为1.0意味着没有透明度。

<material name=”black”>
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
<material name="orange">
<color rgba="1.0 0.4 0.0 1.0"/>
</material>

机械手臂的第一种组件,基座在URDF中以连杆表示。基座通过关节连接到第一个连杆,这个关节是固定的,位于原点(0,0,0)。为了进行更多关于标签的详细描述,先来看第一个连杆(link1)标签。

<link name=”base”/>
<joint name="fixed" type="fixed">
<parent link="base"/>
<child link="link1"/>
</joint>
<link name="link1">
<collision>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
<material name="black"/>
</visual>
<inertial>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

如上面的例子,URDF 标签由碰撞(collision)、视觉(visual)和惯性(inertial)标签组成

连杆标签的属性

<link>:      连杆的可视化、碰撞和惯性信息设置
<collision>: 设置连杆的碰撞计算的信息
<visual>: 设置连杆的可视化信息
<inertial>: 设置连杆的惯性信息
<mass>: 连杆重量(单位:kg)的设置
<inertia>: 惯性张量(Inertia tensor)设置
<origin>: 设置相对于连杆相对坐标系的移动和旋转
<geometry>: 输入模型的形状。提供box、cylinder、sphere等形态,也可以导入COLLADA
(.dae)、STL(.stl)格式的设计文件。在<collision>标签中,可以指定为简单的
形态来减少计算时间
<material>: 设置连杆的颜色和纹理

joint

关节标签描述了关节的特征,具体来说它描述关节的名称和类型,如revolute(旋转运动型)、 prismatic(平移运动型)、continuous(连续旋转的轮)、fixed(固定型)、floating (非固定)和planar(在与轴垂直的平面移动的形态)。它还描述连接的两个连杆的名 称、关节的位置、旋转和平移运动的基准轴的动作限制。连接的连杆根据位置称为父连杆 (parent link)和子连杆(child link),父连杆通常是靠近基座的连杆。关节参数可参考下图中所示

以下示例显示了joint2关节的设置。

<joint name=”joint2” type=”revolute”>
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
</joint>

完成建模后,我们来检查每个连杆和关节,看它们是否逻辑正确。在ROS中,可以用 check_urdf命令来检查已创建的URDF的语法错误以及每个连杆的连接关系,如下例所示。如果在语法和逻辑上没有问题,则可以看到连杆1、2、3和4正常连接,如下所示。

如果提示没有check_urdf命令,在命令行中输入如下即可

sudo apt-get install liburdfdom-tools

接下来,来用关系图表示urdf_to_graphiz程序创建的模型。如果运行 urdf_to_graphiz,则会创建一个.gv文件和一个.pdf文件。如果用PDF阅读器,可以一目了然地看到连杆与关节之间的关系,以及每个关节之间的相对坐标转换,

urdf_to_graphiz testbot.urdf
Created file testbot.gv
Created file testbot.pdf

用pdf阅读器打开所生成的PDF文件,如下所示

用check_urdf和urdf_to_graphiz是检查模型的连杆关系的最快的方法。 下面使用RViz检查机器人模型。转至testbot_description功能包目录并创建一个testbot.launch文件,在命令行中输入如下指令

cd ~/catkin_ws/src/testbot_description
mkdir launch
cd launch
gedit testbot.launch

并输入如下内容

<launch>
<arg name="model" default="$(find testbot_description)/urdf/testbot.urdf" />
<arg name="gui" default="True" />
<param name="robot_description" textfile="$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
<node pkg="robot_state_publisher" type="state_publisher" name="robot_state_publisher"/>
</launch>

Launch文件由包含URDF的参数、joint_state_publisher 节点和robot_state_publisher节点组成。joint_state_publisher节点通过sensor_msgs/JointState消息的形式发布URDF形式的机器人的关节状态,并提供一个GUI工具来给关节提供命令。 robot_state_publisher节点以tf消息的形式发布forward kinematics的结果,这个结果是由URDF中设置的机器人信息和sensor_msgs/JointState话题信息来计算得出的。

辅助工具

有直接可以从DH参数生成URDF文件的,网址链接为: https://adohaha.github.io/DH2URDF/, 但是。。。。没有通过check(可能需要在这个基础上稍微改改)….这就尴尬了,于是接着搜索,在github上找到了 RoboticsInOne, 于是在自己的MAC上进行了简单的试用,当然,也是有很多坑需要去踩的,配置环境产生了一系列的问题,因为不断地去试,所以就没能一点点的记录整个试的过程了,下面记录一些比较重要的点

1, 利用conda安装所需Python的配置环境, 主要是去解决wxpython的一些问题, 当时的报错信息如下

This program needs access to the screen. Please run with a Framework
build of python, and only when you are logged in on the main display
of your Mac.

解决方式如下:

conda install python.app

然后再利用这个环境,来跑RIO.py这个函数,例如自己这边的操作为

/Users/zhangxiaolong/miniconda3/bin/python.app RIO.py

剩下的就是缺了啥包,就安装啥包就行,最简单粗暴的方式就是直接进入python的命令行, 以缺少 ‘wxPython’ 为例

/Users/zhangxiaolong/miniconda3/bin/python.app

在Python的命令行中输入

import pip 
pip.main(['install', 'wxPython'])

以此类推即可,虽然解决方式有些繁琐,但最后也是成功了的,就没必要研究更快更好的方法了。。。。。。最后可以打开里面的用例,以库卡机器人为例,效果如下

自然,里面给的urdf模型是可以通过check的;可以拿里面提供的URDF文件进行仿真,当然,想找到URDF仿真来说,相对来说是个比较简单的问题;

参考

[1] ROS开发——URDF简介

[2]《ROS机器人编程—从基本概念到机器人应用程序编程实战》

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议