1. 为什么会发速度指令,还需要动力学
导航规划器常输出 vc(m/s)和 ωc(rad/s)。这些是期望速度,不是地面实际施加的力。电机有电流限制,轮胎有摩擦极限,车身有惯性;坡度、地毯和载荷会改变响应。
因此要分清三层:
- 运动学层:假设 v,ω 已经实现,计算位姿变化。
- 速度控制层:用轮速反馈和驱动力矩让实际速度跟踪命令。
- 执行器层:电压/电流/驱动器内部环把命令变成电机力矩。
若厂商底盘已闭合速度环,可以先辨识“速度命令到实际速度”的闭环模型;直接控制裸电机时,不能假设这一层已经存在。
2. 无侧滑约束不是“车永远不能横向移动”
取两驱动轮轴中点为车体参考点,位姿 q=[x,y,ψ]T。世界平面坐标为 x,y,航向 ψ 逆时针为正。车体横向速度为
vyb=−sinψx˙+cosψy˙.
理想无侧滑轮约束 vyb=0 可写成 Ac(q)q˙=0,其中 Ac=[−sinψ,cosψ,0]。允许的速度可以参数化为
q˙=S(q)ξ,S=cosψsinψ0001,ξ=[vω].
S 的第一列是沿车头平移,第二列是原地转动,且 AcS=0。通过先转弯再前进,车仍可到达世界坐标中的横向位置;限制的是瞬时速度方向,不是所有未来可达位置。
3. 约束力如何从方程中消掉
在含约束的坐标中,动力学一般写成
Mq(q)q¨+hq(q,q˙)=Bq(q)τ+Ac(q)Tλ.
λ 是维持约束的接触反力。它未知,但理想约束不对允许速度做功,因为 q˙TAcTλ=0。
由 q˙=Sξ 求导:q¨=Sξ˙+S˙ξ。代回并左乘 ST,利用 STAcT=0,得到
MrSTMqSξ˙+ST(MqS˙ξ+hq)=STBqτ.
这个过程叫约束投影。它解释了为什么不能把轮式机器人当作能任意施加世界 x/y 两方向力的滑块。实际打滑时约束不再成立,需要轮胎力或侧滑模型,而不是继续把同一约束当精确事实。
4. 差速车的驱动力和转向力矩
设轮半径 rw(m),左右轮距为 2b(m),此处 b 是半轮距;运动学课用 b 表示完整轮距,转换时应将其除以二,轮端力矩为 τR,τL(N·m),不考虑轮惯性时轮地纵向力近似 Fi=τi/rw。因此
F=rwτR+τL,Nz=rwb(τR−τL).
左式单位 N,右式 N·m。合力使车前进,差动力矩使车转向。倒过来分配:
τR=2rw(F+bNz),τL=2rw(F−bNz).
同时请求大加速和大转弯可能让一侧力矩饱和。 单独限制 F 和 Nz 并不等于限制每个电机,应在轮端约束里检查可行性。
把轮子转动惯量也算进去
无滑动滚动给出 ϕ˙R=(v+bω)/rw、ϕ˙L=(v−bω)/rw。设每个轮端等效转动惯量为 Jw,已包含需要计入的电机反射惯量;车体质量 m 包含轮子平动质量,车体总偏航惯量为 Iz,但未重复包含轮轴自转能。
总动能为
T=21mv2+21Izω2+21Jw[(rwv+bω)2+(rwv−bω)2].
展开平方,交叉项相消:
T=21(m+rw22Jw)v2+21(Iz+rw22Jwb2)ω2.
所以轮惯性表现为等效质量和等效偏航惯量。若质心位于轮轴中点、平面运动且忽略额外耦合,则可用
mev˙=F−bvv−dv,Ieω˙=Nz−bωω−dω.
me=m+2Jw/rw2,Ie=Iz+2Jwb2/rw2;dv,dω 是此处定义为阻碍正方向运动的未知负载项,符号与“外力加在右侧”的约定不同,应始终在接口写清楚。
加入轮惯性后的力必须重新解释。 此时 F=(τR+τL)/rw 与 Nz=b(τR−τL)/rw 是按滚动约束折算的广义驱动力/力矩,不再直接等于真实接触力的合力/合矩。简化轮轴方程为 τi=rwFcontact,i+Jwϕ¨i,所以 Fcontact,i=(τi−Jwϕ¨i)/rw。加速轮子本身也消耗一部分电机力矩;本课数例广义力为 11 N,而实际对质量 20 kg 产生 0.5 m/s² 的纵向接触合力为 10 N。
5. 为什么静止点的线性化看起来不能横移
理想运动学是 x˙=vcosψ、y˙=vsinψ、ψ˙=ω。在静止、ψ0=0 附近一阶线性化:
δx˙=δv,δy˙=0,δψ˙=δω.
横向输入通道不见了。原因是横移要通过“先改变姿态,再前进”的组合效应,它在静止点一阶模型中属于高阶效应。线性化不可控,不等于原非线性机器人不能到达该位置。 但这确实说明不能给这个静止线性模型直接套一个三轴位置 LQR,就期待像全向车一样工作。
如果参考车以 v0=0 沿 x 轴行驶,围绕参考轨迹有
δy˙≈v0δψ,δψ˙=δω.
此时转向会通过航向误差产生横向运动。状态矩阵随参考速度变化,适合轨迹线性化的时变反馈或 MPC。停车定位通常用适合非完整约束的非线性/时变策略与阶段切换,不应假装它具有三个独立瞬时输入。
6. 从动力学设计速度内环
对纵向速度轴,目标速度 vd(t) 给出误差 ev=v−vd。若模型与负载已知,取
F=m^ev˙d+b^vv+d^v−kvev.
kv 为 N·s/m。理想情况下代入得到 mee˙v=−kvev,误差指数衰减。这就是“加速度前馈+阻力补偿+速度反馈”的物理推导,而不是随机拼接三个项。
未知恒定负载可以用积分或扰动观测器处理。加入 z˙=ev、F=m^ev˙d+b^vv−kvev−kiz,理想特征方程为 mes2+kvs+ki=0。若电机饱和,仍不断积分会产生 windup;应根据实际可实现力与请求力的差做抗饱和,而不是只限制打印出来的目标值。
轮胎极限比控制器公式优先
静摩擦近似要求每个轮的接触切向力满足 ∣Fcontact,i∣≤μNi。μ 为摩擦系数,Ni 为法向力。若同时存在纵横向接触力,约束应作用在切向合力上,而不是给两个方向各自完整的摩擦额度。急加速、载荷转移、坡道会改变该边界。超过它时编码器轮速可能变化很快,而车体并未对应运动,融合系统也不能把轮速当作无偏地速。
7. 参数辨识与建模取舍
先用低风险试验确认电机方向、轮径、轮距,再拟合速度响应。若发恒定力后速度近似一阶,则 mev˙+bvv=F 的时间常数为 Tv=me/bv,静态增益为 1/bv。仅给定归一化命令而未标定推力时,观测到的是组合增益,不能分别确定绝对质量和电机力矩系数。
差速底盘若是四轮滑移转向,转弯依赖轮胎侧滑和地面摩擦,理想两轮无侧滑模型只适合作粗近似。高速车辆还需侧向轮胎力、侧偏角、横摆动力学;低速自行车几何模型不应无限外推。建模复杂度应由任务速度、精度和可测量参数决定。
8. C++ 练习:从期望加速度分配轮端力矩
设 rw=0.1 m、b=0.25 m、m=20 kg、Iz=1 kg·m²、每轮 Jw=0.01 kg·m²,无阻力。要实现 v˙=0.5 m/s²、ω˙=0.4 rad/s²,需要左右多少力矩?再代回验证。
展开答案与 C++17 测试
me=22 kg,Ie=1.125 kg·m²,因此 F=11 N、Nz=0.45 N·m。右轮 0.64 N·m,左轮 0.46 N·m。
#include <array>
#include <cmath>
#include <cassert>
std::array<double,2> allocate(double F,double Nz,double r,double b) {
assert(r>0 && b>0);
return {0.5*r*(F+Nz/b),0.5*r*(F-Nz/b)}; // right, left
}
int main() {
const double r=0.1,b=0.25,Jw=0.01;
const double me=20+2*Jw/(r*r), Ie=1+2*Jw*b*b/(r*r);
auto t=allocate(me*0.5,Ie*0.4,r,b);
assert(std::abs(t[0]-0.64)<1e-12 && std::abs(t[1]-0.46)<1e-12);
assert(std::abs((t[0]+t[1])/r/me-0.5)<1e-12);
assert(std::abs(b*(t[0]-t[1])/r/Ie-0.4)<1e-12);
auto turn=allocate(0,2,r,b);
assert(std::abs(turn[0]+turn[1])<1e-12);
}
下一步把轮端约束加入,比较“直接分别裁剪两个轮力矩”对原需求 F,Nz 的破坏。可先做分配在线题,再写一个明确选择纵向/转向优先级的约束优化器。
来源与迁移
约束几何与不同底盘输入集合可对照 Modern Robotics 非完整轮式机器人模型。本文等效轮惯性、输入分配与速度控制数例为独立推导;实际设备必须把轮端力矩、电机端力矩、归一化命令分开标定。水下机器人没有轮地无侧滑约束,但同样需要把广义力分配到受限执行器,下一课继续这条线。