当前位置:网站首页>《ROS2机器人建模URDF》8.3动手创建一个移动机器人
《ROS2机器人建模URDF》8.3动手创建一个移动机器人
2022-04-21 20:36:00 【鱼香ROS】
本系列教程作者:小鱼
公众号:鱼香ROS
QQ交流群:139707339
教学视频地址:小鱼的B站
完整文档地址:鱼香ROS官网
版权声明:如非允许禁止转载与商业用途。
8.3 动手创建一个移动机器人
大家好,我是小鱼,本节课我们来一起动手创建一个两轮差速的移动机器人fishbot,在上一节的时候我们已经给我们的机器人安装上了雷达,本节课我们接着上节课的来继续完善我们的机器人模型。
机器人除了雷达之外,还需要IMU加速度传感器以及可以驱动的轮子,在第七章中我们曾介绍过机器人学部分,曾对两差速模型进行过介绍,所以我们还需要再创建两个差速驱动轮和一个支撑轮。
所以本节小鱼带你一起给机器人添加如下部件和关节:
- IMU传感器部件与关节
- 左轮子部件与关节
- 右轮子部件与关节
- 支撑轮子部件与关节

1.添加IMU传感器(上节作业)
IMU传感器和透明度与颜色修改是上节课,作业,小鱼先带你一起完成一下
练习1:尝试将修改机器人身体颜色为蓝色,透明度为50%
(0.1 0.1 1.0 0.5)练习2:尝试在URDF中添加imu_link并使用imu_joint将其固定在车体的中心上方2cm,imu采用的几何形状为box,长宽高各是2cm
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>
需要注意的是,圆柱默认的朝向是向上的

我们可通过origin的rpy改变轮子的旋转角度,让其绕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
我们把左轮子的中心固定在机器人左后方
需要注意的是origin和axis值的设置
先看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 build
source install/setup.bash
ros2 launch fishbot_description display_rviz2.launch.py
5.2 最终结果
rviz的配置

最终结果

jointstate多出两个滑动条

节点关系

打印joint_states话题
ros2 topic echo /joint_states

5.3 通过joint_state_gui改变关节tf中关节角度
在JointStatePublisher中,拖动滑动条,观察
rviz2中tf的变换joint_states中的值的变换

可以看到随着进度条拖动,话题中的值和rviz2中机器人关节在同步的旋转,joint_states话题也可以手动发送,下一节课小鱼带你一起通过手动发送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(觉得不好理解可以看下图)。
保存编译再次运行测试,此时车轮就在地面只上啦~

技术交流&&问题求助:
-
微信公众号及交流群:鱼香ROS
-
小鱼微信:AiIotRobot
-
QQ交流群:139707339
-
版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划
作者介绍:
我是小鱼,机器人领域资深玩家,现深圳某独脚兽机器人算法工程师一枚
初中学习编程,高中开始接触机器人,大学期间打机器人相关比赛实现月入2W+(比赛奖金)
目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小鱼,一起交流技术,学习机器人
版权声明
本文为[鱼香ROS]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_27865227/article/details/124297682
边栏推荐
- 如何用Sonic云真机打王者
- Circular linked list of single and double linked lists (XV)
- 【高并发】不得不说的线程池与ThreadPoolExecutor类浅析
- 动态规划小结
- leetcode - 329. 矩阵中的最长递增路径
- < 2021SC@SDUSC > Introduction to the jpress group on software engineering application and practice of Shandong University
- 88%工业人都不知,小程序这7点,能让营收暴增,粗暴有效!强烈建议收藏,反复读!
- Complex linear space and complex structure
- 他98年的,我玩不过他...
- VS2019配置opencv4
猜你喜欢

After five years of outsourcing, I'm almost a loser

“国潮”积木,潮玩的下一个答案?

Actual combat | performance pressure test of JMeter typical e-commerce scenario (order / payment)

LeetCode_509 斐波那契数

实战 | JMeter 典型电商场景(下单/支付)的性能压测

88%工业人都不知,小程序这7点,能让营收暴增,粗暴有效!强烈建议收藏,反复读!

The whole process of callback registration and callback of openharmony sensor module

How to make join run faster? (book at the end of the text)

【网络安全】红队渗透项目之Stapler1(下)

单、双链表的循环链表(十五)
随机推荐
CUDA02 - 访存优化和Unified Memory
Pytorch中的nn.AdaptiveAvgPool2d(output_size)简单介绍
C# 双保险进程监视器 lol 保证被监视的程序'几乎'永远运行. 关键字:进程操作 进程查看 创建进程
There is a problem with CORS cross domain request
<2021SC@SDUSC>山东大学软件工程应用与实践JPress小组课题介绍
After five years of outsourcing, I'm almost a loser
Jmeter如何设置参数化
Specific methods of configuring Profibus and PROFINET communication in two TIA botu projects
IaaS,PaaS,SaaS 的区别
单、双链表的循环链表(十五)
C # cannot be used for characters of file name
Shell: Variables
Complex linear space and complex structure
如何确保API 的稳定性与正确性?你只需要这一招
Mysql坑爹指南_sql_mode=“ONLY_FULL_GROUP_BY“所导致错误以及不能使用group by
Use of auto keyword
warning: LF will be replaced by CRLF in composer.json.
在IE和Edge中用JS判断只能输入数字,字母,日期型。
La différence et la relation entre glew, Glee et GL Glu glut glx glext
C语言求完全平方数
