1. 同样是机器人,为什么水下模型多了附加质量
本课先建立六自由度结构,再在一个轴上完整设计控制,最后回到多轴限制。我们不把水下机器人直接当成“机械臂去掉关节”:它与周围流体交换动量,推进器产生的力还需要通过布局映射到六轴。
采用导航系 NED(北、东、下)和机体系 FRD(前、右、下),R 将机体系向量变成导航系向量。定义
η=[x,y,z,ϕ,θ,ψ]T,ν=[u,v,w,p,q,r]T,τ=[X,Y,Z,K,M,N]T.
η 前三项用 m、后三项用 rad;ν 前三项是机体系线速度 m/s,后三项是机体系角速度 rad/s。这里 q 是俯仰角速度符号,不是上一课的关节向量,也不是四元数。τ 前三项用 N、后三项用 N·m。
运动学为 η˙=J(η)ν。注意机体系角速度不等于 Euler 角导数;大姿态仿真宜用四元数更新,具体坐标关系回看第零章。
2. 先从刚体动能得到质量矩阵
设机体系原点为 O,质心相对它的位置为 rG。原点速度为 vO,角速度为 ω,则刚体上质心的速度为
vG=vO+ω×rG=vO−S(rG)ω.
S(a)b=a×b 是叉乘矩阵。刚体动能为
TRB=21m∥vO−S(rG)ω∥2+21ωTIGω.
展开并整理成 21νTMRBν:
MRB=[mI3mS(rG)−mS(rG)IG−mS(rG)2].
因为 ST=−S,整个矩阵对称。右下角正是平行轴定理的结果 IO=IG+m(∥rG∥2I−rGrGT)。若原点在质心,交叉块消失;若 CAD 惯量已经相对原点给出,再加平行轴项就会重复。
艇加速时必须同时推动部分周围水体。低频理想化模型可把相应流体动能写成 TA=21νrTMAνr,其中 MA 为附加质量矩阵,νr 是相对水的速度。它不是艇真的变重了,而是“加速同样快需要更多力”的惯性效应。不同方向附加质量不同,也可能耦合;在常用理想模型中 MA 对称且半正定,组合 MRB+MA 应正定。
3. 为什么会有 Coriolis 项,又为什么它不做净功
机体系本身在转动,因此动量分量的变化不只是普通时间导数。设某个常数对称惯性矩阵为 M,动量为
[h1h2]=Mν,
h1 为线动量,h2 为角动量。一种保持能量结构的速度耦合表示是
C(ν)=[0−S(h1)−S(h1)−S(h2)].
它满足 CT=−C,因此 νTCν=0。例如质心原点、M=diag(mI,IG) 时,第一块 −S(mv)ω=mω×v,正是转动坐标描述平动产生的项。刚体和附加质量可分别构造相应耦合项,但含海流时必须注意它们使用的速度不同。
这并不意味着耦合项“不重要”。它不改变总动能,却会改变各轴的速度和所需力矩;忽略它可能导致转弯时显著误差。
4. 阻力和恢复力的符号从物理得到
单轴线性加二次阻力写成
FD=−d1vr−d2∣vr∣vr,d1≥0,d2≥0.
FDvr=−d1vr2−d2∣vr∣3≤0,说明阻力相对水耗能。d1 单位 N·s/m,d2 单位 N·s²/m²。若误写成 −d2vr2,倒退时力仍向后,反而越阻越快。
六轴常用 D(νr)νr 表示阻力的负号搬到方程左侧后的量。对角模型只是起点;非对称艇可能需要交叉项,仍应检查耗散条件。
重力大小 W=mg0,浮力大小 Bf=ρg0V;V 为排水体积,ρ 为水密度。NED 中竖直向下单位向量 e3=[0,0,1]T。机体系实际静水力与力矩为
fhb=RT(W−Bf)e3,
μhb=rG×(RTWe3)+rB×(−RTBfe3).
这里 rB 是浮心相对原点的位置。把实际静水作用搬到方程左侧,定义 g(η)=−[fhb;μhb],便不必背一个很长的三角函数表,也不会把浮力方向写反。中性浮力 W=Bf 不代表没有恢复力矩:质心与浮心分离仍可产生姿态恢复作用。
5. 海流绝不能只在最后随便加一个常数力
设环境流在导航系中为均匀常向量 vcn,无旋转流分量,则机体系流速为 vcb=RTvcn。即使世界中的流恒定,艇转向时机体系分量仍变化:
v˙cb=−ω×vcb.
定义 νc=[vcb;0],νr=ν−νc。一个常用六自由度结构是
MRBν˙+CRB(ν)ν+MAν˙r+CA(νr)νr+D(νr)νr+g(η)=τ+τext.
刚体项描述艇相对惯性空间的运动,流体项依赖相对水运动。不能把所有 ν 无条件换成 νr,也不能忘掉 ν˙c。 对均匀无旋流和合适的 Coriolis 参数化可进一步化简,但需先验证假设。Fossen 的官方海洋载体模型给出了相应完整结构与相对运动条件。
用于固定航向、低速单轴悬停时,可以把部分未建模流作用集总成缓变外力。这是控制设计近似,不意味着海流物理上总是常力。
6. 八推进器的模型必须包含“力能否实现”
第 i 个推进器安装位置为 ri(m),正推方向单位向量为 di,其推力 fi 用 N。它产生的广义力为
τi=[diri×di]fi.
将八列并排构成 BT∈R6×8(与推进器分配课的 Bτ 是同类几何映射,数值仍由实际布局决定),则 τ=BTf。前面三行是方向余弦,后面三行是力臂;两部分元素的量纲不同。
检查 rank(BT)=6 才能说明线性代数意义上六轴都有施力方向。还必须检查推力上下限、正反推不对称、变化率和供电约束。即使满秩,给定大力矩也可能无解。
若实际输入是归一化指令 ai∈[−1,1],还需标定 fi=γi(ai),它可能有死区、正反向不同曲线;动态过程可近似 Tif˙i+fi=γi(ai)。控制器请求的是 τ,混控接收的是 ai,中间至少隔着分配和执行器两层。
针对水平 22.5∘ 布局,应从实际 ri,di 构造列,而不是将所有经验系数称为惯量。项目中的经验水平映射 Gxy、物理惯量 M、几何分配 BT 是三个不同对象,不能混用。
7. 如何从模型得到一个能设计的悬停轴
以固定姿态附近的一个水平轴为例。把线性阻力和等效惯量保留,把缓变未建模作用写成外力 d:
p˙=v,mev˙=−bv+u+d.
这里 u 是实际轴向力,非杆量;me 含刚体和附加质量,b≥0。若外扰平衡值为 d0,平衡输入应为 u0=−d0。悬停并不保证零推力。
在 x=[p,v]T 上,
A=[001−b/me],B=[01/me].
这个模型已经线性;若保留二次阻力 d2∣v∣v,在工作速度 v0 附近的斜率是 2d2∣v0∣。零速时纯二次阻力的一阶斜率为零,不能凭直觉在零速模型里填一个任意线性阻尼。
用真实数字做一次极点配置
取教学参数 me=20 kg、b=10 N·s/m。位置目标固定为 pd,控制为
u=−kp(p−pd)−kvv−d^.
其中 u 是轴向力。选目标自然频率 ωn=1 rad/s、阻尼比 ζ=0.8。先令扰动补偿准确,则闭环误差满足
mee¨+(b+kv)e˙+kpe=0.
与 e¨+2ζωne˙+ωn2e=0 比较,得到
kp=meωn2=20 N/m,kv=2meζωn−b=22 Ns/m.
闭环极点为 −0.8±0.6j s⁻¹。增益来自目标响应和物理参数,而不是两次试车碰运气。若不补偿恒定 d=4 N,稳态位置误差为 e∞=d/kp=0.2 m;提高比例会减小它,却增加力需求,不能等同于估计并消除扰动。
8. 为什么要设计偏置观测器
把 d 作为缓变状态,先用 d˙=0 的教学模型;测量选速度 y=v+n。对 z=[v,d]T,
z˙=Aoz+Bou,Ao=[−b/me01/me0],Bo=[1/me0],Co=[1,0].
观测器为 z^˙=Aoz^+Bou+L(y−Coz^)。为什么这一结构合理?前半预测力能造成多大加速度,后半用实测速度与预测速度的差修正;若速度持续比预测快,说明存在遗漏的正向作用。
取 L=[lv,ld]T。观测误差矩阵特征多项式为
s2+(b/me+lv)s+ld/me.
若希望两个观测误差极点都在 −λo,系数比较得
lv=2λo−b/me,ld=meλo2.
令 λo=3 s⁻¹,得到 lv=5.5 s⁻¹、ld=180 N/m。第二个增益乘速度残差后产生 N/s 的扰动力变化率。较快观测器不一定更好:噪声、延迟、未建模执行器会限制带宽。还要用实际实现的力做输入,而非未实现的饱和前指令,否则观测器会把执行器饱和误认成环境扰动。
可观测性矩阵为 [Co;CoAo]=[[1,0],[−b/me,1/me]],有限正 me 时满秩,因此此理想单轴模型中速度历史能区分 v,d。它不意味着仅靠 DVL 就能确定全局绝对位置,也不意味着所有六轴环境状态都可辨。
9. LQR 与手工极点配置是什么关系
极点配置先指定误差收敛速度;LQR 则先说明“状态偏差和控制努力如何权衡”。本节为简洁,将偏差状态 x~=[p−pd,v]T 和偏差输入 u~=u−u0 临时记作 x,u;若已知恒定外扰 d0,则 u0=−d0,最终实际力必须加回 u0。下面的代价不是把非零目标位置和必要的平衡推力都惩罚到零。在线性局部偏差模型中定义
J=∫0∞(xTQcx+uTRcu)dt,Qc⪰0, Rc≻0.
这里 Qc,Rc 是控制代价权重,不是卡尔曼滤波的过程/测量噪声协方差。位置和速度量纲不同,应按允许尺度归一化;例如 Qc=diag(1/pscale2,1/vscale2),Rc=1/uscale2,只是一个可解释的起点。
设最优剩余代价为 V=xTPx,其中 P=PT。对线性系统 x˙=Ax+Bu,连续时间 Bellman 最优性条件写为
0=umin[xTQcx+uTRcu+2xTP(Ax+Bu)].
这里 2Px 是 V 对状态的梯度,最后一项是沿系统运动的代价变化率。固定当前 x,只对输入 u 求导:
2Rcu+2BTPx=0,u∗=−Rc−1BTPx.
由于 Rc≻0,这一步关于 u 的二次型严格凸,驻点是最小值。代回后,控制相关两项合成 −xTPBRc−1BTPx;又因 xTPAx 是标量,等于其转置 xTATPx,可把全部项收成 x 的二次型。对所有状态成立,才得到
ATP+PA−PBRc−1BTP+Qc=0.
在可稳定、适当可检测等条件下,取稳定化解得到 K=Rc−1BTP。随后还要检验力限幅、采样周期和模型误差。LQR 不是自动处理所有约束的算法;约束直接参与优化时要进入 MPC 等框架。公式背景可对照 MIT Underactuated Robotics 的 LQR 章节。
10. 稳定性、抗扰与可实现性要分开验收
对理想 PD 单轴、d^=d,取
V=21mev2+21kpe2,V˙=−(b+kv)v2≤0.
最大不变集中 v=0 且 v˙=−kpe/me=0,因此 e=0。若 d~=d−d^ 非零,则
V˙=−(b+kv)v2+vd~.
后者可能瞬间为正,不能继续用原来的证明声称“任意扰动下都收敛到零”。对有界扰动估计误差可进一步推导有界性;线性观测器与状态反馈在精确连续模型下可使用分离原理分析,但饱和、非线性、延迟会破坏直接套用的条件。
如果可用推力只有 3 N,而恒定外扰为 4 N,任何上述控制器都不能实现精确静止。此时需要报告不可实现、降低任务要求或改变构型,而不是继续增加增益。
11. C++ 实验:误差从哪里来,补偿是否有效
完成以下三种实验:无扰动 PD;4 N 扰动无补偿;相同扰动加偏置观测器。比较后两者稳态位置,不要只看短暂峰值。下面代码采用小步长显式 Euler,只是教学离散化;工程中应检验采样稳定性和积分精度。
展开可独立编译的 C++17 实验与断言
#include <cmath>
#include <cassert>
#include <iostream>
struct Result { double p,v,dhat; };
Result simulate(double disturbance,bool compensate) {
constexpr double dt=0.001,m=20,b=10,kp=20,kv=22;
double p=0.7,v=0,vhat=0,dhat=0;
for(int k=0;k<30000;++k) {
const double u=-kp*p-kv*v-(compensate?dhat:0.0);
const double innovation=v-vhat;
const double vhat_dot=(-b*vhat+u+dhat)/m+5.5*innovation;
const double dhat_dot=180.0*innovation;
const double a=(-b*v+u+disturbance)/m;
p+=dt*v; v+=dt*a;
vhat+=dt*vhat_dot; dhat+=dt*dhat_dot;
}
return {p,v,dhat};
}
int main() {
auto no_dist=simulate(0,false), pd=simulate(4,false), dob=simulate(4,true);
assert(std::abs(no_dist.p)<1e-6);
assert(std::abs(pd.p-0.2)<1e-6);
assert(std::abs(dob.p)<1e-6 && std::abs(dob.dhat-4)<1e-6);
std::cout<<no_dist.p<<" "<<pd.p<<" "<<dob.p<<" "<<dob.dhat<<"\n";
}
代码可读取真值速度,只是为了隔离观测器模型原理;接入真实传感器时替换为有时间戳的测量,并加入噪声、缺测和执行器限制。不要把这里的理想结果当成实机指标。接着复用第五章观测器实验与仿真步骤加入多种工况。
12. 一次完整设计实际要交付什么
- 画出控制边界:传感器、估计器、控制器、分配器、执行器、物理对象。
- 固定坐标、输入单位、正方向和采样时刻。
- 从质量/几何与实验得到第一版模型,保留参数不确定范围。
- 选择工作点并求平衡输入,再线性化;明确局部有效范围。
- 检查可控性/可稳定性、可观测性/可检测性;选择真的可估计的状态。
- 推导反馈和观测器,并写清稳定性证明的假设。
- 用独立测试数据检查模型残差;在仿真中逐项加入参数误差、噪声、延迟、失效和限幅。
- 最后才将控制输出接入实际接口,核对分配后是否真正产生需求广义力。
本课六自由度结构参考 Fossen 作者模型,具体单轴参数、控制/观测器设计与 C++ 实验为独立教学构造。它的价值是让你能解释“为什么这样选模型、为什么这样设计”,而不是把一个控制器名字放进简历。