ROS总结(二)用xacro简化urdf

ROS总结(二)用xacro简化urdf

官方教程

包含其他xacro文件

  <xacro:include filename="$(find mybot_description)/urdf/benebot.gazebo.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/laser.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/camera.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/layer.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/VLP-16.urdf.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/sonar.xacro"/>

属性标签方便后面修改

  <xacro:property name="M_PI" value="3.1415926535897931" />
  <xacro:property name="M_PI_2" value="1.570796327" />
  <xacro:property name="DEG_TO_RAD" value="0.017453293" />

宏标签:调用时完善宏名称和参数列表

  <xacro:macro name="cylinder_inertia" params="m r h">
    
  xacro:macro>

在link标签中直接调用宏完成惯性参数的计算

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${base_mass}"/>
      <cylinder_inertia  m="${base_mass}" r="${base_radius}" h="${base_height}" />
    inertial>

其他调用xacro的模块:超声、激光、camera等

  <sonar pos="front_left" xyz="${base_radius*0.707} ${base_radius*-0.707} ${connect_height+base_height}" rpy="0 0 -1.04"/>
  <sonar pos="front_mid" xyz="${base_radius} 0 ${connect_height+base_height}" rpy="0 0 0"/>
  <sonar pos="front_right" xyz="${base_radius*0.707} ${base_radius*0.707} ${connect_height+base_height}" rpy="0 0 1.04"/>
  <sonar pos="back_mid" xyz="${-1*base_radius} 0 ${connect_height+base_height}" rpy="0 0 3.14"/>
  <layer parent="base_link" num="first" z_offset="${base_height/2}"/>
  <laser parent="first_layer_link"/>
  <openni_camera parent="camera_base"/>
  <VLP-16 parent="base_link" name="velodyne" topic="/velodyne_points" hz="10" samples="440" gpu="${gpu}">
    <origin xyz="0 0 0.6" rpy="0 0 0" />
  VLP-16>

