基于测距的机载相对定位技术用于室内编队飞行的微型飞行器研究(Matlab代码实现)

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

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

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

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

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献 

🌈4 Matlab代码、文章下载


 ⛳️赠与读者

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

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

💥1 概述

摘要
我们提出了一种基于测距的室内相对定位解决方案,适用于微型飞行器(MAVs),能够实现编队飞行所需的足够精度。与以往的研究相比,我们去除了微型飞行器对共同航向测量的依赖,使相对定位精度不再依赖于磁力计读数。我们发现,这一改进限制了保证可观测性的相对机动动作,并且需要更高精度的测距来弥补缺失的航向信息,但这两个问题都可以解决。我们的实现采用了超宽带(UWB)技术,用于微型飞行器之间的测距以及共享它们的速度、加速度、偏航率和高度信息。我们在三架Parrot Bebop 2.0微型飞行器上展示了我们的实现,并在真实室内环境中进行了编队飞行。跟随的微型飞行器完全自主,仅使用机载传感器来跟踪领导者相同的轨迹,并且能够在整个飞行过程中紧密跟随领导者微型飞行器。
关键词 相对定位 · 编队飞行 · 微型飞行器 · 自主飞行 · 室内

为了提高微型飞行器(MAV)定位方案的适用性,飞行器应使用机载传感器来确定相邻飞行器的位置。通常,基于视觉的方法被广泛应用,例如:基于机载摄像头的系统,或红外传感器系统。这些系统的一个缺点是视野有限。可以通过构建传感器阵列或主动跟踪相邻飞行器来解决这一问题,但前者会增加重量负担,后者则会严重限制飞行器的运动自由度和可扩展性。因此,这些方案对于微型飞行器来说都不是理想的解决方案。一种全向传感器将更具优势,例如无线射频收发器。Guo等人(2017)最近实现了一种基于超宽带(UWB)无线电的系统。通过将测距数据与每个飞行器的位移信息融合,可以估计飞行器之间的相对位置。然而,该方法要求每个飞行器必须跟踪其相对于初始发射点的位移。如果通过机载传感器(例如,通过积分速度)获得此测量值,则该测量值可能会随时间漂移。

另一种方法是Coppola等人(2018)展示的一种基于蓝牙的相对定位方法。该方法不是使用位移信息,而是通过飞行器之间通信速度、方向和高度,并使用信号强度作为测距测量。尽管基于测距的解决方案前景广阔,但Coppola等人(2018)和Guo等人(2017)的方法的一个缺点是飞行器需要知道一个共同的参考框架方向。通常通过磁力计测量飞行器相对于北方的航向来建立这一方向,但磁力计容易受到局部磁场干扰。在室内环境中,干扰可能高达80°。在室内环境中建立可靠的北方方向是一个众所周知的难题。解决方案包括使用互补滤波器或冗余磁传感器来补偿局部干扰。然而,从理论上讲,对于基于测距的相对定位,共同参考框架并不是必需的。

本文的主要贡献是分析了在基于测距的相对定位中去除航向依赖的后果,从而开发并实现了一种适用于全机载室内编队飞行的无航向依赖的相对定位和跟踪方法。通过正式的可观测性分析和极限情况仿真,我们提供了分析支持。与Zhou和Roumeliotis(2008)以及Martinelli和Siegwart(2005)的工作不同,我们的分析还考虑了加速度信息的包含,因为飞行器通常可以从其惯性测量单元(IMU)中获取这些信息。此外,我们的分析特别关注去除航向依赖对相对定位滤波器性能的影响,以及飞行器为保证滤波器可观测性可以执行的相对机动动作。可观测性分析将表明,编队飞行任务对于基于测距的相对定位方法来说尤其困难,因为它不允许飞行器沿平行轨迹飞行。然后,我们利用这些见解开发并实现了一种无航向依赖的编队飞行系统,该系统可以在室内自主飞行的微型飞行器上使用。飞行器仅依赖机载传感器,使用UWB进行通信和相对测距。

本文的研究表明,在微型飞行器(MAV)上实现无航向依赖的基于测距的相对定位是可行的。我们已经了解到,去除MAV之间共同航向的依赖有两个主要缺点:为了实现可观测性,飞行器的运动必须满足更严格的条件,且相对定位对测距噪声更加敏感。然而,明显的优点是,滤波器不再受地球磁场局部干扰的影响。正如我们的仿真所示,微小的磁场干扰就可能导致较大的负面影响,这表明无航向依赖的方法实际上可能比有航向依赖的方法表现更好。

我们的可观测性分析结果表明,当使用所提出的相对定位方法时,编队飞行是一项艰巨的任务,简单的固定几何形状编队飞行是不可能实现的。相反,我们需要开发一种方法,允许一架MAV在领导者沿曲线轨迹飞行时,以一定的时间延迟跟随另一架MAV的轨迹。这种方法已被证明能够有效避免不可观测条件,从而使我们在实践中成功地展示了编队飞行。

仅使用机载传感器信息,一架MAV可以在200秒的编队飞行中将另一架MAV定位,平均误差仅为22.6厘米。这使得MAV能够以50.8厘米的平均误差跟踪另一架MAV的轨迹。该方法还被证明可以支持两架跟随者跟踪同一领导者。

在更广泛的背景下,这项工作展示了相对定位与机器人团队(或群体)行为之间的基本联系。我们已经证明,在设计机器人的行为时,必须考虑可观测性分析中包含的约束条件。这使得机器人能够更好地利用其传感器,从而实现更好的最终性能。例如,在我们的案例中,从可观测性分析中提取的直观条件告诉我们,编队飞行行为不应使MAV以固定几何形状飞行。一般来说,提取这样的直观条件可以帮助群体设计者在更高层次上理解,如何设计单个机器人的行为,以使其与相对定位传感器相协调。

