【UAV】【倾斜旋翼六旋翼飞行器】激活多体系统动力学的重力补偿和最优控制研究(Matlab代码实现)

  💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

2.1 六旋翼无人机离散

2.2 三自由度机械臂连续

2.3 三自由度机械臂离散

🎉3 参考文献

🌈4 Matlab代码、文章下载


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥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]。

📚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 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、文章下载

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UAV(无人机)计算任务是指一种利用无人机进行计算和数据处理的任务。为了实现这种任务,需要为无人机编写相应的代码。其中MATLAB(Matrix Laboratory)是一种常用的数学软件,也是用于编写科学工程方面的代码的一种高级语言。因此,对于UAV计算任务而言,MATLAB代码扮演着重要的角色。 然而,由于无人机的计算资源和存储资源有限,不能直接在无人机芯片中运行MATLAB脚本。因此,需要将MATLAB代码转换成适用于无人机的格式,通常是C/C++代码。这个过程叫作卸载(offloading)。 卸载MATLAB代码的过程可以通过以下几个步骤完成:首先,需要将MATLAB代码中的特定函数和语法转换成C/C++语言的等效物。其次,需要使用特定的编译器将这些代码编译成适用于无人机的格式。最后,将编译后的代码传输到无人机,以便无人机能够运行这些代码。 卸载MATLAB代码有以下优点:首先,无人机可以利用MATLAB强大的计算功能和数据处理能力,实现更复杂的计算任务。其次,卸载MATLAB代码还可以使无人机更加高效,因为编写C/C++代码比起编写MATLAB代码更加高效,更容易优化。最后,卸载MATLAB代码还可以减少代码占用的存储空间,从而在无人机上存储更多信息。 总之,卸载MATLAB代码实现UAV计算任务的重要步骤之一,它可以提高无人机的计算能力、减少存储空间占用,并使代码更加高效和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值