ROS中的3D机器人建模(二)
一,创建我们的第一个URDF模型
我们设计的第一个机器人模型是pan-and-tilt机械结构,代码如下
pan_tilt.urdf:
1 <?xml version="1.0"?> 2 <robot name="pan_tilt"> 3 4 <link name="base_link"> 5 6 <visual> 7 <geometry> 8 <cylinder length="0.01" radius="0.2"/> 9 </geometry> 10 <origin rpy="0 0 0" xyz="0 0 0"/> 11 <material name="yellow"> 12 <color rgba="1 1 0 1"/> 13 </material> 14 </visual> 15 16 <collision> 17 <geometry> 18 <cylinder length="0.03" radius="0.2"/> 19 </geometry> 20 <origin rpy="0 0 0" xyz="0 0 0"/> 21 </collision> 22 <inertial> 23 <mass value="1"/> 24 <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> 25 </inertial> 26 </link> 27 28 <joint name="pan_joint" type="revolute"> 29 <parent link="base_link"/> 30 <child link="pan_link"/> 31 <origin xyz="0 0 0.1"/> 32 <axis xyz="0 0 1" /> 33 <limit effort="300" velocity="0.1" lower="-3.14" upper="3.14"/> 34 <dynamics damping="50" friction="1"/> 35 </joint> 36 37 <link name="pan_link"> 38 <visual> 39 <geometry> 40 <cylinder length="0.4" radius="0.04"/> 41 </geometry> 42 <origin rpy="0 0 0" xyz="0 0 0.09"/> 43 <material name="red"> 44 <color rgba="0 0 1 1"/> 45 </material> 46 </visual> 47 <collision> 48 <geometry> 49 <cylinder length="0.4" radius="0.06"/> 50 </geometry> 51 <origin rpy="0 0 0" xyz="0 0 0.09"/> 52 </collision> 53 <inertial> 54 <mass value="1"/> 55 <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> 56 </inertial> 57 </link> 58 59 <joint name="tilt_joint" type="revolute"> 60 <parent link="pan_link"/> 61 <child link="tilt_link"/> 62 <origin xyz="0 0 0.2"/> 63 <axis xyz="0 1 0" /> 64 <limit effort="300" velocity="0.1" lower="-4.64" upper="-1.5"/> 65 <dynamics damping="50" friction="1"/> 66 </joint> 67 68 <link name="tilt_link"> 69 <visual> 70 <geometry> 71 <cylinder length="0.4" radius="0.04"/> 72 </geometry> 73 <origin rpy="0 1.5 0" xyz="0 0 0"/> 74 <material name="green"> 75 <color rgba="1 0 0 1"/> 76 </material> 77 </visual> 78 <collision> 79 <geometry> 80 <cylinder length="0.4" radius="0.06"/> 81 </geometry> 82 <origin rpy="0 1.5 0" xyz="0 0 0"/> 83 </collision> 84 <inertial> 85 <mass value="1"/> 86 <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> 87 </inertial> 88 89 </link> 90 91 92 </robot>
详解URDF文件
<?xml version= "1.0"?>
<robot name = "pan_tilt">
<robot>标签定义了我们将要创建的机器人的名称。在这里,我们将机器人命名为pan_tilt.
如果我们查看<robot>标签定义之后的部分,我们可以看到pan-and-tilt机器结构中连杆和关节的定义:
<link name ="base_link">
<visual>
<geometry>
<cylinder length= "0.01" radius = "0.2"/>
</geometry>
<origin rpy= "0 0 0" xyz="0 0 0"/>
<material name = "yellow">
<color rgba>="1 1 0 1"/>
</material>
</visual>
</link>
前面的这段代码是pan-and-tilt机械结构的base_link的定义。<visual>标签描述了连杆的可见外观,它将在机器人仿真中显示出来。我们就可以用这个标签来定义连杆的几何形状(圆柱、立方体、球体、网络模型)以及连杆的材质(颜色和纹理)。
<joint name="pan_joint " type ="revolute">
<parent link = "base_link"/>
<child link="pan_link"/>
<origin xyz="0 0 0.1"/>
<axis xyz ="0 0 1"/>
</joint>
在前面的代码片段中,我们定义了一个具有唯一名称和关节类型的关节。在这里我们使用的关节类型是旋转关节(revolute),父连杆和子连杆分别是base_link和pan_link。在此标签内还指定了关节原点。
然后检查urdf是否包含错误,命令如下:
$ check_urdf pan_tilt.urdf
check_urdf命令将解析urdf标签并显示错误(如果有的话),如果一切正常,他将输出如下内容:
robot name is: pan_tilt ---------- Successfully Parsed XML --------------- root Link: base_link has 1 child(ren) child(1): pan_link child(1): tilt_link
如果我们想以图形化的方式查看机器人连杆和关节的结构,我们可以使用一个名为urdf_to_graphiz的命令行工具:
$ urdf_to_graphiz pan_tilt.urdf
这个命令将生成两个文件:pan_tilt.gv和pan_tilt.pdf.
我们可以使用以下命令来查看此机器人的结构:
$ evince pan_tilt.pdf
如图所示:
二,在RViz中可视化机器人3D模型
设计好URDF后,可以在RViz上查看它。我们可以创建一个view_demo.launch启动文件,代码如下:
1 <launch> 2 <arg name="model" /> 3 <param name="robot_description" textfile="$(find mastering_ros_robot_desc ription_pkg)/urdf/pan_tilt.urdf" /> 4 <param name="use_gui" value="true"/> 5 6 <node name="joint_state_publisher" pkg="joint_state_publisher" type="join t_state_publisher" /> 7 <node name="robot_state_publisher" pkg="robot_state_publisher" type="stat e_publisher" /> 8 <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mastering_ros_ro bot_description_pkg)/urdf.rviz" required="true" /> 9 10 </launch> 11
我们使用如下命令来启动模型:
$ roslaunch mastering_ros_robot_description_pkg view_demo.launch
如果一切正常,我们将在RViz中看到这个pan-and-tilt机械结构,如图所示