📚2 运行结果

部分代码:

%% Initialize
init;
printfigs = false;

%% Select random seed
% Use the following to reproduce...
% rngnum = 13 -- Fig 3c + 4e
% rngnum = 17 -- Fig 3d + 4f
rngnum = 13;
rng(rngnum);

% Other seeds and expected results
% 6 - clear plot, parallel, nice but full heat map
% 7 - clear plot, v2 almost 0, circular heat map
% 8 - clear plot, very clear heat map
% 9 - clear plot, clear heat map, accelerations almost parallel
% 23 - clear plot, not parallel, semi clear heat map

%% Analyze
n = 7;
l = 6;
leg1loc = 'best';
leg2loc = 'best';
fontsize = 19;
if rngnum == 13
    leg2loc = 'southwest';
elseif rngnum == 17
    leg2loc ='northwest';
end

v1range = 5;
v2range = 5;
prange  = 5;
a1range = 5;
a2range = 5;
r1range = 3;
r2range = 3;
randrangestate = [-prange prange;
    -prange prange;
    0 2*pi;
    -v1range v1range;
    -v1range v1range;
    -v2range v2range;
    -v2range v2range;];
randrangeinput = [-a1range a1range;
    -a1range a1range;
    -a2range a2range;
    -a2range a2range;
    -r1range r1range;
    -r2range r2range;];

drawstate = randrangestate(:,1) + (randrangestate(:,2)-randrangestate(:,1)).* rand(n,1);
drawinput = randrangeinput(:,1) + (randrangeinput(:,2)-randrangeinput(:,1)).* rand(l,1);

[x,fval] = giveUnobservable(drawstate,drawinput);

state = x(1:n);
input = x(n+1:n+l);
p = state(1:2);
dpsi = state(3);
v1 = state(4:5);
v2 = state(6:7);
a1 = input(1:2);
a2 = input(3:4);
r1 = state(5);
r2 = state(6);
Rm = [cos(dpsi) -sin(dpsi);
    sin(dpsi) cos(dpsi);];
v2rot = Rm*v2;
a2rot = Rm*a2;

axcomp = [[0; 0] p v1 p+v2rot a1 p+a2rot];
axmins = min(axcomp,[],2);
axmins = floor(axmins-1);
axmaxs = max(axcomp,[],2);
axmaxs = ceil(axmaxs);

atipangle = 30;
alength = 15;
awidth = 2;
dronewidth = 5;

p1 = [0;0];
p2 = p;

%% Make figures
file = strcat('figures/cond_vectplot',num2str(rngnum),'.eps');

h = figure;
set(gcf,'units','pixels','Position',[500,300,500,550]);
set(gca,'XTick',axmins(1):axmaxs(1),'YTick',axmins(2):axmaxs(2),'FontSize',fontsize,'FontUnits','points','FontWeight','normal','FontName','Times');
colors = get(gca,'ColorOrder');
hold on;
grid on;
axis([axmins(1) axmaxs(1) axmins(2) axmaxs(2)]);

h1=arrow(p1,p2,'color',colors(3,:),'tipangle',atipangle,'length',alength,'width',awidth);
h2=arrow(p1,v1,'color',colors(4,:),'tipangle',atipangle,'length',alength,'width',awidth);
h3=arrow(p2,p2+v2rot,'color',colors(5,:),'tipangle',atipangle,'length',alength,'width',awidth);
h4=arrow(p1,a1,'color',colors(6,:),'tipangle',atipangle,'length',alength,'width',awidth);
h5=arrow(p2,p2+a2rot,'color',colors(7,:),'tipangle',atipangle,'length',alength,'width',awidth);
h6=plot(0,0,'o','linewidth',dronewidth,'color',colors(1,:));
h7=plot(p(1),p(2),'o','linewidth',dronewidth,'color',colors(2,:));
leg1= legend([h6,h7,h1,h2,h3,h4,h5],'drone 1','drone 2','$\mathbf{p}$','$\mathbf{v1}$','$\mathbf{v2}$','$\mathbf{a1}$','$\mathbf{a2}$','location',leg1loc);
xlabel('x','FontUnits','points','interpreter','latex','FontSize',fontsize,'FontName','Times');
ylabel('y','FontUnits','points','interpreter','latex','FontWeight','normal','FontSize',fontsize,'FontName','Times');
set(leg1,'Interpreter','latex');
set(leg1,'FontSize',fontsize);
if(printfigs)
    print(file,'-depsc2','-opengl');
end


xrange = 5;
yrange = 5;
dx = 0.03;
dy = 0.03;
dxtick = 2;
dytick = 2;

v1./v2rot
p

threshold = 1;
[X,Y,Z,Zcrit,xarr,yarr] = getHeatCond(state,input,xrange,yrange,threshold,dx,dy);

file = strcat('figures/cond_heatplot',num2str(rngnum),'.eps');

fontsize = 20;
h = figure('Renderer','painters');
set(gca,'FontSize',fontsize,...
    'FontUnits','points','FontWeight','normal','FontName','Times');
hold on;
axis([min(xarr) max(xarr) min(yarr) max(yarr)]);

surf(X,Y,Z,'EdgeColor','None');
view(2);
set(gca,'TickDir','out');
 

🎉3 参考文献 

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)

🌈Matlab代码、文章下载

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

                                                           在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值