ROS学习笔记12 —— urdf/xacro的使用以及gazebo属性的描述

文章目录

  • 1. link 标签包含的元素
  • 2. joint标签
  • 3. xacro
      • 1) 常量定义与使用
      • 2) 数学
      • 3) 宏定义macro
        • 示例:
      • 4) 条件块
      • 5) rospack命令
      • 6) 包含其他xacro文件
      • 7) YAML
        • 8) 其他
  • 4. Gazebo标签
      • 1) 必须的标签
      • 2) 纹理相关
      • 3) 固定到世界坐标系
      • 4) transmission标签
      • 5) 验证gazebo模型
  • Node:

ROS学习笔记12 —— urdf/xacro的使用以及gazebo属性的描述_第1张图片

1. link 标签包含的元素

  • :定义在图形界面观察到的图形,图形通过子标签定义
  • :定义碰撞信息,通常与的内容相同
  • :定义惯性参数,其中
    • :重心位置
    • :质量
    • :转动惯量

注意,如果link标签没有inertial,那么在gazebo中将无法看到.

颜色定义:

  <material name="orange">
    <color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
  material>

2. joint标签

ROS学习笔记12 —— urdf/xacro的使用以及gazebo属性的描述_第2张图片

    
    <joint name="car_base_wheel" type="continuous">
    	
        <origin xyz="${(wheel_length+car_width)/2.0} 0.0 0.0" rpy="0.0 0.0 0.0"/>
    	
        <parent link="car_link"/>
        
        <child link="wheel"/>
        
        <axis xyz="0.0 1.0 0.0"/>
        
    joint>

关节类型如下:

  • 旋转(revolute):具有由上限和下限指定的有限范围
  • 连续(continuous) :绕轴旋转,没有上限和下限,例如轮子
  • 棱柱形(prismatic) :滑动接头,沿轴线滑动,并具有由上限和下限指定的有限范围
  • 固定(fixed) :自由度为0
  • 浮动(floating) :关节允许所有6个自由度的运动
  • 平面(planar):此允许在垂直于轴的平面内运动

其他属性参见:http://wiki.ros.org/urdf/XML/joint

注:这些属性在sw2urdf时可设置。

3. xacro

1) 常量定义与使用

<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />

<xacro:property name="the_radius" value="2.1" />
<xacro:property name="the_length" value="4.5" />

<geometry type="cylinder" radius="${the_radius}" length="${the_length}" />

2) 数学

可以使用+-*/()

<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />

<xacro:property name="R" value="2" />
<xacro:property name="alpha" value="${30/180*pi}" />
<circle circumference="${2 * pi * R}" pos="${sin(alpha)} ${cos(alpha)}" />
<limit lower="${radians(-90)}" upper="${radians(90)}" effort="0" velocity="${radians(75)}" />

3) 宏定义macro

简单宏定义:

       <xacro:macro name="default_inertial" params="mass">
           <inertial>
                   <mass value="${mass}" />
                   <inertia ixx="1.0" ixy="0.0" ixz="0.0"
                        iyy="1.0" iyz="0.0"
                        izz="1.0" />
           inertial>
       xacro:macro>


<xacro:default_inertial mass="10"/>

参数宏定义:

   <xacro:macro name="blue_shape" params="name *shape">
       <link name="${name}">
           <visual>
               <geometry>
                   <xacro:insert_block name="shape" />
               geometry>
               <material name="blue"/>
           visual>
           <collision>
               <geometry>
                   <xacro:insert_block name="shape" />
               geometry>
           collision>
       link>
   xacro:macro>

   
   <xacro:blue_shape name="base_link">
       <cylinder radius=".42" length=".01" />
   xacro:blue_shape>

示例:

例1:


