gazebo下搭建键盘控制四轮小车(完整流程)

2019-08-21  本文已影响0人  SuperShark

前言

  本文用通俗的语言来讲述gazebo构建自己的小车并键盘控制以及通过直接发布信息的方式来实现功能,而且不会过重强调格式以及语言,请谅解~同时大腿!!!附上小火箭链接https://zhangcaocao.github.io以及https://www.jianshu.com/u/8416ac9040d9
  相信小伙伴们已经看过了相关的教程以及参考了很多的教程,如果没有,那也不要紧,我们来跟着做一次,不就什么都OK了?非特殊情况下,最主要还是我们要自己掌握,不可能说找个教程能过就行,对吧。

一、创建工作空间

  打开终端,创建一个初始路径mycar/ (这里根据自己的意愿来,可以建立一个自己的工作空间,但是这样的话需要的所有东西都得我们重新添加,也可以就用官网或者其他路径下载的空间) , 里面需要包含src文件夹。注意的是 catkin_make 必须在工作空间这个路径上执行,也就是此处的/mycar下;后面接上的刷新工作环境是必须要有的,如果创建后没有刷新会报找不到路径的错误,还有另一种方法: rospack profile

  mkdir -p ~/mycar/src           //-p的作用自己查一下,这个应该是都会的
  cd ~/mycar/    
//  catkin_init_workspace        初始化命令
  catkin_make                    //编译工作空间
  source devel/setup.bash        //刷新工作环境,或者

  如果不想每次都source,那么就 vi ~/.bashrc 或者 gedit ~/.bashrc在系统的环境变量里加上自己所要用的工作空间路径(直接翻到最后面),这儿就是source ~/mycar/devel/setup.bash,那么如何查看自己是否添加了环境变量呢,echo $ROS_PACKAGE_PATH就可以打印出当前ROS所拥有的工作空间环境变量,如下所示则为成功

source打印环境

二、Gazebo小车模型构建

  其实网上的很多资源都有gazebo仿真,更多的是通过Rviz,两者的区别自行查阅行吧,只是就我目前所学习的方面,某人说Rviz有些时候会出现tf显示不出来的bug,所以这里选用在gazebo上进行仿真。步骤主要分为三步:

1、 创建小车模型文件

  个人认为可以先通过urdf文件的写法来了解机器人模型的描述语言,而xacro格式相当于就是urdf的2.0版本(这只是个说法哈,不要深究),所包含的操作都是比urdf更为快捷的。在涉及计算或者数据比较多的时候,xacro的优势体现在可以通过宏定义以及数学运算、文件内嵌等等方式进行表达,而比较简单的结构反而用urdf比较直观,当然这只是个人的看法哈,我也会把本次的两种模型结构都附在后面 ^ 0 ^。
  (1)首先我们需要先在src目录下创建一个硬件描述包mycar_description,创建包的命令如下:

$  catkin_create_pkg mycar_descriptionm roscpp rospy std_msgs urdf
<!--随后可以查看src目录下多了这个功能包并且里面包含package.xml和CMakeLists.txt文件-->

这里需要了解catkin_create_pkg 与 roscreate 的区别,两者格式都是后接 包名 + 依赖(依赖可多个),比如这里的roscpp rospy std_msgs就是最常用的三个依赖,前两个cpp py 懂吧,std_msgs代表标准ROS消息,包括表示原始数据类型的常见消息类型和其他基本消息结构,详情请看http://wiki.ros.org/std_msgs/。后者算是比较老版本的创建方式,生成的不是package.xml 文件,而是manifest.xml,因此最好还是用前者;其次如何查看功能包是否成功创建了呢,可以用 rospack find 包名来打印包的路径。
  (2)link和joint什么什么其他的自己去找官网教程什么还是什么都可以,我提供的是流程,不是讲解请见谅啦!在mycar_description下面创建urdf文件夹用于存放urdf文件以及xacro文件,描述代码如下:
.urdf

