2. 运动学基础:坐标系定义与刚体运动描述
各位同学,咱们今天聊点实在的。做差速底盘,坐标系这东西绕不开。我刚开始做机器人那会儿,觉得坐标系嘛,不就是画个箭头吗?结果第一次调试,机器人原地转圈,跑出去回不来——坐标系搞反了。从那以后,我每次写代码前,都会先把坐标系画在纸上。
2.1 世界坐标系与机器人坐标系
说白了,世界坐标系就是「大地」的参考系。你站在操场上,东、南、西、北是固定的。机器人坐标系呢?是「机器人自己」的参考系。它朝哪看,哪就是前方。
我习惯这样定义:
- 世界坐标系:用
XWOWYW表示。原点固定在地面某点,X轴指向正东,Y轴指向正北。这个坐标系不会动。 - 机器人坐标系:用
XRORYR表示。原点在机器人几何中心,X轴指向机器人正前方,Y轴指向左侧。
你想想看,这两个坐标系之间是什么关系?其实就是平移加旋转。机器人在地面上走,它的位置变了(平移),朝向也变了(旋转)。
核心要点:世界坐标系是「绝对」的,机器人坐标系是「相对」的。所有传感器数据,最终都要统一到世界坐标系下处理。
2.2 刚体运动描述
机器人底盘,我们把它看作一个刚体。刚体运动,说白了就是「位置变了 + 姿态变了」。位置用坐标 (x, y) 表示,姿态用角度 θ 表示。
这里有个坑,我踩过。角度定义一定要统一。我见过有人用弧度,有人用度,还有人用四元数。在差速底盘里,我建议统一用弧度,且逆时针为正。
刚体运动的状态向量可以写成:
状态向量 = [x, y, θ]ᵀ
其中:
x:世界坐标系下的X坐标(单位:米)y:世界坐标系下的Y坐标(单位:米)θ:机器人朝向与世界坐标系X轴的夹角(单位:弧度)
我的小技巧:写代码时,把角度归一化到 [-π, π] 区间。否则积分久了,角度会漂移,你都不知道机器人到底朝哪。
2.3 速度与角速度概念
速度,就是位置的变化率。角速度,就是角度的变化率。听起来简单,但实际用起来容易乱。
在机器人坐标系下,速度有三个分量:
- 线速度 v:沿机器人正前方的速度(单位:m/s)
- 横向速度 vy:沿机器人左侧的速度(单位:m/s)——差速底盘通常为0
- 角速度 ω:绕机器人中心旋转的速度(单位:rad/s)
为什么差速底盘的横向速度通常为0?因为两个轮子只能产生前后方向的力,不能侧向移动。嗯,这里要注意,实际中轮胎会有侧滑,但运动学模型里我们忽略它。
世界坐标系下的速度与机器人坐标系下的速度,可以通过旋转矩阵转换:
[ẋ] [cosθ -sinθ 0] [v]
[ẏ] = [sinθ cosθ 0] [0]
[θ̇] [0 0 1] [ω]
这个公式,说白了就是:机器人朝哪个方向跑,世界坐标系下就对应哪个方向的速度分量。
我曾经犯过的错:直接拿机器人坐标系下的速度去更新世界坐标系下的位置,结果机器人跑成了「漂移模式」。记住,一定要先做旋转矩阵变换。
2.4 知识体系结构图
下面这张图,是我自己画的知识结构。你看一遍,心里就有谱了。
2.5 实际项目中的坐标系选择
我在做AGV小车项目时,遇到过一个问题:激光雷达的数据是在机器人坐标系下的,但地图是在世界坐标系下的。怎么对齐?
我的做法是:
- 先确定机器人当前在世界坐标系下的位姿
(x, y, θ) - 把激光雷达的每个点从机器人坐标系转换到世界坐标系
- 再与地图匹配,更新位姿估计
这个流程,说白了就是「坐标系变换」的实战应用。你如果理解了前面讲的旋转矩阵,这一步就是套公式的事。
经验之谈:写代码时,把坐标系变换封装成一个函数。我习惯叫它 robotToWorld(robot_pose, point_in_robot)。这样调试起来,一眼就能看出问题在哪。
2.6 本章小结
这一章,我们聊了三个核心概念:
- 世界坐标系和机器人坐标系——一个是绝对参考,一个是相对参考
- 刚体运动描述——位置加姿态,三个数搞定
- 速度与角速度——线速度、横向速度、角速度,别忘了旋转矩阵
嗯,这些基础打牢了,后面讲电机控制、运动学解算,你才不会晕。我当年就是吃了基础不牢的亏,走了不少弯路。希望你们能一步到位。