完整mybot.urdf.xacro:


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

  <xacro:include filename="$(find mybot_description)/urdf/benebot.gazebo.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/laser.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/camera.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/layer.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/VLP-16.urdf.xacro" />
  <xacro:include filename="$(find mybot_description)/urdf/sonar.xacro"/>

  <xacro:property name="M_PI" value="3.1415926535897931" />
  <xacro:property name="M_PI_2" value="1.570796327" />
  <xacro:property name="DEG_TO_RAD" value="0.017453293" />

  <xacro:property name="base_height" value="0.02" />
  <xacro:property name="base_radius" value="0.25" />
  <xacro:property name="base_mass" value="5" /> 
  <xacro:property name="wheel_radius" value="0.09" />
  <xacro:property name="wheel_height" value="0.04" />
  <xacro:property name="wheel_mass" value="1" /> 
  <xacro:property name="base_to_wheel_x" value="0" />
  <xacro:property name="base_to_wheel_y" value="0.21" />
  <xacro:property name="base_to_wheel_z" value="0.06" />
  <xacro:property name="layer_radius" value="0.25" />
  <xacro:property name="layer_height" value="0.02" />
  <xacro:property name="layer_mass" value="5" /> 
  <xacro:property name="connect_radius" value="0.05" />
  <xacro:property name="connect_height" value="0.2" />
  <xacro:property name="connect_mass" value="2" /> 
  <xacro:arg name="gpu" default="true"/>
  <xacro:property name="gpu" value="$(arg gpu)" />

  <xacro:macro name="cylinder_inertia" params="m r h">
    
  xacro:macro>

  <link name="base_footprint"/>

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0.0 0.0 0.02" rpy="0 0 0"/>
  joint>

  <link name="base_link">
    <visual>
      <origin xyz="0 0 0.02" rpy="0 0 0"/>
      <geometry>
        <cylinder length="${base_height}" radius="${base_radius}" />
      geometry>
      <material name="light_black"/>
    visual>

    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="${base_height}" radius="${base_radius}" />
      geometry>
    collision>

    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="${base_mass}"/>
      <cylinder_inertia  m="${base_mass}" r="${base_radius}" h="${base_height}" />
    inertial>
  link>

  <joint name="wheel_left_joint" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_left_link"/>
    <origin xyz="${base_to_wheel_x} ${base_to_wheel_y} ${base_to_wheel_z}" rpy="-1.57 0 0"/>
    <axis xyz="0 0 1"/>
  joint>

  <link name="wheel_left_link">
    <visual>
      <origin xyz="0 0 0" rpy="1.57 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/meshes/wheels/left_tire.stl" scale="0.0028 0.0025 0.0028"/>
      geometry>
      <material name="dark"/>
    visual>

    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="${wheel_height}" radius="${wheel_radius}" />
      geometry>
    collision>

    <inertial>
      <origin xyz="0 0 0" />
      <mass value="${wheel_mass}"/>
      <cylinder_inertia  m="${wheel_mass}" r="${wheel_radius}" h="${wheel_height}" />
    inertial>
  link>

  <joint name="wheel_right_joint" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_right_link"/>
    <origin xyz="${base_to_wheel_x} ${-1*base_to_wheel_y} ${base_to_wheel_z}" rpy="-1.57 0 0"/>
    <axis xyz="0 0 1"/>
  joint>

  <link name="wheel_right_link">
    <visual>
      <origin xyz="0 0 0" rpy="1.57 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/meshes/wheels/right_tire.stl" scale="0.0028 0.0025 0.0028"/>
      geometry>
      <material name="dark"/>
    visual>

    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="${wheel_height}" radius="${wheel_radius}" />
      geometry>
    collision>

    <inertial>
      <origin xyz="0 0 0" />
      <mass value="${wheel_mass}"/>
      <cylinder_inertia  m="${wheel_mass}" r="${wheel_radius}" h="${wheel_height}" />
    inertial>
  link>\
  <joint name="caster_front_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_front_link"/>
    <origin xyz="0.22 0 -0.0088" rpy="-1.57 0 0"/>
    <axis xyz="1 1 1"/>
  joint>

  <link name="caster_front_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.4 0.04 0.04"/>
      geometry>
    collision>

    <inertial>
      <origin xyz="0 0 0" />
      <mass value="0.005" />
      <inertia ixx="0.001" ixy="0.0" ixz="0.0"
               iyy="0.001" iyz="0.0"
               izz="0.001" />
    inertial>
  link>
  <joint name="caster_back_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_back_link"/>
    <origin xyz="-0.22 0 -0.0088" rpy="-1.57 0 0"/>
    <axis xyz="1 1 1"/>
  joint>

  <link name="caster_back_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.04 0.04 0.04"/>
      geometry>
    collision>

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

  <link name="camera_base">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry>
          <box size="0.01 0.01 ${camera_base_height}"/>
        geometry>
    visual>
  link>

  <joint name="base_camera_joint" type="fixed">
    <origin xyz="0 0 ${base_height/2+camera_base_height/2}" rpy="0 0 0"/>
    <parent link="first_layer_link"/>
    <child link="camera_base"/>
  joint>

  <joint name="imu_joint" type="fixed">
    <parent link="base_link"/>
    <child link="imu_link"/>
    <origin xyz="-0.032 0 0.068" rpy="0 0 0"/>
  joint>

  <link name="imu_link"/>

  
  <sonar pos="front_left" xyz="${base_radius*0.707} ${base_radius*-0.707} ${connect_height+base_height}" rpy="0 0 -1.04"/>
  <sonar pos="front_mid" xyz="${base_radius} 0 ${connect_height+base_height}" rpy="0 0 0"/>
  <sonar pos="front_right" xyz="${base_radius*0.707} ${base_radius*0.707} ${connect_height+base_height}" rpy="0 0 1.04"/>
  <sonar pos="back_mid" xyz="${-1*base_radius} 0 ${connect_height+base_height}" rpy="0 0 3.14"/>
  <layer parent="base_link" num="first" z_offset="${base_height/2}"/>
  <laser parent="first_layer_link"/>
  <openni_camera parent="camera_base"/>
  <VLP-16 parent="base_link" name="velodyne" topic="/velodyne_points" hz="10" samples="440" gpu="${gpu}">
    <origin xyz="0 0 0.6" rpy="0 0 0" />
  VLP-16>
robot>

你可能感兴趣的:(ROS)