Xacro的使用

realsense_ros_gazebo里提供的.xacro就是个大套娃,为了提取最关键最重要的部分进行urdf/sdf转换,需要将文件进行重构,具体来说就是将xacro中的描述性代码复制到urdf中,随后进行xacro->urdf->sdf的转换

1 xacro转urdf (1) 利用cd命令切换到 xxx.acro 目录下 (2) 执行下面命令即可

rosrun xacro xacro xxx.xacro > xxx.urdf

2 urdf转sdf (1) 利用cd命令切换到 xxx.urdf 目录下 (2) 执行下面命令即可

 gz sdf -p xxx.urdf > xxx.sdf

修改实例如下:

修改前:

<?xml version="1.0"?>
<robot name="test_model" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <xacro:include filename="$(find realsense_ros_gazebo)/xacro/tracker.xacro"/>
  <xacro:include filename="$(find realsense_ros_gazebo)/xacro/depthcam.xacro"/>

  <link name="base_footprint"/>

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

  <link name="base_link">
    <visual>
      <origin rpy="0 0 0 " xyz="0 0 0.005"/>
      <geometry>
          <box size="0.4 0.4 0.01"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="0 0 0 " xyz="0 0 0.005"/>
      <geometry>
        <box size="0.4 0.4 0.01"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0 " xyz="0 0 0.005"/>
      <geometry>
        <box size="0.4 0.4 0.01"/>
      </geometry>
      <mass value="100"/>
      <inertia ixx="1.0265" ixy="0" ixz="0" iyy="1.3944999999999999" iyz="0" izz="2.1320000000000001"/>
    </inertial>
  </link>

  <!-- TEST -->

  <!--   <xacro:realsense_d435 sensor_name="d435" parent_link="base_link" rate="10">
    <origin rpy="0 0 0 " xyz="0 0 0.5"/>
  </xacro:realsense_d435>-->

  <xacro:realsense_T265 sensor_name="camera" parent_link="base_link" rate="30.0">
    <origin rpy="0 0 0" xyz="0 0 0.5"/>
  </xacro:realsense_T265> 

  <!-- <xacro:realsense_R200 sensor_name="camera" parent_link="base_link" rate="30.0">
    <origin rpy="0 0 0" xyz="0 0 0.5"/>
  </xacro:realsense_R200> -->


</robot>

修改后:

