移动机器人底盘,原来是这样运动的…

接触机器人这么久了,屏幕前的你是否好奇过:我们下发的速度和角速度指令,是怎么转换成双轮速度的?拿到的里程计信息,又是如何经过转换得到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 里程计推导

通过计算双轮差速移动机器人里程计数据的值,我们可以获得机器人的物理世界坐标和方向角信息,以更好地进行运动控制和路径规划。

我们先定义 L 为两个轮子等轮距,V 为两轮中心的速度, \omega 为小车的角速度, {V}_{l}{V}_{r} 分别为左轮和右轮速度,根据运动学关系,容易得到:

\omega =\frac{V_{r}-V_{l}}{L}{V}=\frac {​{V}_{l}+{V}_{r}} {2}

通过上一节可以知道,我们获取的反馈是两个轮子编码器的值,是轮子在 \Delta t 时间之内转过的路程,这里假设我们的轮子从不打滑,有:

 

 所以有:

\omega \Delta t=\frac{\Delta d_{r}-\Delta d_{l} }{L} ,V \Delta t=\frac{\Delta d_{r}+\Delta d_{l}}{2}

现在我们假设当前小车双轮中心在世界坐标系里的坐标是( X_{n}Y_{n}\theta _{n}),X和Y是当前时刻小车在世界坐标系中的坐标,θ是小车世界坐标系中相对于X轴的偏角。经过 \Delta t 之后的位置是(X_{n+1}Y_{n+1}\theta _{n+1}),移动的距离是 \Delta d ,根据运动学关系得:

\Delta d=V\Delta t

X_{n+1}=X_{n}+ \Delta d\cos \theta _{n}

Y_{n+1}=Y_{n}+ \Delta d\sin \theta _{n}

\theta _{n+1}=\theta _{n}+\Delta \theta =\theta _{n}+\omega \Delta t

从上面的推导可以看出,里程计的值跟编码器的每次的增量 \Delta d 有关系,跟 \Delta t 没有关系。也就是说,我们可以通过一次次地迭代,利用编码器的值算出里程计的 X_{n+1} , Y_{n+1}\theta _{n+1}

最后,还有一个值得我们思考的问题:底盘运动是不是做到「收到什么指令,执行什么动作」就可以了?

假想一下,当底盘收到一个高速指令,但是发送指令的节点失效了,此时底盘会怎么做?没错,它会维持一个高转速一直运行下去。那么就会产生一些安全问题,这并不是我们想要的。

所以,合理的设计应该是一个周期循环的线程,可以通过指令的超时机制,直接将底盘置零。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值