1.传感器加入自己的模型中需要那些步骤
1.节点说明,链接关系
<robot name=“test”>
<link name="link1"/>
<link name="link2"/>
<joint name="joint1" type="continuous">
<parent link="link1"/>
<children link="link2"/>
<origin xyz=".1 .1 .1" rpy="0 0 0">
</joint>
</robot>
2.节点描述
节点描述要描述这个东西的物理属性(长宽高、颜色、惯性),以及特有属性
<?xml version="1.0"?>
<robot name="test_robot">
<link name="link1">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2" />
</geometry>
</visual>
</link>
<link name="link2">
<visual>
<geometry>
<box size="0.6 0.2 .1" />
</geometry>
</visual>
</link>
<版本>
<robot name="test">
<link name="link1"> 下面是属性配置
<visual>
<geometry>
<....../>
</geometry>
</visual>
</link>
3. link指节点,joint指关节
2.加入传感器
在胡春旭的教程中,将单线激光雷达加入到仿真环境中。我要在这个基础上加入另外的传感器,IMU、camera、gps。
mbot_laser_nav_gazebo.launch-->mbot_with_laser_gazebo.xacro-->lidar_gazebo.xacro
1.mbot_gazebo里面mbot_laser_nav_gazebo.launch文件中,加载了仿真环境、机器人模型、发布机器人关节状态、tf变换
<launch>
<!-- 设置launch文件的参数 -->
<arg name="world_name" value="$(find mbot_gazebo)/worlds/cloister.world"/>
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- 运行gazebo仿真环境 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_name)" />
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- 加载机器人模型描述参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_laser_gazebo.xacro'" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" >
<param name="publish_frequency" type="double" value="50.0" />
</node>
<!-- 在gazebo中加载机器人模型-->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model mbot -param robot_description"/>
</launch>
2.机器人模型就是要改动的文件 xacro文件
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_laser_gazebo.xacro'" />
在这模型里,描述了link的关系(joint字段),并加载传感器模型
<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!--包含其他xacro文件,该文件将被拓展-->
<xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro" />
<!--属性是可以插入到XML文档中的任何位置的值。 属性块是XML的名称片段,可以插入允许XML的任何位置-->
<xacro:property name="lidar_offset_x" value="0" />
<xacro:property name="lidar_offset_y" value="0" />
<xacro:property name="lidar_offset_z" value="0.3" />
<!-- lidar -->
<joint name="lidar_joint" type="fixed"> 链接点、链接关系
<origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" />
<parent link="base_link"/>
<child link="laser_link"/>
</joint>
<xacro:include filename="$(find mbot_description)/urdf/xacro/sensors/lidar_gazebo.xacro" /> 加载lidar的描述文件
<xacro:rplidar prefix="laser"/>
<mbot_base_gazebo/>
</robot>
3.传感器的描述文件
包含xml 版本,link name 说明,以及link name 属性
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser">
<xacro:macro name="rplidar" params="prefix:=laser">
<!-- Create laser reference frame -->
<link name="${prefix}_link">
<inertial>
<mass value="0.1" />
<origin xyz="0 0 0" />
<inertia ixx="0.01" ixy="0.0" ixz="0.0"
iyy="0.01" iyz="0.0"
izz="0.01" />
</inertial>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="black"/>
</visual>
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<cylinder length="0.06" radius="0.05"/>
</geometry>
</collision>
</link>
<gazebo reference="${prefix}_link">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="${prefix}_link">
<sensor type="ray" name="rplidar">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>5.5</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
<min_angle>-3</min_angle>
<max_angle>3</max_angle>
</horizontal>
</scan>
<range>
<min>0.5</min>
<max>8.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
</sensor>
</gazebo>
</xacro:macro>
</robot>
gazebo标签的reference属性就是让gazebo知道随后的代码是依附于谁的,这个reference的内容可以是一个link,也可以是一个joint。特别强调的是,plugin标签一定是要作为sensor标签的一部分,在sensor标签内部出现,否则是不起作用的!!
可以看出除了物理属性之外,还有一些传感器的特有属性,在gazebo标签的reference属性,要加载plugin:
<plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
3.加载IMU 传感器
了解了前面的加载过程,我们可以将自己需要的传感器加载进去。
1.mbot_with_laser_gazebo.xacro 包含imu的描述文件,添加:
<!--包含其他xacro文件,该文件将被拓展-->
<!--<xacro:include filename="$(find mbot_description)/urdf/xacro/sensors/velodyne_gazebo.xacro" />-->
<xacro:include filename="$(find mbot_description)/urdf/xacro/sensors/imu_gazebo.xacro" />
<!--属性是可以插入到XML文档中的任何位置的值。 属性块是XML的名称片段,可以插入允许XML的任何位置-->
<xacro:property name="imu_offset_x" value="0" />
<xacro:property name="imu_offset_y" value="0" />
<xacro:property name="imu_offset_z" value="0.6" />
<!-- imu -->
<joint name="imu_joint" type="fixed">
<origin xyz="${imu_offset_x} ${imu_offset_y} ${imu_offset_z}" rpy="0 0 0" />
<parent link="base_link"/>
<child link="imu_link"/>
</joint>
<!--这句话是什么作用-->
<xacro:imu prefix="imu"/>
2. 给出的demo,只有加载插件的那一部分,我们需要将这个个文件完善,对物理属性进行描述,设置传感器的话题名称,更新速率,噪声等参数
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="imu">
<xacro:property name="imu_size" value="0.1" />
<xacro:property name="imu_hight" value="0.1" />
<xacro:macro name="imu" params="prefix:=imu">
<link name="imu_link"> 节点的名字
<visual>
<origin rpy="0 0 0" xyz="0 0 0" />
<geometry>
<box size="${imu_size} ${imu_size} ${imu_size}"/>
</geometry>
<material name="red"/>
</visual>
<collision>
<!--<box size="${imu_size} ${imu_size} ${imu_size}"/>-->
</collision>
<xacro:default_inertial mass="0.05"/>
</link>
<gazebo reference="${prefix}_link"> 节点的名字
<gravity>true</gravity>
<sensor name="imu_sensor" type="imu">
<always_on>true</always_on>
<update_rate>100</update_rate>
<visualize>true</visualize>
<topic>__default_topic__</topic>
<plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"> 加载的文件 可以使用locate ibgazebo_ros_imu_sensor.so定位该文件位置
<topicName>imu</topicName> 发布的话题
<bodyName>imu_link</bodyName>
<updateRateHZ>100.0</updateRateHZ> 更新sulv
<gaussianNoise>0.0</gaussianNoise> 加入噪声
<xyzOffset>0 0 0</xyzOffset>
<rpyOffset>0 0 0</rpyOffset>
<frameName>imu_link</frameName>
</plugin>
<pose>0 0 0 0 0 0</pose>
</sensor>
</gazebo>
</xacro:macro>
</robot>
4.问题
<xacro:rplidar prefix="laser"/>
<mbot_base_gazebo/>
这两句代码的意思
怎么查看传感器有那些参数设置 ,给出个官网地址http://gazebosim.org/tutorials?tut=ros_gzplugins
工作空间为mytest1 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch