2023rm赛后漫谈
很多想说的,说到哪算哪吧。
一、无下位机方案
有使用Jetson Xavier NX 尝试过无下位机的控制方案。广工廖佬在这条路上已经走的很远了,而我在尝试的时候遇到一些问题尚未解决或尚未找到最优解。
本人专业是测控技术与仪器,没有一个很系统的编程培训,全靠自己摸索与学习。在使用NX时,利用板载CAN控制3508、达妙4310,均是成功的。这里我就来讲讲我遇到的问题。在调试工程机器人的时候,单路我挂载了5个4310,控制频率为100Hz,起初会出现电机死掉无反应的情况,经过和喵老板的讨论得出的结论是每个电机的FIFO容量有限,一旦超出他的容积就会让电机电调程序跑飞。这里我不得不对帧与帧的报文发送在代码层面做延时。这个电机的控制形式是激发式,只有收到了控制报文电调才会反馈报文。在一开始出问题的那种条件下,单个电机100Hz,5*100*2=1000Hz,在总线上会有1000Hz的报文,按道理1Mpbs的CAN总线不至于邮箱被挤爆。问题就出在我写的程序,多个电机控制的CAN报文发送的代码之间没有时间间隔,对于NX来说,它的缓冲区和CPU执行速度肯定是要比单片机要好10倍以上的,所以表面上是1000Hz,但报文的瞬时频率可能至少有10000Hz,这样就会很快的把电机的FIFO挤爆。
有尝试过usb转CAN的设备做无下位机方案。当时使用的外设是达妙的那个CAN调试设备,本质上这玩意是将CAN报文做一个转换,走串口通讯发出来。最后没有用是因为在pc上使用串口远远没有socketCAN方便,另一方面是我的水平不太够。使用socketCAN可以在不同的进程里对同一个CAN通道进行实例化使用,而串口只能在一个进程中被占用,麻烦了不少。
赛后了解到有一种东西叫PCAN,可以在ARM架构的LINUX通过挂载设备树,从而使用socketCAN进行使用。想来NX的那个CAN口也是类似的,在使用那个CAN时我都要使用命令挂载CAN设备。进一步的,其实我认为不光是ARM架构的LINUX可以通过挂载设备树的方式,x86/x64也可以,以后有时间再尝试吧。不过我还看到一个东西,叫PCIE CAN卡,工业用的。
关于系统的实时性,常用的方法就是给系统打补丁,PREEMPT_RT。不过很奇怪的是我在nuc和NX上都有尝试过自行编译内核,最后结果没太大变化。有机会再去研究吧。
二、工程机器人的自定义控制
最理想的远程控制机械臂的方案是用惯性(类VR手柄)设备来操控机械臂的六轴姿态。南航那个方案做的挺好的,不仅是想法好,而且很适合他们的车。为什么,等我慢慢说。
大家在看一款机械臂的参数时,不难注意到一个参数叫做重复定位精度。学机械的应该学过数值测量、互换性、机械制造这些课,应该知道,打千分表测数据一般会做几组测试,一组重复测量5次然后取平均。举个例子,让机械臂从任意位置到A点,A点会有个千分表,每次机械臂运动到A点后会与千分表进行接触,每次表的读数会在一个微米级的区间变,那么我们就说重复定位精度时0.01mm。如果说机械臂的输出单元在输出端有个精度较高的编码器,并且减速器精度不拉跨,通常都能做到0.01mm的重复定位。
对重复定位精度有了了解,再来说说我们比赛的机械臂需要这个指标嘛?明显是不需要的。讲重复定位精度的机械臂应用通常关心的是从A到B,再从B到A,只管起点和终点的位置是准确的就好。而我们在比赛中,其实更关注的是轨迹定位精度。我们允许从A到B有误差,但由于工程机器人他的功能的需求,他需要抓取机构在一个相对复杂的环境中运动,并且要抓取一个相对大的物体。这就导致我们需要非常精确且滞后很小的控制末端的姿态。做控制的同学应该知道,在大负载的情况下,除非机构运行的很慢,否则是很难做到的。那么,六轴机械臂的控制将会变得难以满足需求。反而,框架式在控制上会十分方便、迅速、有效。
大家所说的框架式,在工业界更多的叫三轴笛卡尔。框架式负责x、y、z方向的移动,然后再在末端装三轴负责roll、pitch、yaw。当我们使用控制器控制时,单个惯性设备只能控制三个自由度。对于框架式的设备,当我使用控制器控制三轴移动,那么我的三轴笛卡尔将会运动,而负责旋转的设备不会运动。但对于六轴机械臂,无论改变几个自由度的数据,将至少有3、4个关节会运动,而机械臂这种串联的设备,每个关节累计的误差传递到末端将会非常非常大。而对于三轴笛卡尔设备,进行力位混合控制(前馈+PI)时,会比机械臂要简单不少,同样的条件我认为三轴笛卡尔的轨迹精度更能保证