在 ROS中,机器人以URDF(Unified Robot Description Format,统一机器人描述格 式)描述,它可以表示为三维模型,并且每个模型可以根据自由度进行移动或驱动,因 此可以用于仿真或控制。
让我们为由三个关节和四个连杆组成的机械 手臂创建一个简单的URDF。
首先,按如下所示创建testbot_description功能包,然后创建urdf目录。然后使用编 辑器创建一个testbot.urdf文件,并输入下面的URDF例程。
mkdir -p ~/testbot_ws/src cd ~/testbot_ws/src catkin_create_pkg testbot_description urdf cd testbot_description mkdir urdf cd urdf gedit testbot.urdf
代码如下:
https://gitee.com/kay2020/ros_tutorials/blob/master/testbot_description/urdf/testbot.urdf
URDF使用XML标签来描述机器人的每个组件。以URDF形式先描述机器人的名称、 基座(在URDF中将基座看作一个固定的连杆)的名称和类型、连接到基座的连杆,之后 逐一说明连杆和关节的内容。连杆描述连杆的名称、大小、重量和惯性等。关节描述每个 关节的名称、类型和连接的连杆。并且可以很容易地设置机器人的动力学元素、可视化和 碰撞模型。URDF是以标签来开始,详细内容中通常会反复交替出现标签 和标签,这两种标签都用于定义机器人的组件-连杆和关节。其中,为了与ROSControl共用,通常还包括用于设置关节和舵机之间的关系的标签。接 着,让我们仔细看看我们创建的testbot.urdf。 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>
如上面的link1例子,URDF 标签由碰撞(collision)、视觉(visual)和惯 性(inertial)标签(见图13-7)组成。collision标签允许您输入表示连杆的外形范围的 几何信息。origin写外形范围的中心坐标。geometry写以origin坐标为中心的外形范围 的形状和大小。例如,长方体类型的外形范围是长、宽和高的值。除长方体形式以外, 还有圆柱型和球型,他们的输入内容各不相同。在visual标签中写下实际的形状。origin 和geometry与collision标签相同。而且也可以在这里输入CAD文件,如STL和DAE。 collision标签可以在CAD模型中使用,但仅适用于ODE或Bullet等部分物理引擎,不支 持DART和Simbody等。在inertial标签中,输入连杆的重量(质量单位为kg)和惯性矩 (惯性矩单位为kg·m2 )。这种惯性信息可以通过设计软件、实际测量和计算得到,用于 动力学仿真。 testbot.urdf示例中描述的link1、link2和link4的原点与各自的上部关节(分别为 fixed、joint1和joint3)的原点相距0.25m,而这三个连杆的外形是以这个移动的原点为 中心的长宽各0.1m,高0.5m(z轴正方向0.25m,z轴负方向0.25m)的长方体。link3的 原点与上部关节(joint2)的原点相距0.5m,且link3的外形是以这个移动的原点为中心 的长宽各0.1m,高1m的长方体。 在第一次遇到URDF时对于相对坐标变换的理解是相当困难的。一边直观地查看图 形,一边理解各设定值会容易得多。为了更好地理解,可以通过图13-12观察各轴的相对 坐标变换在RViz上是如何表现的,并通过修改设定值观察RViz上的变化。笔者建议读者 务必尝试一下。
接下来,我们来看看连接相邻连杆的关节(joint)标签。关节标签描述了关节的特 征,如图13-8所示。具体来说它描述关节的名称和类型,如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>
为了更深入理解,让我们仔细了解一下。joint2的类型(type)设置为一种运动型关 节revolute。父连杆(parent link)设置为link2,而子连杆设置为link3。另外,origin 中以上级关节joint1的坐标系为原点,指定joint2的坐标系的相对位置姿态(位置+方 向)。例如,joint2坐标系的原点是joint1坐标系朝z轴方向相距0.5m的位置。下面是轴 设置。在轴设置axis中,如果是旋转型关节,则写入旋转轴的方向,如果是平移型关节, 则写入运动方向。在joint2的情况下,设定为在y轴方向上旋转的关节。limit设定了关 节运动的极限。属性包括给予关节的力(effort,单位N),最小、最大角度(下限,上 限,以弧度为单位)和速度(以弧度/秒)等物理量的限制值。
完成建模后,我们来检查每个连杆和关节,看它们是否逻辑正确。在ROS中,可以用 check_urdf命令来检查已创建的URDF的语法错误以及每个连杆的连接关系,如下例所 示。如果在语法和逻辑上没有问题,则可以看到连杆1、2、3和4正常连接,如下所示。
check_urdf testbot.urdf
接下来,让我们来用关系图表示urdf_to_graphiz程序创建的模型吧。如果您运行 urdf_to_graphiz,则会创建一个.gv文件和一个.pdf文件。如果您用PDF阅读器,可以 一目了然地看到连杆与关节之间的关系,以及每个关节之间的相对坐标转换,如图13-9所 示。
urdf_to_graphiz testbot.urdf
用check_urdf和urdf_to_graphiz是检查模型的连杆关系的最快的方法。最后,让我 们使用RViz检查机器人模型。为此,请转至testbot_description功能包目录并创建一个 testbot.launch文件,如以下示例所示。
cd ~/testbot_ws/src/testbot_description mkdir launch cd launch vim 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_publisher36 节点和robot_state_ publisher37节点组成。joint_state_publisher节点通过sensor_msgs/JointState消息 的形式发布URDF形式的机器人的关节状态,并提供一个GUI工具来给关节提供命令。 robot_state_publisher节点以tf38消息的形式发布forward kinematics的结果,这个结 果是由URDF中设置的机器人信息和sensor_msgs/JointState话题信息来计算得出的。 (参见图13-10)。
运行launch文件时会运行joint_state_publisher节点的GUI,如图13-11所示。 在这里您可以调整joint1、2和3的关节值。此外,运行RViz后将[Fixed Frame]选为 “base”,点击左下方的Add按钮,添加“RobotModel”显示屏,就可以看到每个关 节和连杆的形状,如图13-12的上图所示。如果添加“TF”显示屏,并将机器人模型的 “Alpha”值修改为约0.3,则可以查看每个连杆的形状以及关节之间的关系,如图13-12 的下图所示。 如果调整了joint_state_publisher节点的GUI滑动条,则可以看到RViz上的虚拟机器 人的运动,如图13-13所示。
作者:kay 出处:https://www.cnblogs.com/kay2018/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |