日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

四轴飞行器1.1 Matlab 姿态显示

發(fā)布時(shí)間:2025/6/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四轴飞行器1.1 Matlab 姿态显示 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

四軸飛行器1.1 Matlab 姿態(tài)顯示

?開始做四軸了,一步一步來,東西實(shí)在很多,比較雜。先做matlab上位機(jī),主要用來做數(shù)據(jù)分析,等板子到了可以寫飛控的程序了,從底層一層一層開始寫。。希望能好好的完成它。。。關(guān)于matlab上位機(jī),首先做個(gè)姿態(tài)顯示,然后等板子來了,把板子底層程序?qū)懞煤?#xff0c;加上matlab的串口接收部分,基本的環(huán)境就算搭建好了。。。。

? ?? ???這個(gè)代碼寫了一天,寫到最后出現(xiàn)戲劇性的一幕,實(shí)在是太惡心了哈。。開始自己的想法就是通過輸入pitch roll yaw三個(gè)歐拉角,然后在空間中現(xiàn)實(shí)飛機(jī)的姿態(tài),為了學(xué)習(xí)matlab翻了matlab的書,還看了線性代數(shù),為了畫這個(gè)姿態(tài)圖,看了高中的立體解析幾何,向量運(yùn)算等。。。都是淚啊,說回正題,首先計(jì)算xOy平面中的轉(zhuǎn)動(dòng),也就是yaw軸,這個(gè)相對(duì)比較簡單,讓三角形的三個(gè)點(diǎn)分別在圖中的大圓和小圓上,如圖所示:

yaw解決了之后就需要解決pitch了,就是俯仰角,約定是以坐標(biāo)的(0 0 0)點(diǎn)進(jìn)行旋轉(zhuǎn)的,也是兩個(gè)圓的圓心,所以算pitch只需要在xOz平面內(nèi)計(jì)算,通過sin(pitch)可以算出來A B C三個(gè)點(diǎn)在Z軸上的坐標(biāo)了,這里需要注意下,A點(diǎn)變換后,相對(duì)應(yīng)的X軸變化是cos(pitch),y軸也是,算到這里會(huì)發(fā)現(xiàn)一個(gè)問題,用matlab算B C連個(gè)點(diǎn)的時(shí)候,只需算B或者C,解出來是有兩個(gè)解的,一個(gè)B一個(gè)C,B和C必須分辨清楚,否則在計(jì)算roll的時(shí)候因?yàn)?B C沒有分清楚會(huì)導(dǎo)致roll旋轉(zhuǎn)方向不確定,后面再說B C怎么分辨。
? ?? ???接下來是計(jì)算 roll了,需要計(jì)算B 點(diǎn)和C點(diǎn)在Z軸上的坐標(biāo),因?yàn)槲覀兪抢@著(0 0 0)轉(zhuǎn)的,而不是繞著BC的終點(diǎn)轉(zhuǎn),所以無法通過BC的長度乘以sin(roll)計(jì)算,所以通過圓心做一條直線與BC平行,假設(shè)與AC交與F點(diǎn),

%? ?? ?? ? A

%? ?? ? E??O??F

