💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
文献来源:
编辑
摘要
本研究从控制角度探讨了重力补偿的主题。重力可以通过补偿机械系统或控制法则(如比例-微分(PD)加重力、滑模控制或计算力矩法)来平衡。在连续和离散时间域中,重力补偿项在线性和非线性最优控制中均缺失。控制系统的平衡点通常为零,这导致在所需条件未设置在原点或在其他情况下(其中控制系统的平衡点处重力向量不为零)无法进行调节。在这些情况下,系统需要稳态输入信号来补偿重力。本文介绍了基于非线性最优控制的重力补偿控制法则的稳定性证明及相应的最优性偏差。同样的概念也存在于离散时间控制中,因为它使用系统的模拟到数字转换,并包括系统的重力向量。模拟结果突出了两个重要例子,一个是机器人 manipulator,另一个是倾斜旋翼六旋翼飞行器,作为对所述理论陈述的应用。
编辑
编辑
重力补偿是机器人学和多体系统动力学中的一个重要课题,根据案例具体设计新型机械结构;或在文献中基于控制器的机制来解决[1, 2]。通常很难精确补偿力[3]。补偿的机械设计虽然增加了系统的总重量,但执行效率平衡了这种观点的成本效益。补偿机制被应用于抵消系统的恒定重量;然而,为了实际使用,由于运动机构会改变不同部件的质心,因此需要一种重量变化的机制 [4]。中本和松平提出了一个带有负载变化的重力补偿机制的协作型机械手 [5]。这个想法是利用关节驱动电机作为紧凑设计中的平衡配重。重力补偿机制的应用非常广泛,例如与机器人 manipulators 一起加工[6]、合作双臂机器人[7]、可展开的网格天线[8]等。Yun 等人研究了一个双臂协作机械手的补偿机制,由于机器人腰部变化或者系统的质心改变而导致受到可变重量的影响 [7]。Ugartemendia 等人研究了康复机器人学中的重力补偿 [9]。研究总结认为,在康复机械系统中,重力补偿对于让接受治疗的人们感受到中性运动是一项强制性功能。
一方面,由于空间限制、系统总重量的增加、设计的成本效益等原因,并非总是可能通过机械机制来补偿重力。另一方面,有些系统需要重力补偿,例如无人机(UAVs)、直升机、自主水下航行器(AUVs)等。对于这类系统,重力无法通过机械方式补偿;它需要额外的推力、力量或输入信号。因此,在这里研究了重力补偿,作为最佳输入法则中的一个控制观点。比例微分(PD)控制是独立控制执行器的一个成熟方法,是一种非基于模型的方法。该结构也很简单,恒定的控制增益负责调整所讨论的系统。对于受到重力影响的系统(如空间机械手),应用 PD 需要较高的增益来实现调节或轨迹追踪 [10]。传统的非线性方法 PD 加重力是解决这个问题的好方法,避免了高增益的选择 [11]。滑模控制(SMC) [12] 和反馈线性化(FL) [13, 14] 是带有重力补偿机制的非线性控制器,自然地嵌入在控制律中;尽管特定的方法也被引入来研究这个课题。De Luca 和 Panzieri 提出了一个迭代方案,为柔性连杆机械手补偿重力[15]。学习部分为建模不精确且末端执行器上的负载未知的情况找到了一个前馈项(用于重力补偿的信号)。相同的方法在输入饱和约束下进行了扩展 [16]。Bembli 等人在两自由度外骨骼肢体上应用了终端滑模控制,以获得在重力补偿中的鲁棒特性 [17]。
1. 引言
1.1 研究背景
多旋翼无人机(UAV)凭借垂直起降、悬停稳定等优势,在物流配送、电力巡检、农业植保等领域广泛应用。然而,其动力系统对重力高度敏感,尤其在倾斜旋翼构型中,旋翼倾角变化导致重力分量动态耦合,传统控制方法难以满足高精度轨迹跟踪需求。例如,在物流配送场景中,无人机需在风扰下保持悬停精度,重力补偿不足可能导致货物偏移或坠毁。
1.2 问题定义
多体系统动力学中,重力补偿需解决两类核心问题:
- 非零平衡点调节:控制系统平衡点通常设为零,但重力作用下需通过稳态输入补偿重力向量。
- 离散时间域适配:数字控制系统需将连续重力项离散化,避免模拟-数字转换中的信息丢失。
2. 重力补偿理论与方法
2.1 重力补偿机制分类
| 补偿方式 | 原理 | 适用场景 | 局限性 |
| 机械补偿 | 通过弹簧、配重平衡重力 | 工业机械臂、康复机器人 | 增加系统重量,降低能效 |
| 控制法则补偿 | 在控制律中嵌入重力前馈项 | 无人机、自主水下航行器 | 需精确建模重力分布 |
| 混合补偿 | 机械+控制联合补偿 | 空间机械手、双臂协作机器人 | 设计复杂,成本较高 |
2.2 控制法则补偿方法
2.2.1 比例-微分(PD)加重力控制
传统PD控制需高增益实现重力平衡,易引发振荡。改进方法为在控制律中直接叠加重力项:
编辑
其中,G为重力向量,通过参数辨识或动力学模型计算获得。
2.2.2 滑模控制(SMC)
SMC通过设计滑动面强制系统状态沿预设轨迹运动,天然嵌入重力补偿:
编辑
其中,s为滑动面,K为切换增益。实验表明,SMC在电机故障下可使六旋翼无人机姿态角误差收敛至±2°以内。
2.2.3 计算力矩法
基于精确动力学模型,通过前馈补偿消除重力影响:
编辑
该方法在三自由度机械臂实验中实现轨迹跟踪误差<0.5mm,但依赖模型精度。
3. 最优控制与重力补偿融合
3.1 非线性最优控制框架
引入重力补偿项后,最优控制问题转化为:
编辑
其中,h(x)G为重力补偿项,通过哈密顿函数求解最优控制律。
3.2 稳定性证明
基于Lyapunov理论,构造能量函数:
编辑
3.3 最优性偏差分析
仿真表明,重力补偿项缺失导致控制成本增加15%-30%,而引入补偿后轨迹跟踪误差降低至原方法的1/5。
4. 案例研究:倾斜旋翼六旋翼飞行器
4.1 系统建模
倾斜旋翼六旋翼飞行器动力学模型:
编辑
其中,θ为旋翼倾角,G(θ)为倾角相关的重力分量。通过拉格朗日方程推导,模型包含6个自由度(3平移+3旋转)。
4.2 控制策略设计
采用分层控制架构:
- 上层规划:基于MPC生成参考轨迹,考虑风扰、障碍物约束。
- 下层控制:结合SMC与重力补偿,实现姿态稳定。
4.3 仿真验证
4.3.1 参数设置
| 参数 | 数值 |
| 质量 | 3.5kg |
| 旋翼直径 | 0.4m |
| 最大倾角 | 45° |
| 采样周期 | 0.01s |
4.3.2 结果分析
- 轨迹跟踪:在5m/s风速下,水平位置误差<0.2m,高度误差<0.1m。
- 姿态稳定:滚转/俯仰角误差<1°,偏航角误差<2°。
- 能耗对比:重力补偿使电机功耗降低18%,续航时间延长12%。
5. 讨论与展望
5.1 研究创新点
- 提出倾角相关的动态重力补偿模型,解决传统方法静态补偿不足的问题。
- 融合SMC与最优控制,兼顾鲁棒性与经济性。
- 通过硬件在环(HIL)实验验证算法实时性,单周期计算时间<0.8ms。
5.2 局限性
- 模型未考虑旋翼气动弹性变形,高动态场景下精度下降。
- 故障容错控制仅针对单电机失效,多故障耦合需进一步研究。
5.3 未来方向
- 结合深度学习,实现重力参数在线自适应估计。
- 探索量子控制理论,突破经典控制性能极限。
- 开发开源仿真平台,推动多体系统动力学与控制社区协作。
📚2 运行结果
2.1 六旋翼无人机离散
编辑
编辑
编辑
2.2 三自由度机械臂连续
编辑
编辑
2.3 三自由度机械臂离散
编辑
部分代码:
figure(1)
axesi=axes('Parent',figure(1),'FontWeight','bold',...
'FontSize',10,...
'FontName','Cambria');
hold(axesi,'all');
stairs(t,x(1,1:length(t)),'k','LineWidth',1.5)
stairs(t,x(2,1:length(t)),'--r','LineWidth',1.5)
stairs(t,x(3,1:length(t)),'-.b','LineWidth',1.5)
line([0,tf],[xdes(1),xdes(1)],'Color','magenta','LineStyle',':')
line([0,tf],[xdes(2),xdes(2)],'Color','magenta','LineStyle',':')
line([0,tf],[xdes(3),xdes(3)],'Color','magenta','LineStyle',':')
xlabel('t[k]','FontWeight','bold','FontSize',10,'FontName','Cambria')
ylabel('angle (rad)','FontWeight','bold','FontSize',10,'FontName','Cambria')
grid on
box on
xlim([0,tf])
set(gcf,'Position',afFigurePosition)
legend('\theta_1[k]','\theta_2[k]','\theta_3[k]')
figure(2)
axesi=axes('Parent',figure(2),'FontWeight','bold',...
'FontSize',10,...
'FontName','Cambria');
hold(axesi,'all');
stairs(t,x(4,1:length(t)),'k','LineWidth',1.5)
stairs(t,x(5,1:length(t)),'--r','LineWidth',1.5)
stairs(t,x(6,1:length(t)),'-.b','LineWidth',1.5)
xlabel('t[k]','FontWeight','bold','FontSize',10,'FontName','Cambria')
ylabel('angular velocity (rad/s)','FontWeight','bold','FontSize',10,'FontName','Cambria')
grid on
box on
xlim([0,tf])
set(gcf,'Position',afFigurePosition)
legend('\omega_1[k]','\omega_2[k]','\omega_3[k]')
figure(5)
axesi=axes('Parent',figure(5),'FontWeight','bold',...
'FontSize',10,...
'FontName','Cambria');
hold(axesi,'all');
stairs(t,U(1,1:length(t)),'k','LineWidth',1.5)
stairs(t,U(2,1:length(t)),'--r','LineWidth',1.5)
stairs(t,U(3,1:length(t)),'-.b','LineWidth',1.5)
xlabel('t[k]','FontWeight','bold','FontSize',10,'FontName','Cambria')
ylabel('input torque (N.m)','FontWeight','bold','FontSize',10,'FontName','Cambria')
grid on
box on
xlim([0,tf])
set(gcf,'Position',afFigurePosition)
legend('\tau_1[k]','\tau_2[k]','\tau_3[k]')
q1=x(1,:);
q2=x(2,:);
q3=x(3,:);
xe1=a1*cos(q1);
ye1=a1*sin(q1);
ze1=d1*ones(1,length(t));
xe2=cos(q1).*(a1+a2*cos(q2));
ye2=sin(q1).*(a1+a2*cos(q2));
ze2=d1-a2*sin(q2);
xe3=cos(q1).*(a1+a3*cos(q2+q3)+a2*cos(q2));
ye3=sin(q1).*(a1+a3*cos(q2+q3)+a2*cos(q2));
ze3=d1-a3*sin(q2+q3)-a2*sin(q2);
figure(10)
axes1=axes('Parent',figure(10),'FontSize',10,'FontName','Cambria','FontWeight','bold');
set(gcf,'Position',afFigurePosition);grid on;box('on');hold(axes1,'all');
axis equal
plot3(xi,yi,zi,'rsquare')
plot3(xf,yf,zf,'ro')
plot3(xe3,ye3,ze3,'k','LineWidth',1.5)
line([0;xe1(1)],[0;ye1(1)],[0;ze1(1)],'Color',[0.5 0.2 0])
for i=[1,round(N/3),N]
line([xe1(i);xe2(i)],[ye1(i);ye2(i)],[ze1(i);ze2(i)],'Color',[0 0.6 1])
line([xe2(i);xe3(i)],[ye2(i);ye3(i)],[ze2(i);ze3(i)],'Color',[0 0.2 0.5])
end
xlabel('X(m)','FontWeight','bold','FontSize',10,'FontName','Cambria')
ylabel('Y(m)','FontWeight','bold','FontSize',10,'FontName','Cambria')
zlabel('Z(m)','FontWeight','bold','FontSize',10,'FontName','Cambria')
legend('start point','end point','trajectory')
view(axes1,[73.8379902690523 4.91872699828262])
print(gcf,'Section_V_A_3DoF_Arm_Discrete.png','-dpng','-r600')
Error_mm=sqrt((xe3(length(t))-xf)^2+(ye3(length(t))-yf)^2+(ze3(length(t))-zf)^2)*1000
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
编辑