机械臂解算

1、内容说明

本课程实现机械臂的正运动学计算、逆运动学计算。正运动学是由机械臂的每个舵机的角度值计算末端执行的位姿,而逆运动学则是由末端的位姿来计算在每个舵机的角度值,两者在进行三维空间夹取的时候有着至关重要的作用。由正运动学算法,可以得知当前机械臂末端的位姿,在进行坐标系转换的时候,我们需要知道这个值;由逆运动学算法,可以计算机械臂末端要到达目标位姿,机械臂的每个舵机的角度是多少,在进行夹取前,需要调用这个算法去计算舵机值,然后控制舵机运动到夹取的姿态。

本节内容需要在终端中输入指令,这里根据主板类型来选择打开终端。本节课程以树莓派5为例。树莓派和Jetson-Nano主板,需要在宿主机中打开终端,然后输入进入docker容器的指令,进入到docker容器后的终端里边输入本节课程提及的指令,宿主机进入docker容器的教程可以参考本产品教程【0.说明书和安装步骤】中的【进入小车Dockder(Jetson-Nano和树莓派5用户看这里)】的内容。

Orin主板直接打开终端,输入本节课程提及的指令即可。

2、程序启动

在终端中,输入以下命令启动,

启动后,终端输入ros2 node list来查看节点列表,

image-20250623151725420

/kinemarics_arm是启动正逆解算的节点,终端输入ros2 node info /kinemarics_arm 来查询节点信息,

image-20250623151909071

如上图所示,/kinemarics_arm节点提供了一个服务/get_kinemarics,服务的类型是arm_interface/srv/ArmKinemarics,终端输入ros2 interface show arm_interface/srv/ArmKinemarics查看这个服务数据包含哪些内容,

---把数据分为上下两部分,上边的是request,下边的response。request部分如下,

response部分如下,

2.1、调用fk

我们调用fk来计算下:当机械臂向上伸直的时候,机械臂末端的位姿是多少。首先我们输入以下指令让机械臂向上伸直,在成功连接agent后,终端输入以下指令,

运行后,机械臂会向上伸直,接着,我们在终端输入以下指令,调用fk服务,

这里输入的值有cur_joint1到cur_joint6的值,我们都是输入90.0,还有就是kin_name的值,我们输入'fk',表示调用fk-正解服务,终端会回复如下图的以下的内容,

image-20250623160905881

查看response部分:

我们只需要关心后边的x、y、z、roll、pitch和yaw的值。这里表示的是机械臂末端的位姿坐标,表示的是,在世界坐标系下,机械臂末端的位置,与base_link(0,0,0)为基准点,当机械臂伸直向上的时候,xyz和rpy的值为x=0.03141308752246765, y=0.00020942581836905875, z=0.5517500187814817, roll=1.5728637148906415, pitch=-1.5707324948694676, yaw=-1.5728927150075942,这里在虚拟机启动urdf显示查看下,虚拟机终端输入以下指令启动urdf显示,

如下图所示,使用TF插件来查看Gripping的位姿,xyz的坐标值与response的值相差无几,rpy的值则需要通过四元数转rpy来获取。

image-20250623163746353

2.2、调用ik

我们调用fk来计算下:当机械臂,机械臂末端的位姿是x=0.03141308752246765, y=0.00020942581836905875, z=0.5517500187814817, roll=1.5728637148906415, pitch=-1.5707324948694676, yaw=-1.5728927150075942的时候,每个舵机的是多少。其实这里就是反推回去了,理论上结果应该是六个舵机的值都是90.0。终端输入以下指令,

这里输入的值是xyz和rpy,cur_joint1-cur_joint6我们使用默认的就行,结果如下图所示,

image-20250623165932686

最后返回的response值是如下,

这里只需要关注joint1-joint5的值,因为机械臂的末端是Gripping,连接到的是5号舵机,6号的舵机的值不在逆解算的范围,所以这里获取到的值[90.0,90.0,90.0,90.0,90.0],与机械臂当前的姿态下的每个舵机值一样,可认为逆解算出来的结果是正确的。

3、核心代码解析

程序代码路径:

主函数main,

服务回调函数handle_service,