URDF与xacro

53 篇文章 0 订阅
43 篇文章 1 订阅

什么是URDF

 

全称为 Unified Robot Description Format ,翻译为中文为 统一机器人描述性格式

那么这里我们可以确定,**URDF**是用来描述机器人的,通过一些特定的格式将机器人具体的描述出来,供计算机进行理解操作。

URDF描述规范

  • 用一个文件描述一个机器人模型
  • 文件的后缀为.urdf
  • 文件的内容格式为xml格式
  • xml根节点为robot

通过创建一个hello.urdf文件我们来认知一下URDF的基本规范:

<?xml version="1.0"?>
<robot name="hello">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>
</robot>

连杆介绍

link 我们称之为连杆。在官方介绍中,用a rigid body描述link

a rigid body:僵硬的躯体。意思是不可移动的,固定的。

在URDF描述性语言中,link是用来描述物理特性的。

  • 描述视觉显示
  • 描述碰撞属性
  • 描述物理惯性

我们用xml格式来表达连杆如下:

<link name="my_link">
    <visual></visual>
    <collision></collision>
    <inertial></inertial>
</link>

visual视觉显示

<visual>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <geometry>
        <box size="1 1 1" />
    </geometry>
    <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
    </material>
</visual>

geometry形状

box盒装

<box size="1 1 1" />

cylinder圆柱状

<cylinder length="0.6" radius="0.2"/>

sphere球状

<sphere radius="1" />

mesh指向对应的文件

origin位置姿态

<origin xyz="0 0 0" rpy="0 0 0" />

material材质

<material name="blue">
    <color rgba="0 0 1.0 1.0"/>
</material>

通用启动的launch文件

<launch>
    <arg name="model" default="geometry_box.urdf"/>
    <arg name="gui" default="true" />
    <arg name="rvizconfig" default="$(find demo_urdf)/rviz/urdf.rviz" />

    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find demo_urdf)/urdf/$(arg model)" />
    <param name="use_gui" value="$(arg gui)"/>

    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>

启动: 仿真
 roslaunch demo_tf config.launch mode:=geometry_box.urdf 后面参数自己改,不传的话默认geometry_box.urdf

----------------------------------------------------

link 代码:

*.文件

<?xml version="1.0" encoding="UTF-8" ?>
<robot name="box">

<!-- 写法2 纹理2 -->
 <material name="mycolor">
        <!-- [0, 255]
         rgba取值是[0,1]
         blue: 0 0 255 255
         -->
        <color rgba="0.8 0.4 0 1"/>

    </material>


    <!-- link -->
    <link name="base">
        <!-- visual -->

        <visual>
            <!-- 位置和姿态 
                位置 :xyz="0 0 0"
                姿态 rpy是弧度值: 3.14/2=1.57/2=0.785
            -->
            <origin xyz="0 0 0" rpy="0.785 0.785 0.785" />
            <!-- 形状 -->
            <geometry>
                <!-- size 用来描述长宽高(x, y, z) -->
                <box size="1 2 3"/>
                <!-- 圆柱体 半径和高度 单位米 -->
                <!--<cylinder length="0.6" radius="0.2" />-->
                <!-- 球体 半径单位米 -->
                <!--<sphere radius="1"/>-->
                <!-- 纹理文件 加载已经创建好的 3d模型文件-->
                <!--   <mesh filename="package://demo_urdf/meshes/bowl.dae"/>-->
                <!--<mesh filename="package://demo_urdf/meshes/cft.dae"/>-->

            </geometry>

               <!--写法1 纹理 1 -->
                <material name="blue">
                <!-- [0, 255]
                 rgba取值是[0,1]
                 取值  需要的值/255
                 blue: 0 0 255 255
                 -->
                <color rgba="0 0 1 0.5"/>
                </material>

            <!-- 写法2 纹理2 -->
            <!--<material name="mycolor"/>-->

        </visual>

    </link>



   <!-- link -->
    <link name="link2">
        <visual>
            <origin xyz="0 0 0.5"/>
            <geometry>
                <box size="0.3 0.3 1"/>
            </geometry>
            <material name="c2"/>
        </visual>
    </link>
    <!-- 连接点 fixed 固定 -->
    <joint name="joint1" type="fixed">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
    </joint>

    <!-- 连接点 revolute 旋转-->
    <joint name="joint1" type="revolute">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
        <axis xyz="0 1 0"/>

        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
    </joint>

   <!-- 连接点 continuous旋转,没有旋转弧度限制可以一直旋转-->
    <joint name="joint1" type="continuous">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
        <axis xyz="0 1 0"/>

