• ROS从入门到精通3-1:详解urdf语法并自定义机器人


    0 专栏介绍

    本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。

    🚀详情:《ROS从入门到精通》

    1 urdf文件是什么?

    统一(标准化)机器人描述格式(Unified Robot Description Format, URDF)XML标签文件的方式描述机器人的部分结构——例如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度,该描述文件可被C++内置解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件。

    关于xml文件的基本语法格式请参考ROS从入门到精通1-3:ROS运行管理与常用配置文件

    在这里插入图片描述

    2 urdf基本语法

    2.1 robot标签

    urdf中为保证XML语法的完整性,使用robot作为根标签,其他所有标签都必须包含在robot标签内,在该标签内可通过name属性设置机器人模型的名称。

    2.2 link标签

    urdf中的link标签用于描述机器人某个刚性部件(连杆)的外观和物理属性,例如机器人底座、轮子、激光雷达、摄像头等。在link标签内可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性。

    在这里插入图片描述
    其常见子标签阐述如下

    2.2.1 visual标签

    可视标签visual用于描述连杆的外观信息,其下还有子标签

    • geometry标签

      geometry标签用于描述连杆形状

      1. 子标签:盒状box,属性:长x、宽y、高z
      2. 子标签:圆柱状cylinder,属性:半径radius、高度length
      3. 子标签:球状sphere,属性:半径radius
      4. 子标签:皮肤mesh,属性:皮肤资源路径filename,格式为package:///.../file
    • origin标签

      origin标签用于描述偏移量与倾斜弧度

      • 属性:笛卡尔坐标xyz,欧拉角坐标rpy(单位弧度)
    • material标签

      material标签用于描述材料属性

      • 属性:名称name
      1. 子标签: 颜色color,属性:RGBA色系rgba

    2.2.2 collision标签

    collision标签用于描述连杆碰撞属性

    2.2.3 inertial标签

    inertial标签用于描述连杆惯性矩阵

    2.3 joint标签

    urdf中的joint标签用于描述机器人关节的运动学、动力学、安全极限等属性(该属性在模型中不可见),机器人的两个连杆间以关节形式连接,不同关节有不同运动形式——旋转、滑动、固定等,例如安装在底座上的轮子可以360°旋转,而摄像头则可能是完全固定在底座上。

    在这里插入图片描述
    joint标签有属性

    • 关节名称name
    • 关节运动形式type
      • 旋转关节continuous,可绕单轴无限旋转
      • 旋转关节revolute,可绕单轴有限旋转
      • 平动关节prismatic,可沿某轴线有限平动
      • 平面关节planer,可在平面正交方向上平移或旋转
      • 浮动关节floating,可进行平移、旋转运动
      • 固定关节fixed,不允许运动的特殊关节

    joint标签常见子标签:

    1. 子标签:父连杆parent,属性:父连杆名称link
    2. 子标签:子连杆child,属性:子连杆名称link
    3. 子标签:偏移量与倾斜弧度origin,属性:笛卡尔坐标xyz,欧拉角坐标rpy(单位弧度)
    4. 子标签:运动方向axis,属性笛卡尔坐标xyz

    3 案例一:分别生成球体的机器人部件

    分别生成长方体、圆柱与球体的机器人部件

    <robot name="simple">
      <link name="base_link">
        <visual>
            
            <geometry>
                
                
                
                
                
                <sphere radius="0.3" />
            geometry>
            
            <origin xyz="0 0 0" rpy="0 0 0" />
            
            <material name="black">
                <color rgba="0.7 0.5 0 0.5" />
            material>
        visual>
      link>
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    4 案例二:自定义机器人

    制作一个简单机器人:先定义连杆,再定义关节将连杆连接起来。

    <robot name="robot">
        <link name="base_link">
            <visual>
                <geometry>
                    <box size=".2 .3 .1"/>
                geometry>
                <origin rpy="0 0 0" xyz="0 0 0.05"/>
                <material name="white">
                    <color rgba="1 1 1 1"/>
                material>
            visual>
        link>
        
        <link name="wheel1_link">
            <visual>
                <geometry>
                    <cylinder length="0.05" radius="0.05"/>
                geometry>
                <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
                <material name="black">
                    <color rgba="0 0 0 1"/>
                material>
            visual>	
        link>
        
        <link name="wheel2_link">
            <visual>
                <geometry>
                    <cylinder length="0.05" radius="0.05"/>
                geometry>
                <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
                <material name="black"/>
            visual>	
        link>
        
        <link name="wheel3_link">
            <visual>
                <geometry>
                    <cylinder length="0.05" radius="0.05"/>
                geometry>
                <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
                <material name="black"/>
            visual>	
        link>
        
        <link name="wheel4_link">
            <visual>
                <geometry>
                    <cylinder length="0.05" radius="0.05"/>
                geometry>
                <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
                <material name="black"/>
            visual>	
        link>
    
        <joint name="wheel1_joint" type="fixed">
            <parent link="base_link"/>
            <child link="wheel1_link"/>
            <origin xyz="0 0 0"/>
        joint>
        
        <joint name="wheel2_joint" type="fixed">
            <parent link="base_link"/>
            <child link="wheel2_link"/>
            <origin xyz="0 0 0"/>
        joint>
        
        <joint name="wheel3_joint" type="fixed">
            <parent link="base_link"/>
            <child link="wheel3_link"/>
            <origin xyz="0 0 0"/>
        joint>
        
        <joint name="wheel4_joint" type="fixed">
            <parent link="base_link"/>
            <child link="wheel4_link"/>
            <origin xyz="0 0 0"/>
        joint>
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    在这里插入图片描述

    5 附录:常用工具

    以案例二为例进行工具演示。

    5.1 检查urdf语法

    安装检查工具

    sudo apt install liburdfdom-tools
    
    • 1

    检查某个urdf文件

    check_urdf robot.urdf
    
    • 1

    检查结果如下:

    在这里插入图片描述

    5.2 可视化urdf

    运行以下语句

    urdf_to_graphiz robot.urdf
    evince robot.pdf
    
    • 1
    • 2

    即可查看urdf文件结构
    在这里插入图片描述


    🔥 更多精彩专栏


    👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
  • 相关阅读:
    Linux初探 - 概念上的理解和常见指令的使用
    基础算法一:大整数模积运算
    Redis的集群模式搭建
    【微服务】如何保证接口的幂等性
    Python面试题总结
    java计算机毕业设计校园失物招领管理系统源程序+mysql+系统+lw文档+远程调试
    Oracle内存结构
    docker
    Linux docker安装RStudio Server结合内网穿透实现公网访问内网服务
    Lua中如何实现类似gdb的断点调试—06断点行号检查与自动修正
  • 原文地址:https://blog.csdn.net/FRIGIDWINTER/article/details/126264611