openshoe 算法
概述
openshoe 是一种通过惯性测量元件 (IMU) 来对运动进行积分以得到路径的控制算法。算法的核心是 ZUPT(零速度更新算法),在只有 IMU 惯性测量元件的情况下获得路径只能通过对加速度积分得到速度,再将速度对时间进行积分得到路径,这里如果不能对积分得到的速度进行有效的校正那么这个速度误差会时刻对时间进行积分,导致路径完全失效,因此必须采取有效手段及时对速度误差进行校正以得到较为准确的路径信息,ZUPT 就是一种基于检测零速度进行路径积分校正的算法。该算法的关键是对零速度的准确检测。
零速度检测算法
openshoe 采用广义似然检测算法对零速度进行检测,以判断 IMU 是否处于静止状态。
广义似然检测原理
要理解广义似然检测原理需要先熟悉几个概率论中相关的概念,详细如下:
条件概率公式
设 A 与 B 为样本空间 Ω 中的两个事件,其中 P(B)>0。那么在事件 B 发生的条件下,事件 A 发生的条件概率为:
P(A∣B)=P(AB)P(B)P(A|B) = \frac{P(AB)}{P(B)}
P(A∣B)=P(B)P(AB)
贝叶斯公式
P(A∣ ...
IMU 误差模型及校准
传感器误差模型
对于理想的 IMU 三轴加速度计两两正交,构成一个正交的三轴直角坐标系,加速度计每一轴单独测量该轴的加速度,而陀螺仪则测量该轴的角速度。在实际的真实 IMU 中由于制造工艺的误差,三个坐标轴不可能完全两两正交,加速度计与陀螺仪的坐标系也不会完全重合,并且单个传感器也不是完全精确的。在实际器件中将数字输出量转化为实际物理量的 scale 参数在不同轴上是不同的,但是设备生产商都会提供一个默认的 scale 参数用于转换所有轴的数据,而且数字量的输出还会受到零偏(传感器在静止情况下也会有微小量的输出)的影响,这些就是造成 IMU 传感器的系统误差。
我们取实际器件的加速度计坐标系为 AF, 陀螺仪坐标系为 GF,根据 AF 和 GF 分别建立对应的正交坐标系 AOF 和 GOF,其建立约束为
AOF 的 x 轴与 AF 的 x 轴重合。
AOF 的 y 轴位于 AF 的 x 与 y 轴的平面中。
对于 GOF 的建立约束与 AOF 的约束类比建立。最后再建立一个正交机体坐标系 BF,BF 通常与 AF 和 GF 之间有一个小角度的偏差。在非正交坐标系(AF 或 GF) ...
IMU 姿态解算
IMU 通过加速度计解算姿态角
通过三角函数可以将加速度计三个轴的角速度解算为姿态角,其中 α\alphaα , β\betaβ 和 γ\gammaγ( γ\gammaγ 是 z 轴与重力加速度之间的夹角)与三个轴之间的关系如上图所示:
β=arcsin(axg)γ=arcsin(ayg)\begin{aligned}
&\beta = arcsin(\frac{a_x}{g}) \\
&\gamma = arcsin(\frac{a_y}{g})
\end{aligned}
β=arcsin(gax)γ=arcsin(gay)
其中重力加速度 $ g $ 的取值使用三轴角速度的矢量和即:
g=ax2+ay2+az2g = \sqrt{a_x^{2} + a_y^{2} + a_z^{2}}
g=ax2+ay2+az2
将 g 的值带入上式可以得到:
β=arctan(axay2+az2)γ=arctan(ayax2+az2)\begin{aligned}
&\beta = arctan(\frac{a_x}{\sqrt{a_y^{2} ...
RTOS 的设计
何为实时性?
RTOS 的实时性该怎么理解呢?快速?确定性?
从中断控制器视角看实时性
我们知道一般都是 Cortex-M 跑 RTOS,Cortex-A 很少跑 RTOS,一般都是跑 Linux、Android 这些非实时系统。如果单纯从速度来看 A 核在高主频加持下一定会具有更快的速度才对呀,那 M 核的竞争力在哪里呢?实际上这就是 A 核和 M 核在设计上的两个不同方向的取舍。
首先我们看 NVIC 中断控制器的设计:
中断延迟波动很小:NVIC 支持中断嵌套,这样即使当前中断在处理中且非常耗时也没关系,因为可以通过高优先级的中断来响应更紧急的事件,这样中断延迟就不依赖与中断处理时间了,从设计上保证了延迟的确定性。
中断延迟小:NVIC 在不同的中断会跳转到不同地址运行,且可以直接在硬中断上下文中执行中断程序,这样整个 pipeline 很短,且 NVIC 还支持尾链这个概念进一步降低延迟(当高优先级的 ISR 抢占低优先级 ISR 时,处理器会跳过上下文保存和恢复,直接处理第二个 ISR,没有任何额外的开销)。通常 NVIC 中断响应时间在十几到几十 ns 之间。
NV ...
叶赛宁
😗不惋惜,不呼唤,我也不啼哭(叶赛宁)
不惋惜,不呼唤,我也不啼哭,
一切将逝去……如苹果花丛的薄雾
金黄的落叶堆满我心间——
我已经再不是青春少年。
心儿啊,你已开始悄悄冷却,
如今再不会那样地跳跃:
这白桦的图案织成的家园,
再不能吸引我赤脚留连。
流浪者的激情哪!越来越不见你,
促使我轻轻吐出火热的言语。
啊,我的白白流逝的华年!
迸发的憎恨和奔放的情感!
如今我已倦于期待未来,
生活呀,难道你是一场幻梦?
仿佛我曾在喧闹的春晨
在玫瑰色的骏马上尽情驰骋。
槭树的黄叶落地无声,
世人都必将腐朽无踪……
天下的众生啊,你们生生不息,
我愿你永远美好、繁荣!
[[LiQingzhao]]
[[NorthIsland]]
[[SuShi]]
[[SongciOther]]
[[Xinqiji]]
[[Yesaining]]
ucos 相关实现
ucos 优先级调度算法
保证调度延迟的确定性
普通查表法会从头开始遍历数组,这样就绪态最高优先级的 task 会比就绪态优先级低的 task 先被查找到,造成不同优先级 task 在调度上花费时间不一致的情况,这违背了实时性的原则。
ucos 调度原理
为了确保调度延迟一致性,ucos 采用了空间换取时间的算法在相同时间里查找到不同优先级 task,具体算法如下。
整个算法由两个变量、两个表格和三个程序组成:两个变量是 OSRdyGrp 和 OSRdyTbl[]; 两个表格是位掩码表 OSMapTbl[] 和优先级判定表 OSUnMap[],三个程序分别是使 task 进入就绪、脱离就绪、寻找就绪态最高优先级 task。
使 task 进入就绪态的程序如下:
123/* 将 prio 优先级放入就绪态优先级表中 */OSRdyGrp = OSMapTbl[prio>>3]; //设置就绪态优先级组标志OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //设置就绪态优先级组内 ...
宋词-其他
长相思·汴水流
白居易
汴水流,泗水流,流到瓜州古渡头。吴山点点愁。
思悠悠,恨悠悠,恨到归时方始休。月明人倚楼。
浪淘沙·借问江潮与海水
白居易
借问江潮与海水,何似君情与妾心?
相恨不如潮有信,相思始觉海非深。
花非花
白居易
花非花,雾非雾。
夜半来,天明去。
来如春梦几多时?
去似朝云无觅处。
忆江南·江南好
白居易
江南好,风景旧曾谙。日出江花红胜火,春来江水绿如蓝。能不忆江南?
十二月二日夜梦游沈氏园亭
陆游
城南小陌又逢春,只见梅花不见人。
玉骨久成泉下土,墨痕犹锁壁间尘。
卜算子·咏梅
陆游
驿外断桥边,寂寞开无主。已是黄昏独自愁,更著风和雨。
无意苦争春,一任群芳妒。零落成泥碾作尘,只有香如故。
诉衷情·当年万里觅封侯
陆游
当年万里觅封侯,匹马戍梁州。关河梦断何处?尘暗旧貂裘。
胡未灭,鬓先秋,泪空流。此生谁料,心在天山,身老沧洲。
鹊桥仙·华灯纵博
陆游
华灯纵博,雕鞍驰射,谁记当年豪举。酒徒一半取封侯,独去作、江边渔父。
轻舟八尺,低篷三扇,占断苹洲烟雨。镜湖元自属闲人,又何必、君恩赐与。
夜游宫·记梦寄师伯浑
陆游
雪晓清笳乱起。梦游处、不 ...
辛弃疾
西江月·遣兴
醉里且贪欢笑,要愁那得工夫。
近来始觉古人书。信著全无是处。
昨夜松边醉倒,问松我醉何如。
只疑松动要来扶。以手推松曰去。
清平乐·独宿博山王氏庵
绕床饥鼠,蝙蝠翻灯舞。屋上松风吹急雨,破纸窗间自语。
平生塞北江南,归来华发苍颜。布被秋宵梦觉,眼前万里江山。
西江月·夜行黄沙道中
明月别枝惊鹊,清风半夜鸣蝉。稻花香里说丰年,听取蛙声一片。
七八个星天外,两三点雨山前。旧时茅店社林边,路转溪桥忽见。
贺新郎·别茂嘉十二弟
别茂嘉十二弟。鹈鴂、杜鹃实两种,见《离骚补注》
绿树听鹈鴂。更那堪、鹧鸪声住,杜鹃声切。啼到春归无寻处,苦恨芳菲都歇。算未抵、人间离别。马上琵琶关塞黑,更长门、翠辇辞金阙。看燕燕,送归妾。
将军百战身名裂。向河梁、回头万里,故人长绝。易水萧萧西风冷,满座衣冠似雪。正壮士、悲歌未彻。啼鸟还知如许恨,料不啼清泪长啼血。谁共我,醉明月。
[[LiQingzhao]]
[[NorthIsland]]
[[SuShi]]
[[SongciOther]]
[[Xinqiji]]
[[Yesaining]]
苏轼
临江仙
夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣。敲门都不应,倚杖听江声。
长恨此身非我有,何时忘却营营?夜阑风静縠纹平。小舟从此逝,江海寄余生。
西江月·世事一场大梦
世事一场大梦,人生几度秋凉?夜来风叶已鸣廊。看取眉头鬓上。
酒贱常愁客少,月明多被云妨。中秋谁与共孤光。把盏凄然北望。
江城子·乙卯正月二十日夜记梦
十年生死两茫茫,不思量,自难忘。
千里孤坟,无处话凄凉。
纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡,小轩窗,正梳妆。
相顾无言,惟有泪千行。
料得年年肠断处,明月夜,短松冈。
念奴娇·赤壁怀古
大江东去,浪淘尽,千古风流人物。
故垒西边,人道是,三国周郎赤壁。
乱石穿空,惊涛拍岸,卷起千堆雪。
江山如画,一时多少豪杰。
遥想公瑾当年,小乔初嫁了,雄姿英发。
羽扇纶巾,谈笑间,樯橹灰飞烟灭。
故国神游,多情应笑我,早生华发。
人生如梦,一尊还酹江月。
水龙吟·次韵章质夫杨花词
似花还似非花,也无人惜从教坠。抛家傍路,思量却是,无情有思。萦损柔肠,困酣娇眼,欲开还闭。梦随风万里,寻郎去处,又还被、莺呼起。
不恨此花飞尽,恨西园、落红难缀。晓来雨过,遗踪 ...
Linux 启动优化
启动流程
Linux 系统当前的启动流程如下:
1brom --> boot0 --> (monitor/secure os) --> uboot --> rootfs --> app
brom 固化在 IC 内部,芯片出厂后就无法更改。后续将从 boot0 开始分阶段介绍启动优化的方法。
对于某些方案,会存在 monitor 或 secure os,这两者耗时很短,略过。
下文涉及到一些配置文件,提前在此说明。
env 配置文件路径:
123sdk/device/config/chips/<chip>/configs/<board>/linux/env-<kernel-version>.cfg #优先级高sdk/device/config/chips/<chip>/configs/default/env.cfg #优先级低sdk/target/allwinner/<board>/configs/env-<kernel-version>.cfg #旧 SDK
sys_config. ...
