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

前言

  本文用通俗的语言来讲述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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容