简介
本文档旨在建立一个完善的MoveIt控制实体机械臂(机器人)的使用步骤。
在网上阅读了大量良莠不齐的文档后,我发现没有一篇是能从solidworks设立坐标系与旋转轴到MoveIt基础使用再到最终的实体机器人控制讲清楚的,而在RoboMaster中,工程机器人又在向更为复杂的机械臂转型,复杂的旋转矩阵计算已经让人十分头大,运动学逆解算到每个joint上、姿态最优解、运动学规划更是让人望而生怯,一个更好的工具我觉得已经迫在眉睫了。
遂作下此文,以帮助后来的队员能够更好的使用MoveIt,少走弯路。本文将以西安交通大学笃行队伍2023赛季国赛工程为例尽可能详细地介绍每一步步骤,希望此次技术升级能够成功。
前置条件
本文默认你的电脑已经装好、你已经拥有:
- Ubuntu、vscode的环境配置,详情请见视觉组文档或者直接拉一个视觉同学来帮你装,我是后者。
- ROS的安装与基本使用,下好MoveIt,参见b站教程,这位讲的很好,建议所有部分全部看完。机器人操作系统 ROS 快速入门教程_哔哩哔哩_bilibili
- solidworks及其最最最基本的使用,详情请见机械组文档或者找一个机械同学来帮你装,但我建议直接淘宝11.99rmb直接shopping远程代装,我是这样。
- sw2urdf 插件,这里粘一下网址[ROS机器人开发实践(专题篇) —— 如何从Solidworks导出URDF模型?_机械臂urdf文件-CSDN博客](https://blog.csdn.net/qq_44455588/article/details/105152797/?spm=1001.2014.3001.5506
- 一个机器人实体以及电机控制,并且机器人应该能够反馈位姿xyz、yaw、pitch、roll(队内即工程机器人与电控控制)。
- **机械工业出版社-机器人学导论(第四版)**前四章水平,即23赛季工程机械臂解算、自定义控制器代码能够读懂即可,或者说熟练掌握旋转矩阵的知识。这里粘一下淘宝书本链接官网正版 机器人学导论 原书第4版 约翰 克雷格 工业自动化技术 空间位姿描述变换 运动学 雅可比 操作臂设计-tmall.com天猫
拥有了上述条件便可以愉快的打开此文啦!
从0开始的MoveIt之旅
Solidworks导出urdf文件,axis、joint与link的建立与定义
urdf文件即MoveIt能够识别的机器人模型文件,这里我们使用sw2urdf插件自动生成我们机器人的urdf文件。
首先打开整车装配体
上图即为23赛季国赛工程,它拥有x,y,z方向上的位移,机械臂的两个电机耦合转动实现了yaw、pitch的姿态,roll轴由一个2006电机直接控制。
现在开始介绍最基本的urdf知识以及一些不为人知的小秘密。
- axis,即坐标系,我们一般使用右手系坐标系,一会儿会在坐标系建立中有提及
- joint,即旋转轴、关节,注意,在urdf中,旋转轴有多种定义类型,我们除了planar和floating其他都会用到
- continuous 旋转关节,可以围绕单轴无限旋转
- revolute 旋转关节,类似于continuous,但是有旋转的角度限制
- prismatic 滑动关节,沿某一轴线移动的关节,带有位置极限
- planar 平面关节,允许在平面正交方向上平移或者旋转
- floating 浮动关节,允许进行平移、旋转运动
- fixed 固定关节,不允许运动的特殊关节
- link,可以理解为机械臂中的臂,可以通过下图直观理解,其中parent和child都属于link
- parent和child的关系,如上图所示直观理解。
- 在MoveIt逆运动学解算时,MoveIt不支持一、二维运动!即需要拥有xyz三个方向上的自由度,不然会解算失败!
基础的就先讲到这里,后续碰到了再讲。
OK了解了上述基础的知识我们可以在solidworks中定义axis、link与joint了!
这里不会赘述solidworks使用。
我们首先打开最大的装配体。
注意观察左下角的坐标系定义,如果其与你的baseaxis方向不同,需重新构建整车装配体使得该装配体坐标系与baseaxis统一,否则在接下来的MoveIt中会发生整个车体模型爆炸散乱导致接下来所有的工作失败并需重新配置!!!
在机器人学中,一般以前为x正方向,左为y正方向,上为z正方向,使用右手系坐标系。工程的电控坐标系也如此定义,为了方便起见,在ros中我们也统一该坐标系,故需重新生成一个装配体。由于工程是由四个小装配体组成的,我们需重新装配并配合这四个小装配体。
如下图所示,这个方向是我们期望的方向。
我们依次配合其他的装配体,保存。
需要注意的是,现在车在solidworks中是什么样,后续在urdf中的描述就是什么样。所以,我们最好在现在就定义好车体的初始位姿,特别是姿态。当然后续也可以在urdf中调,但是会比较麻烦。
下图为我所配合的工程新装配体。由于工程在Z轴和X轴上都使用了双倍行程,为了让机械臂不在Rviz中浮空移动(因为不好看),这里我把两个二级框架都拉到最远了。
OK现在开始进行axis和joint定义
首先我们需要定义一个点,在这个点上定义一个axis,作为baselink的axis,需要注意的是,这个baselink应该相对于整个车体是不动的,后续我们所有的坐标与姿态都是相对于此axis的原点以及xyz坐标轴的。
我们使用参考几何体来完成坐标系的定义。
首先在自己需要的地方定义一个点,如下图所示,我们把原点定在车体最后面的中间。如果我们定义的点不在实体上,那就打开零件改一下。此次操作就是这么做的。
打上点后,因为baselink不需要joint,所以我们直接在该点上生成坐标系。坐标系如下图所示。
注意看左下角的xyz颜色,红色为x,绿色为y,蓝色为z。
定义好第一个axis之后,我们应根据车体的运动逻辑设定下一个axis、link、joint。逻辑也可以称为影响。以此工程车举例,z->x->y->大pitch->XYX欧拉角,z的运动会影响后面所有的运动,x的运动会影响除z外的所有运动。所以,我们在定义axis、link、joint时应该根据此顺序定义。
接下来我们定义z_link、z_axis与z_joint。
***需要注意的是,z_axis应处于z_link上,即z_axis应可以随着z_link运动,而z_joint应在baselink上,它不应该随着z_link运动,因为z_link是相对于z_joint的轴线作的直线运动。***之后的旋转link同理,axis应随着该link转,但joint应在上一个link上,不随着该link转动。届时不再赘述
我们先定义z_joint。
为了方便我们这里仍使用点1,因为只要轴线方向对了就没事。
再定义z_axis。
x、y跟z同理,这里不再演示。快进到大pitch
首先定义大pitch旋转轴,该旋转轴应该定义在x_link上,并且轴心应和电机轴心对准。
再定义large_pitch_axis,如下图所示
注意,这个旋转轴是定义在这个板材上的,则大pitch_link应该包含这块板材。并且large_pitch_axis的y轴应与large_pitch_joint重合。
XYX不再赘述,值得注意的是如果需要的计算的点离上一个axis较远那么还需要一个末端axis,因为最终计算的时候是以axis原点作为目标值的。由于工程目前在开发视觉兑矿,而摄像头的位置在图传上方。
注意到有两个自由度,而我们需要的位置在pitch轴之外(pitch轴延长线不与摄像头轴心相交),所以,我们需要再设置三个axis、两个joint。如下图。
我们只需要在sw2urdf中的baselink下多定义一个附链节即可。
这里快进到使用sw2urdf插件。粘一下博客,写得蛮详细的,这里我不会细讲了,上面坐标系建立我发现都写得很烂才系统地写一篇文档。
SolidWorks导出机械臂的URDF模型各个关节坐标系设置_sw2urdf导入模型如何正确设置坐标系-CSDN博客
solidworks导出urdf文件并在ROS中显示-CSDN博客
看这两篇使用插件部分应该就够了。记得joint类型不要选错,并且不要选择自动生成joint,生成得非常烂。因为有摄像头的存在,所以base_link的子link这里选2。
我的最终树如下图。
哦对了,如果joint类型为fixed,参数不用填。
MoveIt Assistant的使用
首先,很高兴在ubuntu里遇见你!
接下来我们介绍MoveIt Assistant的使用,好吧此部分我也不会细讲,粘几个我认为讲的不错的网址,我会补充一些必要的东西。
Moveit学习笔记 (二) ——用建好的urdf模型通过moveit设置助手生成moveit配置文件_moveit教程 urdf-CSDN博客
MoveIt的使用(二)机械臂URDF在ROS中MoveIt的配置和使用_机械臂urdf代码-CSDN博客
MoveIt! 学习笔记12 - MoveIt! Setup Assistant 配置方法_moveit_setup_framework是什么-CSDN博客
这些我没有细挑,大伙凑合看吧。
容我切一下系统。
obsidian文档转来转去好麻烦,文档分为上下两册吧嘻嘻。