<!--        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />-->
    </joint>
  <!-- 连接点 prismatic 滑动-->
  <joint name="joint1" type="prismatic">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
<!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
        <axis xyz="0 0 1"/>

        <!-- 限定范围
        limit主要是限制child的旋转的范围。
        lower和upper限制了旋转的弧度范围
        effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
        velocity限制了转动时的速度,单位为米/秒或m/s
        -->
        <limit effort="30" velocity="1.0" lower="-1.5" upper="1.5" />
    </joint>

</robot>

连接点代码:

<?xml version="1.0" encoding="UTF-8" ?>
<robot name="box">

    <material name="c1">
        <color rgba="0.8 0.4 0 0.8"/>
    </material>

    <material name="c2">
        <color rgba="0 0 1 0.8"/>
    </material>

    <!-- link -->
    <link name="base">
        <visual>
            <geometry>
                <box size="0.2 0.2 0.6"/>
            </geometry>
            <material name="c1"/>
        </visual>
    </link>

    <!-- link -->
    <link name="link2">
        <visual>
            <origin xyz="0 0 0.5"/>
            <geometry>
                <box size="0.3 0.3 1"/>
            </geometry>
            <material name="c2"/>
        </visual>
    </link>
    <!-- 连接点 fixed 固定 -->
    <joint name="joint1" type="fixed">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
    </joint>

    <!-- 连接点 revolute 旋转-->
    <joint name="joint1" type="revolute">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>

        <axis xyz="0 1 0"/>

        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
    </joint>

   <!-- 连接点 continuous旋转,没有旋转弧度限制可以一直旋转-->
    <joint name="joint1" type="continuous">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>
        <!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
        <axis xyz="0 1 0"/>

<!--        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />-->
    </joint>
  <!-- 连接点 prismatic 滑动-->
  <joint name="joint1" type="prismatic">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>

        <axis xyz="0 0 1"/>

        <!-- 限定范围
        limit主要是限制child的旋转的范围。
        lower和upper限制了旋转的弧度范围
        effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
        velocity限制了转动时的速度,单位为米/秒或m/s
        -->
        <limit effort="30" velocity="1.0" lower="-1.5" upper="1.5" />
    </joint>
</robot>

xacro 代码:

<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">

    <!-- xacro
     variable
     -->

    <!-- base box all properties -->
    <xacro:property name="box_size_x" value="0.2" />
    <xacro:property name="box_size_y" value="0.5" />
    <xacro:property name="box_size_z" value="0.3" />

    <!-- link -->
    <link name="base">
        <!-- visual -->

        <visual>
            <geometry>
                <box size="${box_size_x * 2} ${box_size_y + 0.4} ${box_size_z / 2}"/>
            </geometry>

        </visual>
    </link>

</robot>
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">

    <material name="c1">
        <color rgba="0.8 0.4 0 0.8"/>
    </material>

    <material name="c2">
        <color rgba="0 0 1 0.8"/>
    </material>

    <xacro:macro name="mylink" params="name size color xyz:='0 0 0'">
        <link name="${name}">
            <visual>
                <origin xyz="${xyz}"/>
                <geometry>
                    <box size="${size}"/>
                </geometry>
                <material name="${color}"/>
            </visual>
        </link>
    </xacro:macro>

    <!-- link -->
<!--    <link name="base">-->
<!--        <visual>-->
<!--            <geometry>-->
<!--                <box size="0.2 0.2 0.6"/>-->
<!--            </geometry>-->
<!--            <material name="c1"/>-->
<!--        </visual>-->
<!--    </link>-->
    <xacro:mylink name="base" size="0.2 0.2 0.6" color="c1"/>

    <!-- link -->
