ROS之Gazebo

Posted Montauk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS之Gazebo相关的知识,希望对你有一定的参考价值。

<?xml version="1.0"?>
<launch>

  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="true"/>
  <arg name="use_sim_time" default="false"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>

  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
   <include file="$(find gazebo_ros)/launch/empty_world.launch"> 
    <arg name="world_name" value="$(find carModel)/worlds/robot.world"/>
    <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>

  <!-- Load the URDF into the ROS Parameter Server -->
  <arg name="model" />
  <param name="robot_description" command="$(find xacro)/xacro.py $(find carModel)/urdf/robot1_base_02.xacro" />

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model robot1 -param robot_description -z 0.05"/> 

</launch>

 首先是把ros自带的gazebo_ros包的启动文件加载进来, 并启动里面的节点

   <include file="$(find gazebo_ros)/launch/empty_world.launch"> 

 然后解码xacro

<param name="robot_description" command="$(find xacro)/xacro.py $(find carModel)/urdf/robot1_base_02.xacro" />

 然后启动一个urdf转换节点:

<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model robot1 -param robot_description -z 0.05"/> 

 

再看看这个xacro里面都是啥:

<?xml version="1.0"?>

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" 
 	xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
    	xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
    	xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
	name="robot1_xacro">


	<xacro:property name="length_wheel" value="0.05" />
	<xacro:property name="radius_wheel" value="0.05" />
	<xacro:macro name="default_inertial" params="mass">
               <inertial>
                       <mass value="${mass}" />
                       <inertia ixx="1.0" ixy="0.0" ixz="0.0"
                                iyy="1.0" iyz="0.0"
                                izz="1.0" />
               </inertial>
	</xacro:macro>
	<xacro:include filename="$(find carModel)/urdf/robot.gazebo" />
	<link name="base_footprint">
   		<visual>
			<geometry>
      				<box size="0.001 0.001 0.001"/>
     			</geometry>
			<origin rpy="0 0 0" xyz="0 0 0"/>
   		</visual>
		<xacro:default_inertial mass="0.0001"/>
 	</link>

	<gazebo reference="base_footprint">
		<material>Gazebo/Green</material>
		<turnGravityOff>false</turnGravityOff>
	</gazebo>

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


	<link name="base_link">
   		<visual>
			<geometry>
      				<box size="0.2 .3 .1"/>
     			</geometry>
			<origin rpy="0 0 1.54" xyz="0 0 0.05"/>
			<material name="darkblue">
        			<color rgba=".1 .1 .5 1"/>
      			</material>
   		</visual>
		<collision>
			<geometry>
       				<box size="0.2 .3 0.1"/>
			</geometry>
		</collision>
		<xacro:default_inertial mass="10"/>
 	</link>

 	<link name="wheel_1">
   		<visual>
     			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
     			</geometry>
			<!-- <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/> -->
			<origin rpy="0 0 0" xyz="0 0 0"/>
   			<material name="black">
				<color rgba="0 0 0 1"/>
			</material>
		</visual>
		<collision>
			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
			</geometry>
		</collision>
		<xacro:default_inertial mass="1"/>
 	</link>

 	<link name="wheel_2">
   		<visual>
     			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
     			</geometry>
			<!-- <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/> -->
			<origin rpy="0 0 0" xyz="0 0 0"/>
   			<material name="black"/>
   		</visual>
		<collision>
			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
			</geometry>
		</collision>
		<xacro:default_inertial mass="1"/>

 	</link>
    
 	<link name="wheel_3">
   		<visual>
     			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
     			</geometry>
			<!-- <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/> -->

			<origin rpy="0 0 0" xyz="0 0 0"/>
   			<material name="black"/>
   		</visual>
		<collision>
			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
			</geometry>
		</collision>
		<xacro:default_inertial mass="1"/>
 	</link>

 	<link name="wheel_4">
   		<visual>
     			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
     			</geometry>
		<!--	<origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/> -->
			<origin rpy="0 0 0" xyz="0 0 0" />
   			<material name="black"/>
   		</visual>
		<collision>
			<geometry>
       				<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
			</geometry>
		</collision>
		<xacro:default_inertial mass="1"/>

 	</link>



 <joint name="base_to_wheel1" type="continuous">
   <parent link="base_link"/>
   <child link="wheel_1"/>
   <origin rpy="1.5707 0 0" xyz="0.1 0.15 0"/>
   <axis xyz="0 0 1" />
 </joint>

 <joint name="base_to_wheel2" type="continuous">
   <axis xyz="0 0 1" />
   <anchor xyz="0 0 0" />
   <limit effort="100" velocity="100" />
   <parent link="base_link"/>
   <child link="wheel_2"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 0.15 0"/>
