• 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>
    
  • 相关阅读:
    Spring Cloud Bus 消息总线介绍
    工商银行分布式服务 C10K 场景解决方案
    关于写好文章的3个心法和5点技巧
    混合云K8s容器化应用弹性伸缩实战
    云原生下的灰度体系建设
    被解救的代码
    【2020-10-22】我是否一个真正靠谱的人
    【2020-10-21】以谦虚与忍耐去期待豁然与贯通
    【2020-10-20】压力也是一种感受,用心体会
    【2020-10-19】不断试错的过程
  • 原文地址:https://www.cnblogs.com/Montauk/p/6912176.html
Copyright © 2020-2023  润新知