接触机器人这么久了,屏幕前的你是否好奇过:我们下发的速度和角速度指令,是怎么转换成双轮速度的?拿到的里程计信息,又是如何经过转换得到xy坐标和偏向角的?
有关双轮差速移动机器人的底盘移动原理和控制方式,带你一探究竟。
01 底盘移动原理
事实上,双轮差速移动机器人的底盘移动,是通过控制两个轮子的转速差异来实现的。
当两个轮子转速相同时,机器人会直线移动;当两个轮子转速不同时,机器人会绕着中心点旋转。所以通过控制两个轮子的转速差异,机器人就可以实现各种曲线运动和转向操作。
在实际应用中,双轮差速移动机器人的底盘通常由电机、减速器、编码器和控制器等组成。想让机器人动起来,电机自然是必不可少。而底盘的电机,我们通常会选择成熟厂商的伺服电机。
这些电机一般都会有专门的控制协议,它们通过RS485或者CAN总线与我们的处理器通信。我们需要根据电机厂商的数据手册和对象字典手册,对电机进行配置,然后达到控制目的。
02 伺服电机的控制
本文主要介绍CAN总线通信方式,RS485的连接方式不在我们的讨论范围之内。
SDO模式
SDO模式,一般是电机驱动器上电之后的默认模式。通俗的说,SDO控制模式就是一种「一问一答」的控制模式。
驱动器作为Server提供服务,控制端设备(一般为主机)作为Client根据对象字典发送报文给驱动器,驱动器会根据收到的报文执行相应的动作,并且同时反馈一个报文给控制端设备。
举个例子,通过 SDO 消息将数据 0x2064 写入到索引为 0x60FF,子索引为 3 的对象字典中:
0x601 2F FF 60 03 64 20 00 00 Client -> Server
0x581 60 FF 60 03 00 00 00 00 Server -> Client
也就是说,我们可以通过SDO模式对驱动的参数进行改变从而控制电机。比如,给字典中的速度设置地址发送实时速度值,同时也可以通过读取反馈的方式获取编码器的值。
PDO模式
既然SDO模式已经可以控制电机、反馈电机状态数据了,为什么还要搞一个PDO模式呢?
仔细一想,就会发现两个问题:
1.每次SDO控制都会反馈一个报文,这个反馈会占用总线时间,而我们不总是想要反馈信息;
2.每次想要某个字典的数据时候,都需要先发一个询问的报文,Server才能反馈数据。
实操起来似乎有些麻烦,于是我们就会想:
1.有没有一种方式,我往某个字典地址里填充数据,它不会给我反馈,而是直接修改我需要修改的值?
2.有没有一种方式,它会周期性地把某个字典的数据抛上来给我,而不用每次都去询问?
伟大的前人已经帮我们想好了,那就是PDO模式。接下来,我们认识一下PDO模式中,两种数据传输模式的核心思想:
-
RPDO
RPDO的发送是由接收方发起的,一般由控制器或主机向从设备发送指令,要求从设备将数据发送给控制器或主机。
这个过程,其实就像邮局派发信件。RPDO就是这个邮局,它先在你家门口设置一个信箱,当收到你的信件之后,它不会在意你是否给予反馈,反正邮局的信件随时都可以塞到你家信箱。
-
TPDO
TPDO的发送是由发送方发起的,通常是由从设备向控制器或主机发送数据,以便控制器或主机能及时了解从设备的状态。
这种数据传输方式更像是一种「双向约定」——每隔1个小时,你就给我报一下时。
03 里程计推导
通过计算双轮差速移动机器人里程计数据的值,我们可以获得机器人的物理世界坐标和方向角信息,以更好地进行运动控制和路径规划。
我们先定义 为两个轮子等轮距, 为两轮中心的速度, 为小车的角速度, 和 分别为左轮和右轮速度,根据运动学关系,容易得到:
,
通过上一节可以知道,我们获取的反馈是两个轮子编码器的值,是轮子在 时间之内转过的路程,这里假设我们的轮子从不打滑,有:
所以有:
,
现在我们假设当前小车双轮中心在世界坐标系里的坐标是( , , ),X和Y是当前时刻小车在世界坐标系中的坐标,θ是小车世界坐标系中相对于X轴的偏角。经过 之后的位置是( ,, ),移动的距离是 ,根据运动学关系得:
从上面的推导可以看出,里程计的值跟编码器的每次的增量 有关系,跟 没有关系。也就是说,我们可以通过一次次地迭代,利用编码器的值算出里程计的 , 和 。
最后,还有一个值得我们思考的问题:底盘运动是不是做到「收到什么指令,执行什么动作」就可以了?
假想一下,当底盘收到一个高速指令,但是发送指令的节点失效了,此时底盘会怎么做?没错,它会维持一个高转速一直运行下去。那么就会产生一些安全问题,这并不是我们想要的。
所以,合理的设计应该是一个周期循环的线程,可以通过指令的超时机制,直接将底盘置零。