四轴飞行器1.1 Matlab 姿态显示

开始做四轴了,一步一步来,东西实在很多,比较杂。先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写。。希望能好好的完成它。。。关于matlab上位机,首先做个姿态显示,然后等板子来了,把板子底层程序写好后,加上matlab的串口接收部分,基本的环境就算搭建好了。。。。

这个代码写了一天,写到最后出现戏剧性的一幕,实在是太恶心了哈。。开始自己的想法就是通过输入pitch roll yaw三个欧拉角,然后在空间中现实飞机的姿态,为了学习matlab翻了matlab的书,还看了线性代数,为了画这个姿态图,看了高中的立体解析几何,向量运算等。。。都是泪啊,说回正题,首先计算xOy平面中的转动,也就是yaw轴,这个相对比较简单,让三角形的三个点分别在图中的大圆和小圆上,如图所示:

yaw解决了之后就需要解决pitch了,就是俯仰角,约定是以坐标的(0 0 0)点进行旋转的,也是两个圆的圆心,所以算pitch只需要在xOz平面内计算,通过sin(pitch)可以算出来A B C三个点在Z轴上的坐标了,这里需要注意下,A点变换后,相对应的X轴变化是cos(pitch),y轴也是,算到这里会发现一个问题,用matlab算B C连个点的时候,只需算B或者C,解出来是有两个解的,一个B一个C,B和C必须分辨清楚,否则在计算roll的时候因为 B C没有分清楚会导致roll旋转方向不确定,后面再说B C怎么分辨。
        接下来是计算 roll了,需要计算B 点和C点在Z轴上的坐标,因为我们是绕着(0 0 0)转的,而不是绕着BC的终点转,所以无法通过BC的长度乘以sin(roll)计算,所以通过圆心做一条直线与BC平行,假设与AC交与F点,

%          A

%       E  O  F

%   B      D     C
 无论pitch和yaw怎么转,OF都是在xOy平面的,方便计算,通过sin(roll)*OF的长度就可以得到F在Z轴的变化,从而通过等比可以的到C在Z轴的变化,B点变化和C是一样的,方向相反,之后将B C的坐标在xOy平面做cos(roll)缩放就可以的到最终的三角形的三个坐标了。
       接着讲BC的分辨问题,想来想去只想到一个比较简单的方法,我们算出来BC并不知道哪个是B,哪个是C,不过我们可以制定一个B‘ 点,那就是我们取一个DB方向的方向向量n,跟随三角形旋转,让它始终指向定义的DB方向,然后可以计算OB OC分别和向量n的内积,
因为n与OB为锐角,与OB为钝角,so,n 与OB点乘为负数,与OC点乘为正数,从而区分出B点和C点 。
        上面想法看起来不错,但是怎么让向量n随着yaw角转动呢,灵机一闪,线性代数书的矩阵里面有个旋转矩阵啊,立马拿过来验证,发现可以很好的运行,然后想到一个问题,如果某种情况三角形roll为90度,DB的分量在xOy平面为0,这个方法就无效了啊(其实这个问题应该不会出现,因为我们是线计算yaw 然后计算pitch,在计算pitch的时候分辨BC亮点,压根就还没开始计算roll),那用三维旋转矩阵就可以解决这个问题啊,嗯嗯,又灵机一闪,之前看过捷联惯性导航书上讲了方向旋转矩阵啊,应该可以用。把方向余弦拿过来计算一下,和用xOy平面的旋转举证效果一样,到此忽然想到一个非常十分傻逼的事情,妈蛋,三角形三个点全部用这个方向余弦矩阵旋转就可以了啊,立马改程序,不到十分钟就改完了,程序运行良好,都是泪。。。。。。不过自己的算法不能半途而废啊,后面还是把自己的算法完成,并且也可以很好的运行。。。不过因为用了matlab的符号运算,速度和用方向余弦计算比起来慢很多,后面还是用方向余弦算吧。。。。。。。
