ROS2学习记录(12)-URDF:机器人建模方法
机器人的组成:建模描述机器人的过程中,我们自己需要先熟悉机器人的组成和参数,比如机器人一般是由硬件结构、驱动系统、传感器系统、控制系统四大部分组成,市面上一些常见的机器人,无论是移动机器人还是机械臂,我们都可以按照这四大组成部分进行分解。

硬件结构就是底盘、外壳、电机等实打实可以看到的设备;

驱动系统就是可以驱使这些设备正常使用的装置,比如电机的驱动器,电源管理系统等;

传感系统包括电机上的编码器、板载的IMU、安装的摄像头、雷达等等,便于机器人感知自己的状态和外部的环境;

控制系统就是我们开发过程的主要载体了,一般是树莓派、电脑等计算平台,以及里边的操作系统和应用软件。

机器人建模的过程,其实就是按照类似的思路,通过建模语言,把机器人每一个部分都描述清楚,再组合起来的过程。

ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境(桌子等)。

URDF模型文件使用的是XML格式

在建模中,大臂和小臂就类似机器人的这些独立的刚体部分,称为连杆Link,手肘就类似于机器人电机驱动部分,称为关节joint

所以在URDF建模过程中,关键任务就是通过这里的<link>和<joint>,理清楚每一个连杆和关节的描述信息。

连杆Link

描述机器人某个刚体部分的外观和物理属性

描述连杆尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。

每个Link会成为一个坐标系。

以一个机械臂连杆为例,它的link描述如下:

<link name="link_4">
    <visual>
        <geometry>
            <mesh filename="link_4.stl"/>
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
    </visual>
    <collision>
        <geometry>
            <cylinder length="0.5" radius="0.1"/>
        </geometry>
        <origin xyz="0 0 -0.05″ rpy="0 0 0" />
    </collision>
</1ink>

link标签中的name表示该连杆的名称,我们可以自定义,未来joint连接link的时候,会使用到这个名称。

link里边的<visual>部分用来描述机器人的外观,比如:

  • <geometry>表示几何形状,里边使用<mesh>调用了一个在三维软件中提前设计好的蓝色外观,是一个stl文件,看上去和真实机器人是一致的
  • <origin>表示坐标系相对初始位置的偏移,分别是x、y、z方向上的平移,和roll、pitch、raw三个方向上的旋转,不需要偏移的话,就全为0。

第二个部分<collision>,描述碰撞参数,里边的内容似乎和<visual>一样,也有<geometry>和<origin>,看似相同,其实区别还是比较大的。

  • <visual>部分重在描述机器人看上去的状态,也就是视觉效果;
  • <collision>部分则是描述机器人运动过程中的状态,比如机器人与外界如何接触算作碰撞。

在这个机器人模型中,蓝色部分是通过<visual>来描述的,在实际控制过程中,这样复杂的外观在计算碰撞检测时,要求的算力较高,为了简化计算,我们将碰撞检测用的模型简化为了绿色框的圆柱体,也就是<collision>里边<geometry>描述的形状。<origin>坐标系偏移也是类似,可以描述刚体质心的偏移。

对于移动机器人的话,link也可以用来描述小车的车体、轮子等部分。

机器人的刚体之间要通过<joint>相连接后才可以产生相对运动。

关节joint

描述两个link之间的关系,分为六种类型;
包括关节运动的位置和速度限制;
描述机器人关节的运动学和动力学属性。

URDF的<joint>有六种运动类型:

  1. continuous,描述旋转运动,可以围绕某一个轴无限旋转,比如小车的轮子,就属于这种类型。
  2. revolute,也是旋转关节,和continuous类型的区别在于不能无限旋转,而是带有角度限制,比如机械臂的两个连杆,就属于这种运动。
  3. prismatic,是滑动关节,可以沿某一个轴平移,也带有位置的极限,一般直线电机就是这种运动方式。
  4. fixed,固定关节,是唯一一种不允许运动的关节,不过使用还是比较频繁的,比如相机这个连杆,安装在机器人上,相对位置是不会变化的,此时使用的连接方式就是Fixed。
  5. Floating是浮动关节,第六种planar是平面关节,这两种使用相对较少。
  6. planar是平面关节,允许在平面正交方向上平移或者旋转。

在URDF模型中,每一个link都使用这样一段xml内容描述,比如关节的名字叫什么,运动类型是哪一种。以下即是一个joint的示例:

<joint name="joint_2" type="revolute">
    <parent link="link_i"/>
    <child link="link2"/>
    <origin xyz="0.2 0.2 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" velocity="1.0"/>
</joint>
  • parent标签:描述父连杆;
  • child标签:描述子连杆,子连杆会相对父连杆发生运动;
  • origin:表示两个连杆坐标系之间的关系,也就是图中红色的向量,可以理解为这两个连杆该如何安装到一起;
  • axis表示关节运动轴的单位向量,比如z等于1,就表示这个旋转运动是围绕z轴的正方向进行的;
  • limit就表示运动的一些限制了,比如最小位置,最大位置,和最大速度等。

最终所有的link和joint标签完成了对机器人每个部分的描述和组合,全都放在一个robot标签中,就形成了完整的机器人模型。

机器人robot

完整机器人模型的最顶层标签
<link>和<joint>标签都必须包含在<robot>标签内
一个完整的机器人模型,由一系列<link>和<joint>组成

一个机器人的示例如下:

<robot name="<name of the robot>">
    <link>......</link>
    <link>......</link>
    <joint>......</joint>
    <joint>......</joint>
</robot>

遇到一个机器人,在看代码前,应该先找link和joint,再去看细节。

可以使用以下语句查看URDF模型结构:

urdf_to_graphviz mbot_base.urdf  # 在模型文件夹下运行

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