我们接着上文 ROS
学习系列 -- 使用urdf创建机器人模型在Rviz中3D视察 之1 link使用继续完成创建带4个可以转动轮子的双层小车。
1 建立可以转动的joint
<span style="font-size:18px;"><?xml version="1.0"?>
<robot name="sp1s">
<link name="base_link">
<visual>
<geometry>
<box size="0.27 .15 .003"/>
</geometry>
<material name="white">
<color rgba="1 1 1 .5"/>
</material>
</visual>
</link>
<link name="front_left">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<joint name="base_to_front_left" type="<span style="color:#FF0000;"><strong>continuous</strong></span>">
<origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
<parent link="base_link"/>
<child link="front_left"/>
<axis xyz="0 0 1"/>
</joint>
</robot></span>
1. 将joint的类型改成"continuous" 这样front_left相对base_link就是1个转动的装置
2. 转动的位置就是由 origin定义的,它同时定义了tyer_front_left的新原点,之前它的原点默许就是base_link的原点
xyz 是相对相对parant base_link原点的偏移, 它把轮子移动到了左前方。其中:
z = -0.011m = 6.8cm/2
- 4.5cm,保证轮子是在地上的
y = 0.064m = 15cm/2 - 2.5cm / 2 (轮子厚度) + offset
pry 是分别以 x y z 轴为中心转动的角度(弧度制) 1.57075 就是90度。 围绕x轴旋转90度轮子就竖了起来。
3. axis重新定义转动轴在原点的方向,它是1个矢量,只唆使方向,它们必须满足 x * x + y * y + z * z = 1 原点Z轴已被旋转90度变成水平方向,所以这里定义Z轴方向为转动方向
2 重复添加4个轮子
其它3个轮子只有origin正负值的调剂
<span style="font-size:18px;"><?xml version="1.0"?>
<robot name="sp1s">
<link name="base_link">
<visual>
<geometry>
<box size="0.27 .15 .003"/>
</geometry>
<material name="white">
<color rgba="1 1 1 .5"/>
</material>
</visual>
</link>
<link name="tyer_front_left">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_front_right">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_back_left">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_back_right">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<joint name="base_to_front_left" type="continuous">
<origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_front_left"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_front_right" type="continuous">
<origin rpy="1.57075 0 0" xyz="0.06 -0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_front_right"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_back_left" type="continuous">
<origin rpy="1.57075 0 0" xyz="-0.06 0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_back_left"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_back_right" type="continuous">
<origin rpy="1.57075 0 0" xyz="-0.06 -0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_back_right"/>
<axis xyz="0 0 1"/>
</joint>
</robot>
</span>
3 添加4个柱子
上下层的4个角上是高3cm的柱子. 在上面urdf的基础上再添加下面的内容添加1个左前方的柱子。
<span style="font-size:18px;"> <link name="pillar_front_left">
<visual>
<geometry>
<cylinder length=".03" radius="0.0025"></cylinder>
</geometry>
<origin xyz="0 0 0.015"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<joint name="base_to_pillar_front_left" type="fixed">
<origin xyz="0.13 0.07 0.0015"/>
<parent link="base_link"/>
<child link="pillar_front_left"/>
</joint></span>
1. 柱子不转动,所以joint的类型为
fixed
2. joint里面定义改变了柱子的原点为
xyz="0.13 0.07 0.0015" 是相对base_link的
3. link里面也定义了原点为xyz="0 0 0.015", 这里只是显示上的偏移,它相对joint里面定义的原点,但其实不改变joint里面定义的物理原点
4. 接下来重复加3个柱子,详见最后1段的urdf定义
4 添加上层
上层和base_link1样,它们之间通过fixed joint相连。在 Z 轴方向上偏移3cm。
<link name="top_link">
<visual>
<geometry>
<box size="0.27 .15 .003"/>
</geometry>
<material name="white">
<color rgba="1 1 1 .5"/>
</material>
</visual>
</link>
<joint name="base_to_top" type="fixed">
<origin xyz="0 0 0.03"/>
<parent link="base_link"/>
<child link="top_link"/>
</joint>
5 完全的urdf
<?xml version="1.0"?>
<robot name="sp1s">
<link name="base_link">
<visual>
<geometry>
<box size="0.27 .15 .003"/>
</geometry>
<material name="white">
<color rgba="1 1 1 .5"/>
</material>
</visual>
</link>
<link name="tyer_front_left">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_front_right">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_back_left">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<link name="tyer_back_right">
<visual>
<geometry>
<cylinder length=".025" radius="0.034"></cylinder>
</geometry>
<material name="yellow">
<color rgba="1 1 0 1"/>
</material>
</visual>
</link>
<joint name="base_to_front_left" type="continuous">
<origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_front_left"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_front_right" type="continuous">
<origin rpy="1.57075 0 0" xyz="0.06 -0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_front_right"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_back_left" type="continuous">
<origin rpy="1.57075 0 0" xyz="-0.06 0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_back_left"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_back_right" type="continuous">
<origin rpy="1.57075 0 0" xyz="-0.06 -0.064 -0.011"/>
<parent link="base_link"/>
<child link="tyer_back_right"/>
<axis xyz="0 0 1"/>
</joint>
<link name="pillar_front_left">
<visual>
<geometry>
<cylinder length=".03" radius="0.0025"></cylinder>
</geometry>
<origin xyz="0 0 0.015"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<link name="pillar_front_right">
<visual>
<geometry>
<cylinder length=".03" radius="0.0025"></cylinder>
</geometry>
<origin xyz="0 0 0.015"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<link name="pillar_back_left">
<visual>
<geometry>
<cylinder length=".03" radius="0.0025"></cylinder>
</geometry>
<origin xyz="0 0 0.015"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<link name="pillar_back_right">
<visual>
<geometry>
<cylinder length=".03" radius="0.0025"></cylinder>
</geometry>
<origin xyz="0 0 0.015"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<joint name="base_to_pillar_front_left" type="fixed">
<origin xyz="0.13 0.07 0.0015"/>
<parent link="base_link"/>
<child link="pillar_front_left"/>
</joint>
<joint name="base_to_pillar_front_right" type="fixed">
<origin xyz="-0.13 0.07 0.0015"/>
<parent link="base_link"/>
<child link="pillar_front_right"/>
</joint>
<joint name="base_to_pillar_back_left" type="fixed">
<origin xyz="0.13 -0.07 0.0015"/>
<parent link="base_link"/>
<child link="pillar_back_left"/>
</joint>
<joint name="base_to_pillar_back_right" type="fixed">
<origin xyz="-0.13 -0.07 0.0015"/>
<parent link="base_link"/>
<child link="pillar_back_right"/>
</joint>
<link name="top_link">
<visual>
<geometry>
<box size="0.27 .15 .003"/>
</geometry>
<material name="white">
<color rgba="1 1 1 .5"/>
</material>
</visual>
</link>
<joint name="base_to_top" type="fixed">
<origin xyz="0 0 0.03"/>
<parent link="base_link"/>
<child link="top_link"/>
</joint>
</robot>