学习笔记 搜索笔记

原课号:06.3 · 迁移专题(可选读)

轮式机器人:滚动约束、驱动力和工作点线性化

区分轮速运动学与电机驱动动力学,推导无侧滑约束、差速车的等效惯性和输入分配,解释静止线性化为何丢掉横向可控性,并建立辨识与控制的层级。

建议先读:移动机器人运动学 · 从一轴动力学推到可运行的离散 PID

本页目录

1. 为什么会发速度指令,还需要动力学

导航规划器常输出 vcv_c(m/s)和 ωc\omega_c(rad/s)。这些是期望速度,不是地面实际施加的力。电机有电流限制,轮胎有摩擦极限,车身有惯性;坡度、地毯和载荷会改变响应。

因此要分清三层:

  • 运动学层:假设 v,ωv,\omega 已经实现,计算位姿变化。
  • 速度控制层:用轮速反馈和驱动力矩让实际速度跟踪命令。
  • 执行器层:电压/电流/驱动器内部环把命令变成电机力矩。

若厂商底盘已闭合速度环,可以先辨识“速度命令到实际速度”的闭环模型;直接控制裸电机时,不能假设这一层已经存在。

2. 无侧滑约束不是“车永远不能横向移动”

取两驱动轮轴中点为车体参考点,位姿 q=[x,y,ψ]Tq=[x,y,\psi]^T。世界平面坐标为 x,yx,y,航向 ψ\psi 逆时针为正。车体横向速度为

vyb=−sin⁡ψ x˙+cos⁡ψ y˙.v_y^b=-\sin\psi\,\dot x+\cos\psi\,\dot y.

理想无侧滑轮约束 vyb=0v_y^b=0 可写成 Ac(q)q˙=0A_c(q)\dot q=0,其中 Ac=[−sin⁡ψ,cos⁡ψ,0]A_c=[-\sin\psi,\cos\psi,0]。允许的速度可以参数化为

q˙=S(q)ξ,S=[cos⁡ψ0sin⁡ψ001],ξ=[vω].\dot q=S(q)\xi,\qquad S=\begin{bmatrix}\cos\psi&0\\\sin\psi&0\\0&1\end{bmatrix},\quad \xi=\begin{bmatrix}v\\\omega\end{bmatrix}.

SS 的第一列是沿车头平移,第二列是原地转动,且 AcS=0A_cS=0。通过先转弯再前进,车仍可到达世界坐标中的横向位置;限制的是瞬时速度方向,不是所有未来可达位置。

3. 约束力如何从方程中消掉

在含约束的坐标中,动力学一般写成

Mq(q)q¨+hq(q,q˙)=Bq(q)τ+Ac(q)Tλ.M_q(q)\ddot q+h_q(q,\dot q)=B_q(q)\tau+A_c(q)^T\lambda.

λ\lambda 是维持约束的接触反力。它未知,但理想约束不对允许速度做功,因为 q˙TAcTλ=0\dot q^TA_c^T\lambda=0。

由 q˙=Sξ\dot q=S\xi 求导:q¨=Sξ˙+S˙ξ\ddot q=S\dot\xi+\dot S\xi。代回并左乘 STS^T,利用 STAcT=0S^TA_c^T=0,得到

STMqS⏟Mrξ˙+ST(MqS˙ξ+hq)=STBqτ.\underbrace{S^TM_qS}_{M_r}\dot\xi+ S^T(M_q\dot S\xi+h_q)=S^TB_q\tau.

这个过程叫约束投影。它解释了为什么不能把轮式机器人当作能任意施加世界 x/yx/y 两方向力的滑块。实际打滑时约束不再成立,需要轮胎力或侧滑模型,而不是继续把同一约束当精确事实。

4. 差速车的驱动力和转向力矩

设轮半径 rwr_w(m),左右轮距为 2b2b(m),此处 bb 是半轮距;运动学课用 bb 表示完整轮距,转换时应将其除以二,轮端力矩为 τR,τL\tau_R,\tau_L(N·m),不考虑轮惯性时轮地纵向力近似 Fi=τi/rwF_i=\tau_i/r_w。因此