<?xml version="1.0"?>
<robot name="t265" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- T265 Fisheye:-->
  <xacro:macro name="T265_fisheye" params="sensor_name reference_frame topic rate">
    <gazebo reference="${reference_frame}">
      <sensor name="camera" type="wideanglecamera">
        <camera>
          <horizontal_fov>6.283</horizontal_fov>
          <image>
            <width>800</width>
            <height>848</height>
          </image>
          <clip>
            <near>0.1</near>
            <far>100</far>
          </clip>
          <lens>
            <type>custom</type>
            <custom_function>
              <c1>1.05</c1>
              <c2>4</c2>
              <f>1.0</f>
              <fun>tan</fun>
            </custom_function>
            <scale_to_hfov>true</scale_to_hfov>
            <cutoff_angle>3.1415</cutoff_angle>
            <env_texture_size>512</env_texture_size>
          </lens>
          <always_on>true</always_on>
          <update_rate>30</update_rate>
        </camera>
        <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
          <alwaysOn>true</alwaysOn>
          <updateRate>${rate}</updateRate>
          <cameraName>${sensor_name}/${topic}</cameraName>
          <imageTopicName>image_raw</imageTopicName>
          <cameraInfoTopicName>camera_info</cameraInfoTopicName>
          <frameName>${reference_frame}</frameName>
          <hackBaseline>0.07</hackBaseline>
          <distortionK1>-0.007419134024530649</distortionK1>
          <distortionK2>0.041209351271390915</distortionK2>
          <distortionK3>-0.03811917081475258</distortionK3>
          <distortionT1>0.006366158835589886</distortionT1>
          <distortionT2>0.0</distortionT2>
          <CxPrime>416.00531005859375</CxPrime>
          <Cx>16.00531005859375</Cx>
          <Cy>403.38909912109375</Cy>
        </plugin>
      </sensor>
    </gazebo>
  </xacro:macro>

  <!-- INTEL REALSENSE T265 -->
  <xacro:macro name="realsense_T265" params="sensor_name parent_link rate *origin">

    <joint name="${sensor_name}_odom_frame_joint" type="fixed">
        <parent link="${parent_link}"/>
        <child link="${sensor_name}_odom_frame"/>
        <xacro:insert_block name="origin"/>
    </joint>

    <joint name="${sensor_name}_pose_frame_joint" type="fixed">
        <parent link="${sensor_name}_odom_frame"/>
        <child link="${sensor_name}_pose_frame"/>
        <origin rpy="0 0 0" xyz="0 0 0"/> <!-- check on real hw -->
    </joint>
    <link name="${sensor_name}_odom_frame"/>

    <link name="${sensor_name}_pose_frame">
        <visual>
            <origin rpy="1.57 0 1.57" xyz="0 0 0"/>
            <geometry>
                <mesh filename="package://realsense_ros_gazebo/meshes/realsense_t265.stl" scale="0.001 0.001 0.001"/>
            </geometry>
        </visual>
        <collision>
            <geometry>
                <box size="0.013 0.108 0.024"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="0.055"/>
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <inertia ixx="9.108e-05"
                     ixy="0"
                     ixz="0"
                     iyy="2.51e-06"
                     iyz="0"
                     izz="8.931e-05"/>
        </inertial>
    </link>

    <joint name="${sensor_name}_joint" type="fixed">
        <parent link="${sensor_name}_pose_frame"/>
        <child link="${sensor_name}_link"/>
        <origin rpy="0 0 0" xyz="0 0 0"/> <!-- check on real hw -->
    </joint>
    <link name="${sensor_name}_link"/>

    <joint name="${sensor_name}_fisheye1_joint" type="fixed">
        <parent link="${sensor_name}_link"/>
        <child link="${sensor_name}_fisheye1_frame"/>
        <origin rpy="0 0 0" xyz="0 0.042 0"/>
    </joint>
    <link name="${sensor_name}_fisheye1_frame"/>

    <joint name="${sensor_name}_fisheye1_optical_joint" type="fixed">
        <parent link="${sensor_name}_fisheye1_frame"/>
        <child link="${sensor_name}_fisheye1_optical_frame"/>
        <origin rpy="0 0 0" xyz="0.01 0 0"/>
    </joint>
    <link name="${sensor_name}_fisheye1_optical_frame"/>
    <xacro:T265_fisheye
      sensor_name="${sensor_name}"
      reference_frame="${sensor_name}_fisheye1_optical_frame"
      topic="fisheye1"
      rate="${rate}">
    </xacro:T265_fisheye>

    <joint name="${sensor_name}_fisheye2_joint" type="fixed">
        <parent link="${sensor_name}_link"/>
        <child link="${sensor_name}_fisheye2_frame"/>
        <origin rpy="0 0 0" xyz="0 -0.022 0"/>
    </joint>
    <link name="${sensor_name}_fisheye2_frame"/>

    <joint name="${sensor_name}_fisheye2_optical_joint" type="fixed">
        <parent link="${sensor_name}_fisheye2_frame"/>
        <child link="${sensor_name}_fisheye2_optical_frame"/>
        <origin rpy="0 0 0" xyz="0.01 0 0"/>
    </joint>
    <link name="${sensor_name}_fisheye2_optical_frame"/>
    <xacro:T265_fisheye
      sensor_name="${sensor_name}"
      reference_frame="${sensor_name}_fisheye2_optical_frame"
      topic="fisheye2"
      rate="${rate}">
    </xacro:T265_fisheye>

    <joint name="${sensor_name}_gyro_joint" type="fixed">
        <parent link="${sensor_name}_link"/>
        <child link="${sensor_name}_gyro_frame"/>
        <origin rpy="0 0 0" xyz="0 0 0"/> <!-- check on real hw -->
    </joint>
    <link name="${sensor_name}_gyro_frame"/>

    <gazebo reference="${sensor_name}_gyro_frame">
        <gravity>true</gravity>
        <sensor name="${sensor_name}_imu" type="imu">
            <always_on>true</always_on>
            <update_rate>${rate}</update_rate>
            <visualize>false</visualize>
            <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
                <topicName>${sensor_name}/gyro/sample</topicName>
                <bodyName>${sensor_name}_pose_frame</bodyName>
                <updateRateHZ>${rate}</updateRateHZ>
                <gaussianNoise>0.000001</gaussianNoise>
                <xyzOffset>0 0 0</xyzOffset>
                <rpyOffset>0 0 0</rpyOffset>
                <frameName>${sensor_name}_link</frameName>
            </plugin>
        </sensor>
    </gazebo>

    <joint name="${sensor_name}_accel_joint" type="fixed">
        <parent link="${sensor_name}_link"/>
        <child link="${sensor_name}_accel_frame"/>
        <origin rpy="0 0 0" xyz="0 0 0"/> <!-- check on real hw -->
    </joint>
    <link name="${sensor_name}_accel_frame"/> <!-- dummy -->

    <gazebo> <!-- odometry -->
        <plugin name="p3d_base_controller" filename="libgazebo_ros_p3d.so">
            <alwaysOn>true</alwaysOn>
            <updateRate>${rate}</updateRate>
            <bodyName>${sensor_name}_odom_frame</bodyName>
            <topicName>${sensor_name}/odom/sample</topicName>
            <gaussianNoise>0.001</gaussianNoise>
            <frameName>world</frameName>
            <xyzOffsets>0 0 0</xyzOffsets>
            <rpyOffsets>0 0 0</rpyOffsets>
        </plugin>
    </gazebo>

  </xacro:macro> 

  <link name="base_footprint"/>

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

  <link name="base_link">
  </link>

  <xacro:realsense_T265 sensor_name="camera" parent_link="base_link" rate="30.0">
    <origin rpy="0 0 0" xyz="0 0 0.5"/>
  </xacro:realsense_T265> 


</robot>