在这里我们将用到第二章安装的ROS,以及机器人仿真软件Gazebo来打造自己的机器人小狗,在这里先给出效果图~~比较先看到结果比较能提起读者兴趣~~ 至于如果有读者想做真正的机器人可以自行百度"ROS 制作 机器人"等关键词。不过实体机器人说白了还是那堆东西(几根铁加电机),比较花功夫的在写嵌入式那边,如果读者碰巧是大一二学生,或者有大把大把的时间(零基础的话半年到一年)不妨试着自己做一个实体机器人,会有很大收益哦。

第三四章的代码在这里 https://github.com/himlen1990/mytoy.git

这就是我们将要做的小狗机器人~~~是不是看起来很像一张椅子(笑),但是它可以动喔。

是不是已经迫不及待了呢?不用急,下面的步骤会让你崩溃的~~

-------------------------------------------------------分界线-----------------------------------------------------------------------------

首先我们需要创建一个ros package (在这里默认你已经看完第二章,知道如何去创建一个ROS包)

为了方便管理,我们创建一个urdf文件夹 (urdf是用来描述机器人的文件) ros的教程在这里:http://wiki.ros.org/urdf/Tutorials

在文件夹下面创建一个xxx.urdf文件 xxx是任意名字,比如说toydog.urdf

首先我们制造一个长方形

<?xml version="1.0"?>
<robot name="toydog">
 
<material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>
 
  <link name = "base_link">
   <visual>
    <geometry>
     <box size="0.6 0.3 0.1" />
    </geometry>
 
     <material name = "blue"/>
     <origin rpy="0 0 0" xyz="0 0 0.5"/>
    </visual>
   </link>
</robot>

在这里:robot name是我们的机器人名字,material是我们定义颜色的地方,可以看到我们定义了蓝色黑色和白色。

接下来要做一个base_link,base_link可以看作是机器人的原点,或者说是树根节点,整个机器人关节间的关系可以用一个树状图表示,如下图:

在这里Link1就是相当于那个根节点,这样做是为了方便我们之后的动力学计算。到此我们可以运行下面命令看一下效果

roslaunch urdf_tutorial display.launch model:=你的路径/urdf/xxx.urdf

比如说在我电脑下的话那就是roslaunch urdf_tutorial display.launch model:=/home/himlen/mytoy_ros/src/mytoy/urdf/toydog1.urdf

如无意外我们会看到一个长方形

接下来我们把腿加上

<!--first leg-->
  <link name = "fore_leg_right">
   <visual>
     <material name = "white"/>
     <origin rpy="0 0 0" xyz="0 0 -0.15"/>
    <geometry>
     <box size="0.1 0.1 0.3" />
    </geometry>
    </visual>
   </link>
 
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="fore_leg_right"/>
    <origin xyz="0.2 0.2 0.5"/>
    <axis xyz="0 1 0"/>
    <limit lower="-1.57" upper="1.57" effort="0.5293" velocity="6.159937255" />
  </joint>
  <link name = "fore_leg_right2">
   <visual>
    <geometry>
     <box size="0.15 0.1 0.1" />
    </geometry>
     <material name = "white"/>
     <origin rpy="0 0 0" xyz="0.05 0 -0.05"/>
    </visual>
   </link>
 
  <joint name="joint2" type="revolute">
    <parent link="fore_leg_right"/>
    <child link="fore_leg_right2"/>
    <origin xyz="0 0 -0.3"/>
    <axis xyz="0 1 0"/>
    <limit lower="-0.3" upper="1.57" effort="0.5293" velocity="6.159937255" />
  </joint>

咋一看很长,但实际上大部分内容是重复的。只需要粘贴复制就可以了,需要定义的地方是link的位置,还有joint的位置和转动轴,还有一些限制。对于没学过机械的同学在这里简单科普一下,link,顾名思义就是连杆,说白了就是一根硬的东西,或者叫做刚体,而joint是可以转动的,一般用电机驱动。因此我们的joint会连接两个link,在这底下还有一个axis属性,这个属性定义了joint绕哪个轴旋转,limit定义的是可以转的最大角度,还有扭矩和角速度等。 

需要注意的是每个link和joint必须定一个独有的名字,如果名字重复的话会报错

完整的描述文件(加上baselink的)如下:

<?xml version="1.0"?>
<robot name="toydog">
 
<material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>
 
 
 
  <link name = "base_link">
   <visual>
    <geometry>
     <box size="0.6 0.3 0.1" />
    </geometry>
 
     <material name = "blue"/>
     <origin rpy="0 0 0" xyz="0 0 0.5"/>
    </visual>
   </link>
 
<!--first leg-->
  <link name = "fore_leg_right">
   <visual>
     <material name = "white"/>
     <origin rpy="0 0 0" xyz="0 0 -0.15"/>
    <geometry>
     <box size="0.1 0.1 0.3" />
    </geometry>
    </visual>
   </link>
 
 
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="fore_leg_right"/>
    <origin xyz="0.2 0.2 0.5"/>
    <axis xyz="0 1 0"/>
    <limit lower="-1.57" upper="1.57" effort="0.5293" velocity="6.159937255" />
  </joint>
 
  <link name = "fore_leg_right2">
   <visual>
    <geometry>
     <box size="0.15 0.1 0.1" />
    </geometry>
     <material name = "white"/>
     <origin rpy="0 0 0" xyz="0.05 0 -0.05"/>
    </visual>
   </link>
 
  <joint name="joint2" type="revolute">
    <parent link="fore_leg_right"/>
    <child link="fore_leg_right2"/>
    <origin xyz="0 0 -0.3"/>
    <axis xyz="0 1 0"/>
    <limit lower="-0.3" upper="1.57" effort="0.5293" velocity="6.159937255" />
  </joint>
 
 </robot>

运行一下,如无意外的话应该是这样子的:

接下来的工作就是简单重复劳动了,我们只需要在对称的位置上继续定义其他腿就OK了。

 

为了能让这个模型在gazebo上面运行,我们还需要加上其他属性,但基本都是粘贴复制的东西

比如说为每个link加上collision和inertial属性

每个joint加上transmission属性(加上以后才能控制这些关节转动)

在最后我们还需要加上gazebo 的plugin

 

完整的文件可以在我的github里面找到:

https://github.com/himlen1990/mytoy/tree/master/urdf/toydog.urdf

想在gazebo上面看效果的话可以把我github上面的文件拷贝下来编译以后执行

roslaunch mytoy test_urdf.launch

应该就能看到第一个图的效果了