下面贴代码:

  1. %%
  2. %2014.7. sky.zhou 编写
  3. function DrawAttitude(pitch,roll,yaw)
  4. %%
  5. %用于显示飞机姿态,输入为pitchrollyaw
  6. %自己的2B算法算的太慢了,我勒个去。。。还是用方向余弦吧
  7. mode = %标记用那种方法进行计算,:表示用自己写的2B算法进行计算,2表示用方向余弦矩阵进行计算
  8.  
  9. %pitch = ;
  10. %roll = ;
  11. %yaw = ;
  12. r1 =; %大圆半径
  13. r2 = 0.618*r1; %小圆半径
  14.  
  15. if mode ==
  16. pitch = -pitch; %角度定义不一样,改一下
  17. roll = -roll; %角度定义方式不一样,自己习惯改就好,看你希望是以怎样的方向转
  18. end
  19. 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));
  20. sind(yaw)*(-cosd(roll)) cosd(yaw)*cosd(roll) sind(roll) ;
  21. cosd(yaw)*sind(pitch)+sind(yaw)*sind(roll)*cosd(pitch) sind(yaw)*sind(pitch)-cosd(yaw)*sind(roll)*cosd(pitch) cosd(roll)*cosd(pitch) ]
  22. %三角形规约:A为定点,B C为两边的角,具体方位如下
  23. % A
  24. % B C
  25. t_fpa = ; %三角形定点角度设置为40度,fpa On behalf of Fixed point angle
  26. t_b = ( - t_fpa) / ;
  27. t_c = t_b;
  28.  
  29. if t_fpa > asind((r2/r1))*
  30. t_fpa = asind((r2/r1))*
  31. end
  32.  
  33. %xd,yd,zd存放真是数值,与符号xyz区分开来
  34. %约定 xd yd zd 4位分别代表三角形ABC ABAC坐标
  35. if mode ==
  36. xd=[ -1.2735; -1.2735];
  37. yd=[ 1.3474; -1.3474];
  38. zd=[ ; ];
  39. %上面几个初始化的点是根据 定义的。
  40. %pitch = ;
  41. %roll = ;
  42. %yaw = ;
  43. %r1 =; %大圆半径
  44. %r2 = 0.618*r1; %小圆半径
  45. else
  46. xd=[];
  47. yd=[];
  48. zd=[];
  49. tempA =[]; %保存中间计算角度,目前之用来保存角BOA
  50. end
  51. temp = [];
  52. if mode ==
  53. temp = [xd(,) yd(,) zd(,);
  54. xd(,) yd(,) zd(,);
  55. xd(,) yd(,) zd(,)];
  56. temp = temp*dc;
  57. xd = [temp(:,)';temp(1,1),temp(3,1)]
  58. yd = [temp(:,)';temp(1,2),temp(3,2)]
  59. zd = [temp(:,)';temp(1,3),temp(3,3)]
  60. %到此位置,方向余弦矩阵已经计算完毕,可以直接用后面的函数进行显示
  61. end
  62.  
  63. if mode == %执行自己的2B算法
  64. %xs ys zs分别问记录方程的解 xs 为sysm缩写
  65. syms x y z r xs ys zs; %x y z 惯性坐标系中三个正交基,r为xOy平面中的大圆和小圆半径
  66. %定义各点的坐标符号参数
  67. syms xa ya za xb yb zb za zb zc ;
  68.  
  69. %%
  70. c1 = sym('x^2+y^2 = r^2'); %大圆方程
  71. c1 = subs(c1,'r',r1) %换成实际数值
  72.  
  73. c2 = sym('x^2+y^2 = r^2'); %校园方程,可以表达为:c2 = 'x^2+y^2 = r^2',效果是一样的
  74. c2 = subs(c2,'r',r2)
  75.  
  76. l1 = sym('cosd(yaw)*y=sind(yaw)*x')
  77. %l1 = sym('y=tand(yaw)*x') %不用这个公式是因为这个公式有零点,90和-90无法使用
  78. %l1 = subs(l1, 'yaw', yaw) %换成实际数值,这里不要转成实际数值,为了方便subs的运算
  79. %%
  80. [xs ys] = solve(c1,l1,'x','y') %注意,这里算出来的xd yd是符号变量,matlab自动转换了,下面重新对其赋值,可以变回数值变量
  81.  
  82. %双百分号还可以类似于分类的作用,挺好。
  83. temp = subs([xs;ys])
  84.  
  85. %%
  86. %计算A点坐标
  87. if yaw > - && yaw < %判断角度的范围,用来选择在坐标中三角形的顶点是正还是负
  88. %这个可能有点难理解,角度确定了,就可以知道焦点在x轴的正负,从前两个数值中取对应的X解后,然后取对应的Y的解
  89. temp = temp([temp(:)>;temp(:)>])
  90. elseif yaw == -
  91. temp = [ ;temp(temp<)]
  92. elseif yaw ==
  93. temp = [ ;temp(temp>)]
  94. else
  95. temp = temp([temp(:)<;temp(:)<])
  96. end
  97.  
  98. %得到在XOY平面中三角形定点的第一个解
  99. xd = [xd temp()]
  100. yd = [yd temp()]
  101.  
  102. %%
  103. %计算B点坐标
  104.  
  105. %temp计算出来表示的是 AB段的长度,
  106. % A
  107. % O
  108. % B D C
  109. %其中 sind(t_b/)*r2 表示的是OD段的长度,cosd(t_b/)*r2是BD段的长度,
  110. %temp计算的最终结果是AB的长度
  111. %利用三角形边与对面角正弦成比例进行运算
  112. % AB BC A0 B0
  113. % ----- = ----- ----- = ---------
  114. % sin(C) sin(A) sin(角ABO) sin(角OAB)(ps:A的一半)
  115. % 可以求出角ABO,然后通过内角和可以求出角AOB
  116. % AB BO
  117. % ----- = -------- 可以求出AB长度,简化代码如下
  118. % sin(角AOB) sin(角OAB)
  119. % ( - asind((r1/r2)*sind(t_fpa/)) - (t_fpa/)) 为角BOA的大小
  120. tempA = sym('(180 - asind((r1/r2)*sind(t_fpa/2)) - (t_fpa/2))');
  121. temp = sym('(r2/sind(t_fpa/2))*sind(tempA)');
  122. tempA = subs(tempA);
  123. temp = subs(temp);
  124.  
  125. %temp = subs(sym('sqrt(((sind(t_b/2)*r2)+r1)^2 + (cosd(t_b/2)*r2)^2)'));
  126.  
  127. %假设 符号 xa ya 为 A点的坐标,x,y为要求的B点坐标
  128. temp = subs(sym('(x-xa)^2 + (y-ya)^2 = temp^2'),'temp',temp);
  129. %将xa和ya换成数值xa和ya,嵌套换的
  130. temp = subs(subs(temp,'xa',xd()),'ya',yd())
  131. [xs ys] = solve(temp,c2,'x','y')
  132.  
  133. %通过下面的计算就已经可以得到 B C的坐标了
  134. temp = subs([xs;ys])
  135.  
  136. %下面需要做的是区别哪个点是A,哪个点是B。
  137. %%
  138. % 下面是在xOy平面内的旋转
  139. % B
  140. % D O A yaw=0度的时候三角型在X0Y平面的方位,其中水平位置为x轴竖直方向为Y轴
  141. % C
  142. % 取一个与DB方向一样的方向向量n(,)
  143. % 用旋转矩阵让它跟三角形同步旋转
  144. % 因为n与OB为锐角,与OB为钝角,so,n与OB点乘为负数,与OC点乘为正数,从而区分出B点和C点
  145. %%
  146. % 为了避免roll为90度的时候按照之前的定义方向向量n=(,),区分不出来B和C点,所以用方向余弦矩阵进行计算
  147. %方向余弦矩阵定义
  148. %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));
  149. % sind(yaw)*(-cosd(roll)) cosd(yaw)*cosd(roll) sind(roll) ;
  150. % cosd(yaw)*sind(pitch)+sind(yaw)*sind(roll)*cosd(pitch) sind(yaw)*sind(pitch)-cosd(yaw)*sind(roll)*cosd(pitch) cosd(roll)*cosd(pitch) ]
  151. %%算到这里的时候我发现只要在xOy平面内将三角形的初始化坐标ABC三个点输入后,用方向余弦矩阵算就可以了,然后花了10分钟不到的时间就实现了
  152. %不过这里还是决定把这个方法写完。。。都是泪。。。。。。。。。。。。。。。。。
  153. %%
  154. n = [ ] %方向向量
  155. n = n*dc %对方向向量进行旋转
  156. %约定 xd yd zd 第 4位分别代表三角形ABC的 A、B、A、C坐标
  157. n = n*[temp();temp();]
  158. if n > %说明夹角是锐角,该角是B点
  159. xd = [ xd temp() xd temp()]
  160. yd = [ yd temp() yd temp()]
  161. else
  162. xd = [ xd temp() xd temp()]
  163. yd = [ yd temp() yd temp()]
  164. end
  165.  
  166. %处理成变成矩阵形式
  167. xd = [xd(:);xd(:)]
  168. yd = [yd(:);yd(:)]
  169.  
  170. %当存在pitch角度的时候,X坐标做相印调整
  171. xd = xd.*cosd(pitch)
  172. yd = yd.*cosd(pitch)
  173.  
  174. %%
  175. %约定 xd yd zd 第 4位分别代表三角形ABC的 A、B、A、C坐标
  176. %计算z中A的坐标,其中B和C是相等的
  177. zd = [zd sind(pitch)*r1]
  178.  
  179. %下面OD的长度,然后可以计算出B和C在Z轴上的坐标,也就是D点的坐标
  180. od = (sind(tempA - )*r2)
  181. %zd = [zd temp;zd temp]
  182.  
  183. %计算roll状态下B和C的坐标
  184. % A
  185. % E O F
  186. % B D C
  187. % 先计算在roll下OF的长度,然后算F在Z轴的高度,然后等比后算B和C在Z轴的高度
  188. %下面计算OF的长度
  189. l2 = tand(t_fpa/)*r1
  190. %下面计算F在Z轴上的变化高度
  191. l2 = sind(roll)*l2
  192. %下面计算C点在Z轴上的变化高度,通过相似三角形计算
  193. l2 = l2*(r1+od)/r1
  194.  
  195. zd = [zd -l2;zd l2]
  196. %x,y轴根据picth角度缩放
  197. yd(:,) = yd(:,).*cosd(roll)
  198. xd(:,) = xd(:,).*cosd(roll)
  199.  
  200. %额。。这方法写的心力交瘁。。。。。。。还是方向余弦好。。。四元素再学。。。。。。
  201.  
  202. end
  203. surf(xd,yd,zd)
  204. axis([- - - ])
  205. xlabel('X')
  206. ylabel('Y')
  207. zlabel('Z')
  208. text(xd(,),yd(,),zd(,),'A')
  209. text(xd(,),yd(,),zd(,),'B')
  210. text(xd(,),yd(,),zd(,),'C')
  211. %%
  212. %测试用圆
  213. hold on
  214. alpha=:pi/:*pi;
  215. x=r1*cos(alpha);
  216. y=r1*sin(alpha);
  217. plot(x,y);
  218.  
  219. hold on
  220. x=r2*cos(alpha);
  221. y=r2*sin(alpha);
  222. plot(x,y);
  223.  
  224. hold off
  225. end

