版权声明:本文为博主原创文章,转载请注明出处,技术交流QQ:1073811738。
一、开篇
距离上一篇博文已经很久了,最近主要就是参加了几家公司的电话面试,思考了一些问题,本身就是半路杀进无人机领域的门外汉。对整个飞行控制部分理解的也是皮毛的皮毛,经过几家面试之后,稍微有了一些着重点,本篇博文就主要介绍一下几个相关的问题的思考以为拓展。肯定有理解的不好之处,烦劳各位看客帮忙完善一下每一部分的答案。
如果问题只是问题,那它便失去了背后的意义。--------写在前面
二、版权声明
博主:summer
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/qq_21842557
联系方式:dxl0725@126.com
技术交流QQ:1073811738
三、实验平台
Software Version:PX4Firmware(Ver_3.3)
Hardware Version:pixhawk
IDE:eclipse Juno (Windows)
四、正文
欧拉角是一种广为使用的姿态描述方式,最终控制时的控制量就需要它,直观明了,但是在有限资源下的MCU中进行姿态解算运算时万万不可使用它。在最常用的欧拉角表达方式中,把机体的旋转看成按照三个坐标轴转动的量:滚转角-俯仰角-偏航角(roll-pitch-yaw)。它的好处是十分的直观,且只有三个参数描述。缺点是会碰到著名的万向锁问题(gambleock):在俯仰为±90∘时,表达某个姿态的形式不唯一,也不易于插值和迭代。
思考1:关于姿态解算中使用的传感器数据的真实性如何判断?即最优选择算法
这个到现在还是不清楚,get_best函数里面的具体实现算法是什么什么意思呢,who knows?tell me ~~~
PX4代码中的互补滤波算法(DCM):算法中有一个滤波器的confidence函数(信任度函数,貌似模糊控制理论有个隶属函数,应该是类似的功能):返回值是对上N次测量的验证的信任程度,其值在0到1之间,越大越好。返回值是返回上N次测量的误差诊断,用于get_best函数选择最优值,选择的方法如下:
Switch if:
1)the confidence is higher and priority is equal or higher
2)the confidence is no less than 1% different and the priority is higher
思考2:如何补偿传感器的bias?(应该从两个方面考虑比较好)
第一方面:对bias这个词的理解太不到位了,bias顾名思义,指的是的偏差,需要考虑到上电初始时由于gyro本身的特性产生的bias,gyro零点偏移(静态时)的随机部分一般是指陀螺漂移,是反应陀螺仪性能的主要指标,对于常用的MEMS陀螺,较大的陀螺漂移正式影响其应用的主要障碍。关于零点偏移需要通过传感器标定修正误差。
关于传感器标定:是仪器就会有误差,像很多仪器一样mpu6050也要在使用前校正,传感器的标定类似于天平使用前的调零,所以每次使用前进行传感器的标定工作是必要的,标定是计算修正偏移量的过程,得到偏移量后,在使用传感器时需要将传感器输出数据减去偏移量,这样才能得到修正后的数据。标定有很多方法,比较简单的一种方法,当然也是最不精确的一种方法是在静止时取多次测得数据的平均值,标定后要将偏移量减去,标定的具体步骤不在赘述。
第二方面:随着时间的积累,gyro会出现drift的积累,需要考虑如何把这部分误差修正掉。首先在姿态解算时是以gyro为主要控制量,用Acc和Mag修正补偿gyro的roll、pitch和yaw,通过PID Feedback修正以后就是对DCM的归一化处理和正交化处理,其中比较重要的步骤之一应该就是DCM正交化吧(通过交叉耦合的方式把误差量error耦合到两维向量上,再通过外积求取第三个维度的向量),该步骤是为了修正在进行数值计算时引入的不必要的误差量。
思考3:四元数的微分方式是什么样的?
这个。。。。。移步思考8
思考4:如何使用四元数旋转一个向量?即四元数如何表示旋转的?
我知道的就是使用四元数构建的旋转矩阵,通过左乘这个旋转矩阵来旋转某一个向量。
四元数可以表示三维空间中任意一个旋转。按照四元数的本质来理解四元数如何旋转一个向量,其实就相当于正常旋转时需要用三个欧拉角按顺序进行三次旋转,现在使用四元数只需要一次旋转就可以达到相同的效果了,但是需要引入一个瞬时旋转轴。
好吧,又开始上图了~~~
四元数的详细介绍可以参考知乎链接:
http://www.zhihu.com/question/23005815/answer/33971127?from=groupmessage&isappinstalled=0
思考5:如何使用四元数更新姿态?即如何使用gyro数据更新姿态
首先就是四元数的微分方程,然后就是四元数随时间的地推公式和DCM矩阵随时间的地推公式。在考虑四元数随时间的地推时,使用了离散数学的理论。
思考6:关于uORB是否可以从源代码中移植出去?即是否依赖于现有的OS NuttX?
uORB仅仅就是为了IPC的实现而产生的,是一种高效的设计模式,可以进行移植。感觉这个可以深入的研究一下,可惜心有余而力不足啊。
思考7:。。。。。。。。看到这,应该有很多感悟吧,所以赶紧总结一下帮我纠正或完善答案啊。。。。别只顾着看啊。。。。。
思考8:左乘和右乘?在姿态解算过程中使用哪个?(请结合上面的思考4理解该部分)
当三维向量发生旋转时,如果采用矩阵运算需要考虑“左乘”和“右乘”。若绕静坐标系(地理坐标系)旋转,则左乘,即旋转矩阵*向量;若是绕移动坐标系旋转(机体坐标系),则右乘,也就是向量*旋转矩阵。关于左乘和右乘的问题,需要考虑以哪个坐标系为基准的,我们在做姿态解算的过程和控制的过程都是以地理坐标系为基准的,所以用到了左乘。
思考9:为什么用NuttX操作系统呢?
从OS的优点方面介绍:有OS更适合多任务系统,增加飞控的易用性,维护起来也方便,各个功能之间能保持相对的独立性,另外可以让编程人员完全脱离硬件,嵌入式工程师其实应该是计算机专业,如果脱离不了硬件,就得找电子方向的工程师了。移植性也好,这点很重要 。
思考10:源代码为什么用C++不用C?
C++面向对象(OOP),扩展性和可维护性好;C++更强大,矩阵运算啥的方便,C++有很多有关数学的库函数,方便调用,都是优化过的。其实我也不太懂
五、总结不面试,不知重点所在~~~
不沟通,不知自己有多low~~~
不出门,不知世界有多大~~~~