官方教程
包含其他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>