<?xml version="1.0"?>  
<robot name="smartcar">  

  <link name="base_link">  
    <visual>  
      <geometry>  
        <!-- <box size="0.25 .16 .05"/>   -->
        <box size=".3 .2 .1"/>
    </geometry>  
    <origin rpy="0 0 1.57075" xyz="0 0 .05"/>  
    <material name="blue">  
        <color rgba="0 0 .8 1"/>  
    </material>  
    </visual>  
  </link>  

  <link name="right_front_wheel">  
      <visual>  
        <geometry>  
          <cylinder length=".05" radius="0.05"/>  
        </geometry>  
        <material name="black">  
          <color rgba="0 0 0 1"/>  
        </material>  
      </visual>  
  </link>  

  <joint name="right_front_wheel_joint" type="continuous">  
    <axis xyz="0 0 1"/>  
    <parent link="base_link"/>  
    <child link="right_front_wheel"/>  
    <origin rpy="0 1.57075 0" xyz="0.15 0.1 0"/>  
    <limit effort="100" velocity="100"/>  
    <joint_properties damping="0.0" friction="0.0"/>  
  </joint>  

  <link name="right_back_wheel">  
    <visual>  
      <geometry>  
        <cylinder length=".05" radius="0.05"/>  
      </geometry>  
      <material name="black">  
        <color rgba="0 0 0 1"/> 
      </material>  
    </visual>  
  </link>  

  <joint name="right_back_wheel_joint" type="continuous">  
    <axis xyz="0 0 1"/>  
    <parent link="base_link"/>  
    <child link="right_back_wheel"/>  
    <origin rpy="0 1.57075 0" xyz="0.15 -0.1 0"/>  
    <limit effort="100" velocity="100"/>  
    <joint_properties damping="0.0" friction="0.0"/>  
  </joint> 
 
  <link name="left_front_wheel">  
    <visual>  
      <geometry>  
        <cylinder length=".05" radius="0.05"/>  
      </geometry>  
      <material name="black">  
        <color rgba="0 0 0 1"/>  
      </material>  
    </visual>  
  </link> 

  <joint name="left_front_wheel_joint" type="continuous">  
    <axis xyz="0 0 1"/>  
    <parent link="base_link"/>  
    <child link="left_front_wheel"/>  
    <origin rpy="0 1.57075 0" xyz="-0.15 0.1 0"/>  
    <limit effort="100" velocity="100"/>  
    <joint_properties damping="0.0" friction="0.0"/>  
  </joint>  

  <link name="left_back_wheel">  
    <visual>  
      <geometry>  
        <cylinder length=".05" radius="0.05"/>  
      </geometry>  
      <material name="black">  
        <color rgba="0 0 0 1"/>  
      </material>  
    </visual>  
  </link>  

  <joint name="left_back_wheel_joint" type="continuous">  
    <axis xyz="0 0 1"/>  
    <parent link="base_link"/>  
    <child link="left_back_wheel"/>  
    <origin rpy="0 1.57075 0" xyz="-0.15 -0.1 0"/>  
    <limit effort="100" velocity="100"/>  
    <joint_properties damping="0.0" friction="0.0"/>  
  </joint>  
</robot>

.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>

    <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>
    <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.57075" xyz="0 0 0.05"/>
            <material name="white">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                    <box size="0.2 .3 0.1"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="10"/>
    </link>

    <link name="left_front_wheel">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <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="left_back_wheel">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <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="right_front_wheel">
        <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="right_back_wheel">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <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_left_front_wheel" 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_left_back_wheel" 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_right_front_wheel" 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_right_back_wheel" 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>
</robot>

2、 加载驱动控制插件

   (1)加载连接器控制驱动插件

<gazebo>
  <plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
    <updateRate>50.0</updateRate>
    <robotNamespace></robotNamespace>
    <leftFrontJoint>base_to_left_front_wheel</leftFrontJoint>
    <leftRearJoint>base_to_left_back_wheel</leftRearJoint>
    <rightFrontJoint>base_to_right_front_wheel</rightFrontJoint>
    <rightRearJoint>base_to_right_back_wheel</rightRearJoint>
    <wheelSeparation>4</wheelSeparation>
    <wheelDiameter>0.1</wheelDiameter>
    <commandTopic>cmd_vel</commandTopic>
    <odometryTopic>odom</odometryTopic>
    <robotBaseFrame>base_footprint</robotBaseFrame>
    <odometryFrame>odom</odometryFrame>
    <torque>1</torque>
    <topicName>cmd_vel</topicName>
    <broadcastTF>1</broadcastTF>
  </plugin>
</gazebo>

    (2)加载ROS控制插件

<gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/robot</robotNamespace>
      <legacyModeNS>true</legacyModeNS>
    </plugin>
  </gazebo>

这两个是加在link和joint属性之后的,主要是不要加到</robot>后面就行。

3、 编辑launch文件

二、运行launch文件

<?xml version="1.0"?>
<launch>
 <include file="$(find gazebo_ros)/launch/empty_world.launch">
  </include>
  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description"
         command="$(find xacro)/xacro.py '$(find mycar_description)/urdf/mycar.xacro'" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />

  <!-- 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>

参考地址::https://www.ncnynl.com/archives/201609/842.html
       https://blog.csdn.net/ktigerhero3/article/details/65443920

上一篇下一篇

猜你喜欢

热点阅读