</joint>

 <joint name="base_to_wheel3" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_3"/>
   <origin rpy="1.5707 0 0" xyz="0.1 -0.15 0"/>
 </joint>

 <joint name="base_to_wheel4" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_4"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 -0.15 0"/>

 </joint>

 分别定义了若干link, 关节.

运行下面的命令:

roslaunch carModel gazebo.launch 

 

为啥有个轮子是绿色的呢?

	<xacro:include filename="$(find carModel)/urdf/robot.gazebo" />

 这个gazebo文件里面是轮子的贴图:

 

<?xml version="1.0"?>
<robot>
  <!-- materials -->
  <gazebo reference="base_link">
    <material>Gazebo/Orange</material>
  </gazebo>

 <gazebo reference="wheel_1">
        <material>Gazebo/Green</material>
 </gazebo>

 <gazebo reference="wheel_2">
        <material>Gazebo/Black</material>
 </gazebo>

 <gazebo reference="wheel_3">
        <material>Gazebo/Black</material>
 </gazebo>

 <gazebo reference="wheel_4">
        <material>Gazebo/Black</material>
 </gazebo>


  <!-- ros_control plugin -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/robot</robotNamespace>
	
    </plugin>
  </gazebo>

  <!-- Link1 -->
  <gazebo reference="link1">
    <material>Gazebo/Orange</material>
  </gazebo>

  <!-- Link2 -->
  <gazebo reference="link2">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Black</material>
  </gazebo>

  <!-- Link3 -->
  <gazebo reference="link3">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Orange</material>
  </gazebo>

  <!-- camera_link -->
  <gazebo reference="camera_link">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Red</material>
  </gazebo>

  <!-- hokuyo -->
  <gazebo reference="hokuyo_link">
    <sensor type="ray" name="head_hokuyo_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>false</visualize>
      <update_rate>40</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>720</samples>
            <resolution>1</resolution>
            <min_angle>-1.570796</min_angle>
            <max_angle>1.570796</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <!-- Noise parameters based on published spec for Hokuyo laser
               achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
               stddev of 0.01m will put 99.7% of samples within 0.03m of the true
               reading. -->
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
        <topicName>/robot/laser/scan</topicName>
        <frameName>hokuyo_link</frameName>
      </plugin>
    </sensor>
  </gazebo>

  <!-- camera -->
  <gazebo reference="camera_link">
    <sensor type="camera" name="camera1">
      <update_rate>30.0</update_rate>
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>800</width>
          <height>800</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <!-- Noise is sampled independently per pixel on each frame.  
               That pixel\'s noise value is added to each of its color
               channels, which at that point lie in the range [0,1]. -->
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>robot/camera1</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera_link</frameName>
        <hackBaseline>0.07</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor>
  </gazebo>  


</robot>

 

以上是关于ROS之Gazebo的主要内容,如果未能解决你的问题,请参考以下文章

ROS仿真笔记之——gazebo配置velodyne

ROS之Gazebo

ROS学习笔记之——gazebo仿真

ROS仿真笔记之——基于gazebo的多机器人探索环境仿真

ROS实验笔记之——EVO

ROS和Gazebo进行机器人仿真