写点什么

打造两轮差速机器人 fishbot:从零开始构建移动机器人

作者:芯动大师
  • 2024-12-24
    四川
  • 本文字数:2546 字

    阅读完需:约 8 分钟

打造两轮差速机器人fishbot:从零开始构建移动机器人

大家好,我是梦笔生花,我们一起来动手创建一个两轮差速的移动机器人fishbot

机器人除了雷达之外,还需要IMU加速度传感器以及可以驱动的轮子,我们曾介绍过机器人学部分,曾对两差速模型进行过介绍,所以我们还需要再创建两个差速驱动轮和一个支撑轮。

所以接下来梦笔生花将带你一起给机器人添加如下部件和关节:

  1. IMU 传感器部件与关节

  2. 左轮子部件与关节

  3. 右轮子部件与关节

  4. 支撑轮子部件与关节

1.添加 IMU 传感器

1.1 修改颜色

透明度修改只需要在base_link中添加material

<link name="base_link">    <visual>        <origin xyz="0 0 0.0" rpy="0 0 0"/>    <geometry>        <cylinder length="0.12" radius="0.10"/>    </geometry>    <material name="blue">        <color rgba="0.1 0.1 1.0 0.5" />     </material>    </visual></link>
复制代码

1.2 添加 imu

  <link name="imu_link">      <visual>      <origin xyz="0 0 0.0" rpy="0 0 0"/>      <geometry>            <box size="0.02 0.02 0.02"/>      </geometry>    </visual>  </link>
<!-- imu joint --> <joint name="imu_joint" type="fixed"> <parent link="base_link" /> <child link="imu_link" /> <origin xyz="0 0 0.02" /> </joint>
复制代码

2.添加右轮

2.1 添加关节

关节名称为right_wheel_link,我在做 ros2 小车的时候采用的轮子如下图:

轮子的宽为 4cm,直径为 6.4cm,几何形状是个圆柱体,所以geometry配置如下:

<geometry>    <cylinder length="0.04" radius="0.032"/></geometry>
复制代码

需要注意的是,圆柱默认的朝向是向上的

我们可通过originrpy改变轮子的旋转角度,让其绕x轴旋转pi/2,所以origin的配置为

<origin xyz="0 0 0" rpy="1.57079 0 0"/>
复制代码

颜色换黑色,可以得到下面的配置:

  <link name="right_wheel_link">      <visual>        <origin xyz="0 0 0" rpy="1.57079 0 0"/>        <geometry>          <cylinder length="0.04" radius="0.032"/>        </geometry>          <material name="black">            <color rgba="0.0 0.0 0.0 0.5" />           </material>      </visual>  </link>
复制代码

2.2 添加 joint

我们把左轮子的中心固定在机器人左后方

需要注意的是originaxis值的设置

先看 origin

因为 base_link 的高度是 0.12,我们

  • z 表示 child 相对 parent 的 z 轴上的关系,想将轮子固定在机器人的下表面,所以origin的 z 向下偏移 0.12/2=0.06m(向下符号为负)

  • y 表示 child 相对 parent 的 y 轴上的关系,base_link 的半径是 0.10,所以我们让轮子的 y 轴向负方向偏移 0.10m(向左符号为负)

  • x 表示 child 相对 parent 的 x 轴上的关系,向后偏移则是 x 轴向后进行偏移,我们用个差不多的值 0.02m(向后符号为负)

再看 axis

轮子是会转动的,那应该按照哪个轴转动呢?从上图可以看出是绕着 y 轴的逆时针方向,所以 axis 的设置为:

<axis xyz="0 1 0" />
复制代码


  <joint name="right_wheel_joint" type="continuous">      <parent link="base_link" />      <child link="right_wheel_link" />      <origin xyz="-0.02 -0.10 -0.06" />      <axis xyz="0 1 0" />  </joint>
复制代码

3.添加左轮

左轮就是右轮的映射,不再赘述

  <link name="left_wheel_link">      <visual>        <origin xyz="0 0 0" rpy="1.57079 0 0"/>        <geometry>          <cylinder length="0.04" radius="0.032"/>        </geometry>          <material name="black">            <color rgba="0.0 0.0 0.0 0.5" />           </material>      </visual>  </link>      <joint name="left_wheel_joint" type="continuous">      <parent link="base_link" />      <child link="left_wheel_link" />      <origin xyz="-0.02 0.10 -0.06" />      <axis xyz="0 1 0" />  </joint>
复制代码

4.添加支撑轮

支撑轮子固定在机器人的前方,用个球体,半径用0.016m,小球的直径为 0.032m 与左右轮子半径相同,然后向下偏移0.016+0.06=0.076m,向下值为负,同时把支撑论向前移动一些,选个0.06m

最终结果如下:

<link name="caster_link">    <visual>      <origin xyz="0 0 0" rpy="0 0 0"/>      <geometry>          <sphere radius="0.016"/>      </geometry>        <material name="black">          <color rgba="0.0 0.0 0.0 0.5" />         </material>    </visual>  </link>      <joint name="caster_joint" type="fixed">      <parent link="base_link" />      <child link="caster_link" />      <origin xyz="0.06 0.0 -0.076" />  </joint>
复制代码

最终 URDF 文件:https://raw.githubusercontent.com/fishros/fishbot/master/src/fishbot_description/urdf/fishbot_base.urdf

5.测试运行

5.1 编译测试

colcon buildsource install/setup.bashros2 launch fishbot_description display_rviz2.launch.py
复制代码

5.2 最终结果

rviz 的配置

最终结果

jointstate 多出两个滑动条

节点关系


5.3 通过 joint_state_gui 改变关节 tf 中关节角度

在 JointStatePublisher 中,拖动滑动条,观察


  1. rviz2tf的变换

  2. joint_states中的值的变换

可以看到随着进度条拖动,话题中的值和 rviz2 中机器人关节在同步的旋转,joint_states 话题也可以手动发送。

5.4 论如何让车轮着地

虽然显示出了机器人模型,但有一个问题不知道你发现没有,那就是在 RVIZ 中的机器人轮子是在地面之下的。

原因在于我们 fixed-frame 选择的是 base_link,base_link 的位置本来就在 left_wheel_link 和 right_wheel_link 只上,那该怎么办呢?

其实很简单,我们增加一个虚拟 link 和关节,这个关节与 base_link 相连,位置位于 base_link 向下刚好到车轮下表面的位置。

来,让我们**给 base_link 添加一个父 link-base_footprint**,新增的 URDF 代码如下:

  <!-- Robot Footprint -->  <link name="base_footprint"/>
<joint name="base_joint" type="fixed"> <parent link="base_footprint"/> <child link="base_link"/> <origin xyz="0.0 0.0 0.076" rpy="0 0 0"/> </joint>
复制代码

因为是虚拟关节,我们不用对这个 link 的形状进行描述,joint 的 origin 设置为xyz="0.0 0.0 0.076"表示关节 base_footprint 向上 0.076 就是 base_link(觉得不好理解可以看下图)。

保存编译再次运行测试,此时车轮就在地面只上啦~


发布于: 刚刚阅读数: 6
用户头像

芯动大师

关注

凡事预则立,不预则废! 2022-06-01 加入

某公司芯片AE工程师,嵌入式开发工程师,InfoQ签约作者,阿里云专家博主,华为云·云享专家,51CTO专家博主,腾讯云社区优秀共创官。

评论

发布
暂无评论
打造两轮差速机器人fishbot:从零开始构建移动机器人_ROS_芯动大师_InfoQ写作社区