F=τR+τLrw,Nz=b(τR−τL)rw.F=\frac{\tau_R+\tau_L}{r_w},\qquad N_z=\frac{b(\tau_R-\tau_L)}{r_w}.

左式单位 N,右式 N·m。合力使车前进,差动力矩使车转向。倒过来分配:

τR=rw2(F+Nzb),τL=rw2(F−Nzb).\tau_R=\frac{r_w}{2}\left(F+\frac{N_z}{b}\right),\qquad \tau_L=\frac{r_w}{2}\left(F-\frac{N_z}{b}\right).

同时请求大加速和大转弯可能让一侧力矩饱和。 单独限制 FF 和 NzN_z 并不等于限制每个电机,应在轮端约束里检查可行性。

把轮子转动惯量也算进去

无滑动滚动给出 ϕ˙R=(v+bω)/rw\dot\phi_R=(v+b\omega)/r_w、ϕ˙L=(v−bω)/rw\dot\phi_L=(v-b\omega)/r_w。设每个轮端等效转动惯量为 JwJ_w,已包含需要计入的电机反射惯量;车体质量 mm 包含轮子平动质量,车体总偏航惯量为 IzI_z,但未重复包含轮轴自转能。

总动能为

T=12mv2+12Izω2+12Jw[(v+bωrw)2+(v−bωrw)2].T=\frac12mv^2+\frac12I_z\omega^2+ \frac12J_w\left[\left(\frac{v+b\omega}{r_w}\right)^2+ \left(\frac{v-b\omega}{r_w}\right)^2\right].

展开平方,交叉项相消:

T=12(m+2Jwrw2)v2+12(Iz+2Jwb2rw2)ω2.T=\frac12\left(m+\frac{2J_w}{r_w^2}\right)v^2+ \frac12\left(I_z+\frac{2J_wb^2}{r_w^2}\right)\omega^2.

所以轮惯性表现为等效质量和等效偏航惯量。若质心位于轮轴中点、平面运动且忽略额外耦合,则可用

mev˙=F−bvv−dv,Ieω˙=Nz−bωω−dω.m_e\dot v=F-b_vv-d_v,\qquad I_e\dot\omega=N_z-b_\omega\omega-d_\omega.

me=m+2Jw/rw2m_e=m+2J_w/r_w^2,Ie=Iz+2Jwb2/rw2I_e=I_z+2J_wb^2/r_w^2;dv,dωd_v,d_\omega 是此处定义为阻碍正方向运动的未知负载项,符号与“外力加在右侧”的约定不同,应始终在接口写清楚。

加入轮惯性后的力必须重新解释。 此时 F=(τR+τL)/rwF=(\tau_R+\tau_L)/r_w 与 Nz=b(τR−τL)/rwN_z=b(\tau_R-\tau_L)/r_w 是按滚动约束折算的广义驱动力/力矩,不再直接等于真实接触力的合力/合矩。简化轮轴方程为 τi=rwFcontact,i+Jwϕ¨i\tau_i=r_wF_{\mathrm{contact},i}+J_w\ddot\phi_i,所以 Fcontact,i=(τi−Jwϕ¨i)/rwF_{\mathrm{contact},i}=(\tau_i-J_w\ddot\phi_i)/r_w。加速轮子本身也消耗一部分电机力矩;本课数例广义力为 1111 N,而实际对质量 2020 kg 产生 0.50.5 m/s² 的纵向接触合力为 1010 N。

5. 为什么静止点的线性化看起来不能横移

理想运动学是 x˙=vcos⁡ψ\dot x=v\cos\psi、y˙=vsin⁡ψ\dot y=v\sin\psi、ψ˙=ω\dot\psi=\omega。在静止、ψ0=0\psi_0=0 附近一阶线性化:

δx˙=δv,δy˙=0,δψ˙=δω.\delta\dot x=\delta v,\qquad \delta\dot y=0,\qquad \delta\dot\psi=\delta\omega.

横向输入通道不见了。原因是横移要通过“先改变姿态,再前进”的组合效应,它在静止点一阶模型中属于高阶效应。线性化不可控,不等于原非线性机器人不能到达该位置。 但这确实说明不能给这个静止线性模型直接套一个三轴位置 LQR,就期待像全向车一样工作。