<robot name="test" xmlns:xacro="http://www.ros.org/wiki/xacro">

	
	<xacro:property name="PI" value="3.1415926"/>
    <xacro:property name="width" value="0.2" />
    <xacro:property name="bodylen" value="0.6" />
   
	
   <link name="base_link">
       <visual>
           <geometry>
               <cylinder radius="${width}" length="${bodylen}"/>
           geometry>
           <material name="blue"/>
       visual>
       <collision>
           <geometry>
               <cylinder radius="${width}" length="${bodylen}"/>
           geometry>
       collision>
   link>


robot>

例2:使用宏定义,定义多条腿,降低代码量

   <xacro:macro name="leg" params="prefix reflect">
       <link name="${prefix}_leg">
           <visual>
               <geometry>
                   <box size="${leglen} 0.1 0.2"/>
               geometry>
               <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
               <material name="white"/>
           visual>
           <collision>
               <geometry>
                   <box size="${leglen} 0.1 0.2"/>
               geometry>
               <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
           collision>
           <xacro:default_inertial mass="10"/>
       link>
   
       <joint name="base_to_${prefix}_leg" type="fixed">
           <parent link="base_link"/>
           <child link="${prefix}_leg"/>
           <origin xyz="0 ${reflect*(width+.02)} 0.25" />
       joint>
       
   xacro:macro>
   <xacro:leg prefix="right" reflect="1" />
   <xacro:leg prefix="left" reflect="-1" />

4) 条件块

xacro具有类似于roslaunch的条件块,这对于诸如可配置的机器人或加载不同的Gazebo插件之类的事情很有用。任意bool型的python条件句都是可以的:

<xacro:if value="">
  <... some xml code here ...>
xacro:if>
<xacro:unless value="">
  <... some xml code here ...>
xacro:unless>



<xacro:property name="var" value="useit"/>
<xacro:if value="${var == 'useit'}"/>
<xacro:if value="${var.startswith('use') and var.endswith('it')}"/>

<xacro:property name="allowed" value="${[1,2,3]}"/>
<xacro:if value="${1 in allowed}"/>

5) rospack命令

<foo value="$(find xacro)" />
<foo value="$(arg myvar)" />


<xacro:arg name="myvar" default="false"/>


<param name="robot_description" command="$(find xacro)/xacro.py $(arg model) myvar:=true" />

6) 包含其他xacro文件

<xacro:include filename="$(find package)/other_file.xacro" />
<xacro:include filename="other_file.xacro" />
<xacro:include filename="$(cwd)/other_file.xacro" />


<xacro:include filename="other_file.xacro" ns="namespace"/>


${namespace.property}

7) YAML

校准数据时,从YAML中加载是理想的选择!

<xacro:property name="yaml_file" value="$(find package)/config/props.yaml" />
<xacro:property name="props" value="${load_yaml(yaml_file)}"/>


<xacro:property name="props" value="${dict(a=1, b=2, c=3)}"/>
<xacro:property name="numbers" value="${[1,2,3,4]}"/>




<xacro:property name="val1" value="${props['val1']}" />

8) 其他

从CMakeLists.txt中构建xacro、元素和属性等等,略~

4. Gazebo标签

1) 必须的标签

对于link

  
  <link name="link1">
    <collision>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
        <box size="${width} ${width} ${height1}"/>
      geometry>
    collision>

    <visual>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
        <box size="${width} ${width} ${height1}"/>
      geometry>
      <material name="orange"/>
    visual>

    <inertial>
      <origin xyz="0 0 1" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia
        ixx="1.0" ixy="0.0" ixz="0.0"
        iyy="1.0" iyz="0.0"
        izz="1.0"/>
    inertial>
  link>

其他可给link添加的标签:
ROS学习笔记12 —— urdf/xacro的使用以及gazebo属性的描述_第3张图片
对于joint

  <joint name="joint2" type="continuous">
    <parent link="link2"/>
    <child link="link3"/>
    <origin xyz="0 ${width} ${height2 - axel_offset*2}" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    
    
    <dynamics damping="0.7"/>
  joint>