%? ?B? ?? ?D? ???C
無論pitch和yaw怎么轉(zhuǎn),OF都是在xOy平面的,方便計(jì)算,通過sin(roll)*OF的長度就可以得到F在Z軸的變化,從而通過等比可以的到C在Z軸的變化,B點(diǎn)變化和C是一樣的,方向相反,之后將B C的坐標(biāo)在xOy平面做cos(roll)縮放就可以的到最終的三角形的三個(gè)坐標(biāo)了。
? ?? ? 接著講BC的分辨問題,想來想去只想到一個(gè)比較簡單的方法,我們算出來BC并不知道哪個(gè)是B,哪個(gè)是C,不過我們可以制定一個(gè)B‘ 點(diǎn),那就是我們?nèi)∫粋€(gè)DB方向的方向向量n,跟隨三角形旋轉(zhuǎn),讓它始終指向定義的DB方向,然后可以計(jì)算OB OC分別和向量n的內(nèi)積,因?yàn)閚與OB為銳角,與OB為鈍角,so,n 與OB點(diǎn)乘為負(fù)數(shù),與OC點(diǎn)乘為正數(shù),從而區(qū)分出B點(diǎn)和C點(diǎn) 。
? ?? ???上面想法看起來不錯(cuò),但是怎么讓向量n隨著yaw角轉(zhuǎn)動(dòng)呢,靈機(jī)一閃,線性代數(shù)書的矩陣?yán)锩嬗袀€(gè)旋轉(zhuǎn)矩陣啊,立馬拿過來驗(yàn)證,發(fā)現(xiàn)可以很好的運(yùn)行,然后想到一個(gè)問題,如果某種情況三角形roll為90度,DB的分量在xOy平面為0,這個(gè)方法就無效了啊(其實(shí)這個(gè)問題應(yīng)該不會(huì)出現(xiàn),因?yàn)槲覀兪蔷€計(jì)算yaw 然后計(jì)算pitch,在計(jì)算pitch的時(shí)候分辨BC亮點(diǎn),壓根就還沒開始計(jì)算roll),那用三維旋轉(zhuǎn)矩陣就可以解決這個(gè)問題啊,嗯嗯,又靈機(jī)一閃,之前看過捷聯(lián)慣性導(dǎo)航書上講了方向旋轉(zhuǎn)矩陣啊,應(yīng)該可以用。把方向余弦拿過來計(jì)算一下,和用xOy平面的旋轉(zhuǎn)舉證效果一樣,到此忽然想到一個(gè)非常十分傻逼的事情,媽蛋,三角形三個(gè)點(diǎn)全部用這個(gè)方向余弦矩陣旋轉(zhuǎn)就可以了啊,立馬改程序,不到十分鐘就改完了,程序運(yùn)行良好,都是淚。。。。。。不過自己的算法不能半途而廢啊,后面還是把自己的算法完成,并且也可以很好的運(yùn)行。。。不過因?yàn)橛昧薽atlab的符號(hào)運(yùn)算,速度和用方向余弦計(jì)算比起來慢很多,后面還是用方向余弦算吧。。。。。。。
下面貼代碼:

  • %%
  • %2014.7.19 由 sky.zhou 編寫
  • function DrawAttitude(pitch,roll,yaw)
  • %%
  • %用于顯示飛機(jī)姿態(tài),輸入為pitch,roll,yaw。
  • %自己的2B算法算的太慢了,我勒個(gè)去。。。還是用方向余弦吧
  • mode = 2? ?? ? %標(biāo)記用那種方法進(jìn)行計(jì)算,1:表示用自己寫的2B算法進(jìn)行計(jì)算,2表示用方向余弦矩陣進(jìn)行計(jì)算
  • ? ?
  • %pitch = 60;
  • %roll = 45;
  • %yaw = 35;
  • r1 =3;? ?? ???%大圓半徑
  • r2 = 0.618*r1;? ? %小圓半徑
  • ??
  • if mode == 2
  • ? ???pitch = -pitch;? ?%角度定義不一樣,改一下
  • ? ???roll = -roll;? ???%角度定義方式不一樣,自己習(xí)慣改就好,看你希望是以怎樣的方向轉(zhuǎn)
  • end
  • dc = [cosd(yaw)*cosd(pitch)-sind(yaw)*sind(roll)*sind(pitch)? ?sind(yaw)*cosd(pitch)+cosd(yaw)*sind(roll)*sind(pitch)? ?cosd(roll)*(-sind(pitch));
  • ? ?? ? sind(yaw)*(-cosd(roll))? ?? ?? ?? ?? ?? ?? ?? ???cosd(yaw)*cosd(roll)? ?? ?? ?? ?? ?? ?? ?? ?? ? sind(roll)? ?? ???;
  • ? ?? ? cosd(yaw)*sind(pitch)+sind(yaw)*sind(roll)*cosd(pitch)? ?sind(yaw)*sind(pitch)-cosd(yaw)*sind(roll)*cosd(pitch)? ?? ?cosd(roll)*cosd(pitch) ]
  • %三角形規(guī)約:A為定點(diǎn),B C為兩邊的角,具體方位如下
  • %? ?? ? A
  • %? ???B? ?C
  • t_fpa = 35;? ?? ?%三角形定點(diǎn)角度設(shè)置為40度,fpa On behalf of Fixed point angle
  • t_b = (180 - t_fpa) / 2;
  • t_c = t_b;
  • ??
  • if t_fpa > asind((r2/r1))*2
  • ? ???t_fpa = asind((r2/r1))*2
  • end
  • ??
  • %xd,yd,zd存放真是數(shù)值,與符號(hào)xyz區(qū)分開來
  • %約定 xd yd zd 第 1 2 3 4位分別代表三角形ABC的 A、B、A、C坐標(biāo)
  • if mode == 2
  • ? ? xd=[3 -1.2735;3 -1.2735];
  • ? ? yd=[0??1.3474;0??-1.3474];
  • ? ? zd=[0 0;0 0];
  • ? ? %上面幾個(gè)初始化的點(diǎn)是根據(jù) 定義的。
  • ? ? %pitch = 0;
  • ? ? %roll = 0;
  • ? ? %yaw = 0;
  • ? ? %r1 =3;? ?? ???%大圓半徑
  • ? ? %r2 = 0.618*r1;? ? %小圓半徑
  • else
  • ? ? xd=[];
  • ? ? yd=[];
  • ? ? zd=[];
  • ? ? tempA =[];? ???%保存中間計(jì)算角度,目前之用來保存角BOA
  • end
  • ? ? temp = [];
  • if mode == 2
  • ? ? temp = [xd(1,1) yd(1,1) zd(1,1);
  • ? ?? ?? ?? ?xd(1,2) yd(1,2) zd(1,2);
  • ? ?? ?? ?? ?xd(2,2) yd(2,2) zd(2,2)];
  • ? ? temp = temp*dc;
  • ? ? xd = [temp(1:2,1)';temp(1,1),temp(3,1)]
  • ? ? yd = [temp(1:2,2)';temp(1,2),temp(3,2)]
  • ? ? zd = [temp(1:2,3)';temp(1,3),temp(3,3)]
  • ? ? %到此位置,方向余弦矩陣已經(jīng)計(jì)算完畢,可以直接用后面的函數(shù)進(jìn)行顯示
  • end
  • ??
  • if mode == 1? ?? ?%執(zhí)行自己的2B算法
  • %xs ys zs分別問記錄方程的解 xs 為sysm縮寫
  • syms x y z r xs ys zs;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???%x y z 慣性坐標(biāo)系中三個(gè)正交基,r為xOy平面中的大圓和小圓半徑
  • %定義各點(diǎn)的坐標(biāo)符號(hào)參數(shù)
  • syms xa ya za xb yb zb za zb zc ;
  • ??
  • %%
  • c1 = sym('x^2+y^2 = r^2');? ?? ?? ?? ?? ?? ?? ?? ? %大圓方程
  • c1 = subs(c1,'r',r1)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? %換成實(shí)際數(shù)值
  • ??
  • c2 = sym('x^2+y^2 = r^2');? ?? ?? ?? ?? ?? ?? ?? ? %校園方程,可以表達(dá)為:c2 = 'x^2+y^2 = r^2',效果是一樣的
  • c2 = subs(c2,'r',r2)
  • ??
  • l1 = sym('cosd(yaw)*y=sind(yaw)*x')
  • %l1 = sym('y=tand(yaw)*x')? ?? ?? ?? ?? ?? ?? ?? ? %不用這個(gè)公式是因?yàn)檫@個(gè)公式有零點(diǎn),90和-90無法使用
  • %l1 = subs(l1, 'yaw', yaw)? ?? ?? ?? ?? ?? ?? ?? ? %換成實(shí)際數(shù)值,這里不要轉(zhuǎn)成實(shí)際數(shù)值,為了方便subs的運(yùn)算
  • %%
  • [xs ys] = solve(c1,l1,'x','y')? ?? ?? ?? ?? ?? ?? ?%注意,這里算出來的xd yd是符號(hào)變量,matlab自動(dòng)轉(zhuǎn)換了,下面重新對(duì)其賦值,可以變回?cái)?shù)值變量
  • ? ?
  • %雙百分號(hào)還可以類似于分類的作用,挺好。
  • temp = subs([xs;ys])
  • ??
  • %%
  • %計(jì)算A點(diǎn)坐標(biāo)
  • if yaw > -90 && yaw < 90? ?? ?? ?? ?? ?? ?? ?? ?? ???%判斷角度的范圍,用來選擇在坐標(biāo)中三角形的頂點(diǎn)是正還是負(fù)
  • ? ???%這個(gè)可能有點(diǎn)難理解,角度確定了,就可以知道焦點(diǎn)在x軸的正負(fù),從前兩個(gè)數(shù)值中取對(duì)應(yīng)的X解后,然后取對(duì)應(yīng)的Y的解
  • ? ???temp = temp([temp(1:2)>0;temp(1:2)>0])
  • elseif yaw == -90
  • ? ???temp = [ 0 ;temp(temp<0)]
  • elseif yaw == 90
  • ? ???temp = [ 0 ;temp(temp>0)]
  • else
  • ? ???temp = temp([temp(1:2)<0;temp(1:2)<0])
  • end
  • ??
  • %得到在XOY平面中三角形定點(diǎn)的第一個(gè)解
  • xd = [xd temp(1)]
  • yd = [yd temp(2)]
  • ??
  • %%
  • %計(jì)算B點(diǎn)坐標(biāo)
  • ??
  • %temp計(jì)算出來表示的是 AB段的長度,
  • %? ?? ? A
  • %? ?? ? O
  • %? ? B??D??C
  • %其中 sind(t_b/2)*r2 表示的是OD段的長度,cosd(t_b/2)*r2是BD段的長度,
  • %temp計(jì)算的最終結(jié)果是AB的長度
  • %利用三角形邊與對(duì)面角正弦成比例進(jìn)行運(yùn)算
  • %? ?AB? ???BC? ?? ?? ? A0? ?? ?? ?? ?? ? B0
  • % ----- = -----? ?? ? -----? ???=? ?---------
  • % sin(C)??sin(A)? ???sin(角ABO)? ?? ?sin(角OAB)(ps:A的一半)
  • %? ?可以求出角ABO,然后通過內(nèi)角和可以求出角AOB
  • %? ?AB? ?? ?? ?? ?? ? BO? ?? ?? ?
  • % -----? ?? ? =? ???--------? ?? ?可以求出AB長度,簡化代碼如下? ??
  • % sin(角AOB)? ?? ???sin(角OAB)? ??
  • % (180 - asind((r1/r2)*sind(t_fpa/2)) - (t_fpa/2)) 為角BOA的大小
  • tempA = sym('(180 - asind((r1/r2)*sind(t_fpa/2)) - (t_fpa/2))');
  • temp = sym('(r2/sind(t_fpa/2))*sind(tempA)');
  • tempA = subs(tempA);
  • temp = subs(temp);
  • ??
  • ??
  • %temp = subs(sym('sqrt(((sind(t_b/2)*r2)+r1)^2 + (cosd(t_b/2)*r2)^2)'));
  • ??
  • %假設(shè) 符號(hào) xa ya 為 A點(diǎn)的坐標(biāo),x,y為要求的B點(diǎn)坐標(biāo)
  • temp = subs(sym('(x-xa)^2 + (y-ya)^2 = temp^2'),'temp',temp);
  • %將xa和ya換成數(shù)值xa和ya,嵌套換的
  • temp = subs(subs(temp,'xa',xd(1)),'ya',yd(1))
  • [xs ys] = solve(temp,c2,'x','y')? ??
  • ??
  • %通過下面的計(jì)算就已經(jīng)可以得到 B C的坐標(biāo)了
  • temp = subs([xs;ys])
  • ??
  • %下面需要做的是區(qū)別哪個(gè)點(diǎn)是A,哪個(gè)點(diǎn)是B。
  • %%
  • %? ? 下面是在xOy平面內(nèi)的旋轉(zhuǎn)
  • %? ? B??
  • %? ? D??O??A? ?? ? yaw=0度的時(shí)候三角型在X0Y平面的方位,其中水平位置為x軸豎直方向?yàn)閅軸
  • %? ? C
  • %? ? 取一個(gè)與DB方向一樣的方向向量n(0,1)
  • %? ? 用旋轉(zhuǎn)矩陣讓它跟三角形同步旋轉(zhuǎn)
  • %? ? 因?yàn)閚與OB為銳角,與OB為鈍角,so,n與OB點(diǎn)乘為負(fù)數(shù),與OC點(diǎn)乘為正數(shù),從而區(qū)分出B點(diǎn)和C點(diǎn)
  • %%
  • %? ? 為了避免roll為90度的時(shí)候按照之前的定義方向向量n=(0,0),區(qū)分不出來B和C點(diǎn),所以用方向余弦矩陣進(jìn)行計(jì)算
  • %方向余弦矩陣定義
  • %dc = [cosd(yaw)*cosd(pitch)-sind(yaw)*sind(roll)*sind(pitch)? ?sind(yaw)*cosd(pitch)+cosd(yaw)*sind(roll)*sind(pitch)? ?cosd(roll)*(-sind(pitch));
  • %? ?? ?sind(yaw)*(-cosd(roll))? ?? ?? ?? ?? ?? ?? ?? ???cosd(yaw)*cosd(roll)? ?? ?? ?? ?? ?? ?? ?? ?? ? sind(roll)? ?? ???;
  • %? ?? ?cosd(yaw)*sind(pitch)+sind(yaw)*sind(roll)*cosd(pitch)? ?sind(yaw)*sind(pitch)-cosd(yaw)*sind(roll)*cosd(pitch)? ?? ?cosd(roll)*cosd(pitch) ]
  • %%算到這里的時(shí)候我發(fā)現(xiàn)只要在xOy平面內(nèi)將三角形的初始化坐標(biāo)ABC三個(gè)點(diǎn)輸入后,用方向余弦矩陣算就可以了,然后花了10分鐘不到的時(shí)間就實(shí)現(xiàn)了
  • %不過這里還是決定把這個(gè)方法寫完。。。都是淚。。。。。。。。。。。。。。。。。
  • %%
  • n??= [0??1??0]? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???%方向向量
  • n??= n*dc? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???%對(duì)方向向量進(jìn)行旋轉(zhuǎn)
  • %約定 xd yd zd 第 1 2 3 4位分別代表三角形ABC的 A、B、A、C坐標(biāo)
  • n = n*[temp(1);temp(3);0]
  • if n > 0? ?? ? %說明夾角是銳角,該角是B點(diǎn)
  • ? ???xd = [ xd temp(1) xd temp(2)]
  • ? ???yd = [ yd temp(3) yd temp(4)]
  • else
  • ? ???xd = [ xd temp(2) xd temp(1)]
  • ? ???yd = [ yd temp(4) yd temp(3)]
  • end
  • ??
  • %處理成變成矩陣形式
  • xd = [xd(1:2);xd(3:4)]
  • yd = [yd(1:2);yd(3:4)]
  • ??
  • %當(dāng)存在pitch角度的時(shí)候,X坐標(biāo)做相印調(diào)整
  • xd = xd.*cosd(pitch)
  • yd = yd.*cosd(pitch)
  • ??
  • ??
  • %%
  • %約定 xd yd zd 第 1 2 3 4位分別代表三角形ABC的 A、B、A、C坐標(biāo)
  • %計(jì)算z中A的坐標(biāo),其中B和C是相等的
  • zd = [zd sind(pitch)*r1]
  • ??
  • %下面OD的長度,然后可以計(jì)算出B和C在Z軸上的坐標(biāo),也就是D點(diǎn)的坐標(biāo)
  • od = (sind(tempA - 90)*r2)
  • %zd = [zd temp;zd temp]
  • ??
  • %計(jì)算roll狀態(tài)下B和C的坐標(biāo)
  • %? ?? ?? ? A
  • %? ?? ? E??O??F
  • %? ???B? ? D? ? C
  • %? ? 先計(jì)算在roll下OF的長度,然后算F在Z軸的高度,然后等比后算B和C在Z軸的高度
  • %下面計(jì)算OF的長度
  • l2 = tand(t_fpa/2)*r1
  • %下面計(jì)算F在Z軸上的變化高度
  • l2 = sind(roll)*l2
  • %下面計(jì)算C點(diǎn)在Z軸上的變化高度,通過相似三角形計(jì)算
  • l2 = l2*(r1+od)/r1
  • ??
  • zd = [zd -l2;zd l2]
  • %x,y軸根據(jù)picth角度縮放
  • yd(:,2) = yd(:,2).*cosd(roll)
  • xd(:,2) = xd(:,2).*cosd(roll)
  • ??
  • %額。。這方法寫的心力交瘁。。。。。。。還是方向余弦好。。。四元素再學(xué)。。。。。。
  • ??
  • ??
  • end
  • surf(xd,yd,zd)
  • axis([-3 3 -3 3 -3 3])
  • xlabel('X')
  • ylabel('Y')
  • zlabel('Z')
  • text(xd(1,1),yd(1,1),zd(1,1),'A點(diǎn)')
  • text(xd(1,2),yd(1,2),zd(1,2),'B點(diǎn)')
  • text(xd(2,2),yd(2,2),zd(2,2),'C點(diǎn)')
  • %%
  • %測(cè)試用圓
  • hold on
  • alpha=0:pi/20:2*pi;
  • x=r1*cos(alpha);
  • y=r1*sin(alpha);
  • plot(x,y);
  • ??
  • hold on
  • x=r2*cos(alpha);
  • y=r2*sin(alpha);
  • plot(x,y);
  • ??
  • hold off
  • end


  • 總結(jié)

    以上是生活随笔為你收集整理的四轴飞行器1.1 Matlab 姿态显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。