<!--    <link name="link2">-->
<!--        <visual>-->
<!--            <origin xyz="0 0 0.5"/>-->
<!--            <geometry>-->
<!--                <box size="0.3 0.3 1"/>-->
<!--            </geometry>-->
<!--            <material name="c2"/>-->
<!--        </visual>-->
<!--    </link>-->
    <xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="c2"/>

    <joint name="joint1" type="revolute">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>

        <axis xyz="0 1 0"/>

        <!-- 限定范围
        limit主要是限制child的旋转的范围。
        lower和upper限制了旋转的弧度范围
        effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
        velocity限制了转动时的速度,单位为米/秒或m/s
        -->
        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
    </joint>

</robot>
<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">

    <material name="c1">
        <color rgba="0.8 0.4 0 0.8"/>
    </material>

    <material name="c2">
        <color rgba="0 0 1 0.8"/>
    </material>

    <xacro:macro name="MyColor" params="name">

        <material name="${name}">
            <xacro:if value="${name=='red'}">
                <color rgba="1.0 0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='green'}">
                <color rgba="0 1.0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='blue'}">
                <color rgba="0 0 1.0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='white'}">
                <color rgba="1.0 1.0 1.0 1.0"/>
            </xacro:if>
        </material>

    </xacro:macro>


    <!-- link -->
    <link name="base">

        <visual>
            <origin xyz="0 0 0" rpy="0.785 0.785 0.785"/>
            <geometry>
                <box size="0.5 1 1.5"/>
            </geometry>
            <xacro:MyColor name="white"/>
        </visual>
    </link>

</robot>

已整理的xacro 通用d代码模板

*.xacro 文件

<?xml version="1.0" encoding="UTF-8" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="box">
    <material name="c1">
        <color rgba="0.8 0.4 0 0.8"/>
    </material>
    <material name="c2">
        <color rgba="0 0 1 0.8"/>
    </material>
    <xacro:macro name="MyColor" params="name">
        <material name="${name}">
            <xacro:if value="${name=='red'}">
                <color rgba="1.0 0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='green'}">
                <color rgba="0 1.0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='blue'}">
                <color rgba="0 0 1.0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='white'}">
                <color rgba="1.0 1.0 1.0 1.0"/>
            </xacro:if>
        </material>

    </xacro:macro>

 <!--    <xacro:macro name="mylink" params="name size color xyz:='0 0 0'">-->
   <!--      <link name="${name}">-->
   <!--          <visual>-->
     <!--            <origin xyz="${xyz}"/>-->
     <!--            <geometry>-->
     <!--                <box size="${size}"/>-->
     <!--            </geometry>-->
     <!--           <material name="${color}"/> -->
      <!--       </visual>-->
     <!--    </link>-->
   <!--  </xacro:macro>-->
    
     <xacro:macro name="mylink" params="name size colorname xyz:='0 0 0'">
        <link name="${name}">
            <visual>
                <origin xyz="${xyz}"/>
                <geometry>
                    <box size="${size}"/>
                </geometry>
             <!--  <material name="${color}"/> -->
              <xacro:MyColor name="${colorname }"/>
            </visual>
        </link>
    </xacro:macro>


    <!--<xacro:mylink name="base" size="0.2 0.2 0.6" color="c1"/>-->

    <!-- <xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="c2"/>-->
    <xacro:mylink name="base" size="0.2 0.2 0.6" color="red"/>

    <xacro:mylink name="link2" size="0.3 0.3 1" xyz="0 0 0.5" color="blue"/>

    <joint name="joint1" type="revolute">
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
        <parent link="base"/>
        <child link="link2"/>

         <!-- 0 1 0 对应 x y z ,表示按y轴旋转 -->
        <axis xyz="0 1 0"/>

        <!-- 限定范围
        limit主要是限制child的旋转的范围。
        lower和upper限制了旋转的弧度范围
        effort限制的是转动过程中的受力范围.(正负value值,单位为牛或N)
        velocity限制了转动时的速度,单位为米/秒或m/s
        -->

        <limit effort="30" velocity="1.0" lower="-3.1415926" upper="3.1415926" />
    </joint>

</robot>

配置默认使用xml打开urdf文件;

ps: 项目第一次创建时就可以选择xml打开,但是你第一次选择的是txt默认打开的话需要在这个设置里把它改过来

4.1 删除默认txt文件打开

4.2添加默认xml文件方式打开urdf文件 

报这个错误时: Could not find the GUI, install the 'joint_state_publisher_gui' package

安装:

sudo apt install ros-melodic-joint-state-publisher-gui

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值