四轴飞行器1.1 Matlab 姿态显示的更多相关文章

  1. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  2. 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

    四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...

  3. 四轴飞行器1.5 各种PID对比分析及选择

    原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...

  4. 四轴飞行器1.2.2 RT-Thread 串口

    四轴飞行器1.2.2 RT-Thread 串口        本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了.下面我们说 ...

  5. 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲(转)

    源: 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲

  6. 从零开始的四轴飞行器-开篇flag

    在这里立下flag,我要理解学会四轴飞行器的控制方法.

  7. 简单实用的matlab柱状图显示比例及计数

    这个小代码用于matlab柱状图显示比例及数值, 函数如下: function myhist(x) % myhist Codeby SimonLiang % Email:idignew@126.com ...

  8. 四轴飞行器1.4 姿态解算和Matlab实时姿态显示

    原创文章,欢迎转载,转载请注明出处 MPU6050数据读取出来后,经过一个星期的努力,姿态解算和在matlab上的实时显示姿态终于完成了. 1:完成matlab的串口,并且实时通过波形显示数据 2:添 ...

  9. 四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

    飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈..以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈.. 做遥控我们选 ...

随机推荐

  1. 20141129 LinQ to SQL

    ORMO-Object对象R-Relation关系M-Mapping映射 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是 ...

  2. 在什么情况下使用exist和in

    http://www.itpub.net/thread-406784-4-1.htmlYou Asked (Jump to Tom's latest followup) Tom: can you gi ...

  3. Struts2返回Json数据(使用Struts2插件)

    这篇我将介绍如何使用Struts2的struts2-json-plugin.jar插件返回JSON数据. 一.其中主要步骤有: 1.将struts2-json-plugin.jar插件拷贝到项目的&q ...

  4. js获取input file完整路径的方法

    function getPath(){  //判断浏览器  var Sys = {};  var obj = document.getElementById("headImg"); ...

  5. group_concat 使用

    Mysql中使用group_concat时,出现Row 1 was cut by GROUP_CONCAT()异常. group_concat默认的最大拼接长度,是1024. 把所有子节点的ID,用逗 ...

  6. cookie程序设计举例

    编写Cookie应用程序,一般流程是:首先尝试获取某个Cookie变量,如果有,则表明是老客户,读取其cookie信息,为其提供服务. 如果没有,则表明是第一次来访的客户,通过表单提交获取其身份信息, ...

  7. Esxi主机虚拟机迁移注意事项

    1. Esxi主机上的虚拟机迁移只能是低----->高,或版本一样的才能进行迁移 [如Esxi5.1---->Esxi5.5]ok, 而Esxi5.5----->Esxi5.1 no ...

  8. JavaScript和php常用语法——切割字符串

    在面向Web的应用中,前台和后台通信非常常用的一种格式就是字符串,所以,在通信中,我们不可避免的就需要进行字符串的拼切. 在js代码中,当我们传递一个字符串到后台代码时,我们在后台需要对字符串进行切割 ...

  9. qutIm编译

    官网:http://www.qutim.org/ 原文地址:http://wiki.qutim.org/en/building_from_git 依赖: Qt4-dev 4.7:http://qt-p ...

  10. 紫薇~还记得大明湖畔的HTML5智力拼图吗?

    曲线谜团是非常有趣的HTML5智力游戏,据说超过多少分会有惊喜,游戏简单易操作,偶尔抛弃那种杀死脑细胞的大型游戏,玩玩这种简单经典的益智小游戏,放松放松,也是不错的选择嘛-将游戏 通过 统一开发环境( ...