如果参考车以 v0≠0v_0\ne0 沿 xx 轴行驶,围绕参考轨迹有

δy˙≈v0δψ,δψ˙=δω.\delta\dot y\approx v_0\delta\psi,\qquad \delta\dot\psi=\delta\omega.

此时转向会通过航向误差产生横向运动。状态矩阵随参考速度变化,适合轨迹线性化的时变反馈或 MPC。停车定位通常用适合非完整约束的非线性/时变策略与阶段切换,不应假装它具有三个独立瞬时输入。

6. 从动力学设计速度内环

对纵向速度轴,目标速度 vd(t)v_d(t) 给出误差 ev=v−vde_v=v-v_d。若模型与负载已知,取

F=m^ev˙d+b^vv+d^v−kvev.F=\hat m_e\dot v_d+\hat b_vv+\hat d_v-k_ve_v.

kvk_v 为 N·s/m。理想情况下代入得到 mee˙v=−kvevm_e\dot e_v=-k_ve_v,误差指数衰减。这就是“加速度前馈+阻力补偿+速度反馈”的物理推导,而不是随机拼接三个项。

未知恒定负载可以用积分或扰动观测器处理。加入 z˙=ev\dot z=e_v、F=m^ev˙d+b^vv−kvev−kizF=\hat m_e\dot v_d+\hat b_vv-k_ve_v-k_iz,理想特征方程为 mes2+kvs+ki=0m_es^2+k_vs+k_i=0。若电机饱和,仍不断积分会产生 windup;应根据实际可实现力与请求力的差做抗饱和,而不是只限制打印出来的目标值。

轮胎极限比控制器公式优先

静摩擦近似要求每个轮的接触切向力满足 ∣Fcontact,i∣≤μNi|F_{\mathrm{contact},i}|\le\mu N_i。μ\mu 为摩擦系数,NiN_i 为法向力。若同时存在纵横向接触力,约束应作用在切向合力上,而不是给两个方向各自完整的摩擦额度。急加速、载荷转移、坡道会改变该边界。超过它时编码器轮速可能变化很快,而车体并未对应运动,融合系统也不能把轮速当作无偏地速。

7. 参数辨识与建模取舍

先用低风险试验确认电机方向、轮径、轮距,再拟合速度响应。若发恒定力后速度近似一阶,则 mev˙+bvv=Fm_e\dot v+b_vv=F 的时间常数为 Tv=me/bvT_v=m_e/b_v,静态增益为 1/bv1/b_v。仅给定归一化命令而未标定推力时,观测到的是组合增益,不能分别确定绝对质量和电机力矩系数。

差速底盘若是四轮滑移转向,转弯依赖轮胎侧滑和地面摩擦,理想两轮无侧滑模型只适合作粗近似。高速车辆还需侧向轮胎力、侧偏角、横摆动力学;低速自行车几何模型不应无限外推。建模复杂度应由任务速度、精度和可测量参数决定。

8. C++ 练习:从期望加速度分配轮端力矩

设 rw=0.1r_w=0.1 m、b=0.25b=0.25 m、m=20m=20 kg、Iz=1I_z=1 kg·m²、每轮 Jw=0.01J_w=0.01 kg·m²,无阻力。要实现 v˙=0.5\dot v=0.5 m/s²、ω˙=0.4\dot\omega=0.4 rad/s²,需要左右多少力矩?再代回验证。

展开答案与 C++17 测试

me=22m_e=22 kg,Ie=1.125I_e=1.125 kg·m²,因此 F=11F=11 N、Nz=0.45N_z=0.45 N·m。右轮 0.640.64 N·m,左轮 0.460.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,NzF,N_z 的破坏。可先做分配在线题,再写一个明确选择纵向/转向优先级的约束优化器。

来源与迁移

约束几何与不同底盘输入集合可对照 Modern Robotics 非完整轮式机器人模型。本文等效轮惯性、输入分配与速度控制数例为独立推导;实际设备必须把轮端力矩、电机端力矩、归一化命令分开标定。水下机器人没有轮地无侧滑约束,但同样需要把广义力分配到受限执行器,下一课继续这条线。

仅保存在当前浏览器,可在学习记录页导出。