其他可给joint设置的标签:
ROS学习笔记12 —— urdf/xacro的使用以及gazebo属性的描述_第4张图片

2) 纹理相关

gazebo中模型渲染纹理:传送门


<gazebo reference="link_name">
    <material>Gazebo/WoodFloormaterial>
    <mu1>0.5mu1>
    <mu2>0.5mu2>
gazebo>




  <gazebo reference="link1">
    <material>Gazebo/Orangematerial>
  gazebo>

mu1、mu2转到这篇博文:传送门

像在Rviz中一样,Gazebo可以同时使用STL和Collada文件。通常建议您使用Collada(.dae)文件,因为它们支持颜色和纹理,而对于STL文件,您只能使用纯色链接。

加载.dae文件:在标签下,写入:

<mesh filename="package://myrobot_description/meshes/kinect.dae">

3) 固定到世界坐标系

  
  <link name="world"/>

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="link1"/>
  joint>

4) transmission标签

该标签是为了实现gazebo对模型的驱动!

  1. type: 目前只有一个值:transmission_interface/SimpleTransmission
  2. joint:首先要指明transmission服务的joint的名称,之后其中包含一个必填属性

hardwareInterface:该属性表明了这个joint是什么类型的,常用的三个属性值:

  • EffortJointInterface(通过输入力控制电机)
  • VelocityJointInterface(控制电机的转速)
  • PositionJointInterface(控制电机的位置)
  1. actuator:首先要为你的执行器起一个名字(一般就是什么什么motor),之后指定执行器的内部属性
    • mechanicalReduction:指明电机的减速比
    • hardwareInterface:这个可以不指明,因为在joint中已经指明了

注:该部分转自https://blog.csdn.net/wubaobao1993/article/details/80960584

5) 验证gazebo模型

# 检查urdf能否正确的转换为sdf
gz sdf -p test.urdf

# 查看sdf所需信息丢失的任何警告
cat ~/.gazebo/gzsdf.log

具体实例参考:传送门

URDF只能单独指定单个机器人的运动学和动力学特性,而无法指定机器人本身在世界中的姿态,同时它也不是通用的描述格式,并且缺乏摩擦和其他特性。为了解决这些缺点,可以使用SDF文件描述模型

Node:

  • ros中joint驱动靠TF,gazebo中靠物理引擎!

  • 使用名称前缀获取两个相似的对象

  • 利用urdf_tutorial功能包查看生成的模型:

    roslaunch urdf_sim_tutorial display.launch model:=rbo.urdf.xacro
    
  • 将xacro转换为urdf:

    rosrun  xacro  xacro.py  test.xacro > test.urdf
    
  • launch文件中调用xacro文件解析器

    <arg name="model" default="$(find xacro)/xacro --inorder '$(find robot_description)/urdf/test.xacro'"/>
    <param name="robot_description" command="$(arg model)"/>
    
  • 将sdf文件转为urdf

    rosrun pysdf sdf2urdf test.sdf test.urdf
    

    注意,转完后关节力和速度限位默认为-1,如果有需要,记得修改;该转换仅对单纯的模型描述有效,如果引入球关节等urdf实现不了的文件,则会失败

  • 检查sdf转urdf后的文件:

    sudo apt-get install liburdfdom-tools
    
    check_urdf test.urdf
    

参考文献:

  • http://wiki.ros.org/urdf/Tutorials/Using%20Xacro%20to%20Clean%20Up%20a%20URDF%20File
  • http://wiki.ros.org/xacro#Math_expressions
  • https://blog.csdn.net/wubaobao1993/article/details/80947968
  • http://gazebosim.org/tutorials?tut=ros_urdf&cat=connect_ros
  • https://blog.csdn.net/wubaobao1993/article/details/80960584
  • http://wiki.ros.org/urdf/XML/joint

你可能感兴趣的:(▶,机器人操作系统ROS/ROS2)