完整代碼:
<?xml version="1.0"?>
<robot name="laser" xmlns:xacro="http://ros.org/wiki/xacro">
<!-- Hokuyo Laser scanner -->
<xacro:property name="hokuyo_size" value="0.05" />
<xacro:property name="base_height" value="0.02" />
<xacro:property name="base_radius" value="0.25" />
<xacro:macro name="laser" params="parent">
<link name="base_laser">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="${hokuyo_size} ${hokuyo_size} ${hokuyo_size}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<!--<box size="${hokuyo_size} ${hokuyo_size} ${hokuyo_size}"/>-->
<!--<mesh filename="model://hokuyo/meshes/hokuyo.dae"/>-->
<mesh filename="package://mybot_description/mesh/hokuyo.dae"/>
</geometry>
<!--<material name="Blue" />-->
</visual>
</link>
<joint name="hokuyo_joint" type="fixed">
<origin xyz="${base_radius - hokuyo_size/2} 0 ${base_height+hokuyo_size/2}" rpy="0 0 0" />
<parent link="${parent}"/>
<child link="base_laser" />
</joint>
<gazebo reference="base_laser">
<material>Gazebo/Blue</material>
<turnGravityOff>false</turnGravityOff>
<sensor type="gpu_ray" name="head_hokuyo_sensor">
<pose>${hokuyo_size/2} 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>50</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-2.3550796</min_angle>
<max_angle>2.3550796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>10.0</max>
<resolution>0.001</resolution>
</range>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
<topicName>/scan</topicName>
<frameName>base_laser</frameName>
</plugin>
</sensor>
</gazebo>
</xacro:macro>
</robot>
分析:
激光的尺寸屬性和base_link的參數
<xacro:property name="hokuyo_size" value="0.05" />
<xacro:property name="base_height" value="0.02" />
<xacro:property name="base_radius" value="0.25" />
宏:名稱爲laser,參數parent(關節的parent屬性)
<xacro:macro name="laser" params="parent">
包含三個部分:link、joint、gazebo:
link包含了顯示和碰撞屬性,顯示用了mesh
<link name="base_laser">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="${hokuyo_size} ${hokuyo_size} ${hokuyo_size}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<!--<box size="${hokuyo_size} ${hokuyo_size} ${hokuyo_size}"/>-->
<!--<mesh filename="model://hokuyo/meshes/hokuyo.dae"/>-->
<mesh filename="package://mybot_description/mesh/hokuyo.dae"/>
</geometry>
<!--<material name="Blue" />-->
</visual>
</link>
gazebo:
reference表示該gazebo屬性是base_laser這個link的
material是在gazebo中顯示的材質
sensor標籤聲明傳感器屬性:type類型爲gpu_ray(可以探測沒有碰撞屬性的物體,如actor)
- visualize:是否顯示傳感器數據
- update_rate:更新頻率
- ray:激光數據的參數配置
- plugin:配合sensor類型gpu_ray使用libgazebo_ros_gpu_laser.so;如果是ray類型則用libgazebo_ros_laser.so
<gazebo reference="base_laser">
<material>Gazebo/Blue</material>
<turnGravityOff>false</turnGravityOff>
<sensor type="gpu_ray" name="head_hokuyo_sensor">
<pose>${hokuyo_size/2} 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>50</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-2.3550796</min_angle>
<max_angle>2.3550796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>10.0</max>
<resolution>0.001</resolution>
</range>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
<topicName>/scan</topicName>
<frameName>base_laser</frameName>
</plugin>
</sensor>
</gazebo>
效果: