0%

导入PCB与准备

  • Altium Designer可以直接导出HyperLynx的文件,但是铺铜区域丢失。这里使用导出ODB++文件的方法,在文件->制造输出->ODB++ Files导出文件夹,在HyperLynx内可直接打开ODB++的文件夹作为项目。
  • Allergo板图可以直接用HyperLynx打开导入。

导入时如果有些网络没有连接可能弹出警告”One or more nets are completely unrouted.”,直接选择No即可。

下面以STM32MP157评估板作为例子进行仿真,所需要的文件如下

  • STM32MP15x IBIS file
  • MB1272 Manufacturing files提取ODB++文件,或者选择下载MB1272 Board design project files打开PCB再进行导出
    需要注意的时这里生成ODB++时Pin name有误,需要在components文件中清除前缀U*-,否则后续仿真导入模型时引脚名称对应不上
  • 内存颗粒MT41J256M16TW的IBIS文件暂未找到,直接用HyperLynx自带的类似型号颗粒MT41J256M16HA的IBIS模型替代
阅读全文 »

基本概念

强化学习是指机器通过与外部环境交互,学习最佳策略的过程。其中决策的主体被称为智能体(Agent),它能够根据环境反馈的状态(State),以及人为设计的描述输出动作好坏程度的奖励(Reward)做出相应的动作(Action)。这个过程的“最佳”体现在最终的目标是调整策略,使得总体奖励最大化。

  • 状态(State):时刻的状态记为,所有可能的状态取值组成的空间称为状态空间(State Space)
  • 动作(Action):时刻的动作记为,所有可能的动作取值组成的空间称为动作空间(Action Space)。输出的动作可分为随机性动作和确定性动作。随机性动作由随机策略(Stochastic Policies)产生,输出的动作服从某个可参数化的关于状态的分布即。确定性的动作由确定性策略(Deterministic Policies)产生,输出的动作可以描述为一个参数化的关于状态的函数
  • 奖励(回报,Reward):时刻的奖励记为,可由一个关于状态(或者状态和动作)的函数获得。
  • 轨迹:由各个时刻的组成的序列,记为
  • 总体奖励:描述一条轨迹中的总奖励,一种描述为限无衰减的总回报(finite-horizon undiscounted return)

    另一种无限有衰减的总回报(infinite-horizon discounted return)如下,其中\gamma为0到1之间的衰减系数。
  • 价值函数(Value Function),即从状态开始,按照策略输出动作的条件下奖励的数学期望
  • 动作-价值函数(Action-Value Function),即从状态开始并输出动作,随后按照策略输出动作的条件下奖励的数学期望

这里的状态(State),动作(Action),奖励(Reward)等变量是对真实系统中的变量的抽象。例如在倒立摆的控制问题中,状态是摆杆的角度、角速度、位移以及速度等参量,而动作则是输出到摆杆底端的水平方向驱动力的大小,奖励可能被人为设计为关于摆杆角度和保持直立的时间长短,摆杆的角度越小并且保持直立的时间越长奖励的值越大。

阅读全文 »

常见模型

贝叶斯模型

贝叶斯模型是经典统计学模型之一,其最为核心的思想就是著名的贝叶斯定理,即对于事件A和B

被称为后验概率,可以理解为事件B作为事件A的原因的情况下其因果关系的强弱。即在事件A发生的条件下事件B发生的概率,可以认为来自样本数据。而则为源于经验设定的先验概率,或者说在没有实际测量。 贝叶斯定理表明通过过去经验与样本数据对概率的修正,能够动态地调整后验概率。贝叶斯模型最主要的应用包括朴素贝叶斯算法和贝叶斯网络。
朴素贝叶斯(Naive Bayesian)算法完全基于贝叶斯定理,这里以分类器的例子解释其原理,首先假定某种分类与其属性或者特征之间的分布完全独立,根据贝叶斯定理可以计算出在拥有某种特征的条件下属于某种分类的结果,即

算法中的概率在样本足够多的情况下可以通过直接计数统计获得,则来源于先验经验,或者对大量样本直接统计其特征和分类的频率也可以获得。
贝叶斯网络(Bayesian network)则是用概率模拟推理过程中的因果关系,以有向无环图描述多个变量或者命题之间的因果关系。贝叶斯网络可以描述更为复杂的因果关系,并且建模时网络的节点可以作为隐变量,这样网络本身的结构也能够被学习。

高斯混合模型(GMM)

高斯混合模型常用于聚类算法,该模型认为数据的分布由若干个可参数化的高斯分布线性叠加而获得的分布,即将原始分布分解为不同参数的符合高斯分布的随机变量。这些变量可以是人为设定的,也可以是通过数据学习得到的隐变量。以连续变量为例,设第j个随机变量符合维的高斯分布,即

其中分别为第j个变量对应维的均值向量和大小的协方差矩阵,假设待求解的变量s由个高斯分布组合而成,则其的分布满足

为混合系数,为了确保的积分为1,所有混合系数之和应该为1。高斯混合模型的混合成分的参数可以通过下述的EM算法在给定的训练集上学习

阅读全文 »

介绍

ONNX(Open Neural Network Exchange)是神经网络的一种交换文件格式,它既能够储存网络结构也能够储存网络的所有参数,它可以被认为是目前生产环境下部署神经网络的主流文件格式。ONNX文件描述了网络的所有计算算过程,这就意味着实际上它的作用类似传统意义上的二进制文件,是“可执行”的代码,其运行环境就是本文描述的部署方法。下面列举导出方法,原生C/C++ Java环境的部署和运行以及低级嵌入式平台部署。

导出与查看

在Pytorch下导出模型及权重到ONNX文件的代码示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import torch
import onnxsim
# model为已经加载参数的模型变量,在定义模型结构后可以采用以下代码加载
# model.load_state_dict(torch.load('model_weights.pth'))
# model.eval()
# torch_input为模型输入参数大小,对于图片一般格式为N(Batch大小)*C(图像通道,灰度图像为1)*H(图像高)*W(图像宽)
# torch_input张量至少有两维,第一维必须是Batch大小
torch_input = torch.randn(1,1,28,28)
torch.onnx.export(model,torch_input,"model.onnx", export_params=True
,input_names=["input0"],output_names=["output0"],verbose=False)

# 重新加载并检查模型,自动化简模型
model_onnx = onnx.load("model.onnx")
onnx.checker.check_model(model_onnx)
model_onnx, check = onnxsim.simplify(model_onnx,
dynamic_input_shape=False,
input_shapes=None)
onnx.save(model_onnx, "model.onnx")
阅读全文 »

目前虽然在我的主机上已经安装了双系统Windows+Ubuntu,但是两个系统切换来切换去也比较麻烦。于是考虑在Window上装虚拟机的方案,不过以前虚拟机装Ubuntu 分配1GB内存应该是足够的,现在估计不行。另外用WSL2虽然性能上可以有所提升,但是除了避免不了内存占用大的通病外还不好管理,安装过程也不能够定制。于是这里尝试一种在虚拟机里安装精简版的Debian/Ubuntu(或者说手动制作一个WSL),实现极小的硬盘和内存占用。

基础环境

这里使用的是免费的虚拟机软件Virtualbox 6.1,为了节约安装的时间下载用的镜像是网络启动的最小镜像,后续所有的安装都需要联网(虽然需要下载,但是能够保证装完的系统不需要进行额外的更新),以下是可用一些安装镜像的方案

  • Ubuntu 18.08 LTS Minimal ISO 根据官方解释在18.04之后就不再提供最小安装ISO而用Ubuntu Server替代了
  • Ubuntu Server 这个是最新的服务器版本,实际上在安装选项里也可以选择最小安装,只不过它似乎最终安装出来硬盘占用比上面这个大
  • Ubuntu Cloud Image 一步到位的解决方案,直接下载VMDK镜像到虚拟机后直接启动,这也是WSL使用的Ubuntu镜像。不过需要插入Seed.iso镜像进行用户名和密码等的配置。

以下安装流程主要针对Minimal ISO的安装和Ubuntu Server版本的安装,Cloud Image的配置可以直接跳到最后系统配置一步。

阅读全文 »

方程求根

最简单的方程求根的问题可以描述为求令成立的的数值解,有以下几种常见方法

二分法

二分法是基于数学上根的存在性的条件,即若则在区间内至少存在一个根。二分法通过每次取根存在的一半,判断根存在于左半区间还是右半区间(\frac{a+b}{2},b),确定根存在的区间后再重复上述步骤搜索缩小后的区间。不断重复即可不断缩小搜索范围,当这个范围足够小时我们认为它是一个点,即找到了对应的根。
二分法在区间取值正确的情况下能够保证线性收敛,但是其缺点也很明显,就是收敛速度太慢了。对于选的比较宽的初始区间需要非常多次迭代才能够达到较为理想的精度。

阅读全文 »

引入

这篇文章主要是记录看完(1)之后的笔记。在之前的提到的各种姿态估计的算法中,姿态的非线性是一个非常难处理的问题。试图用Kalman滤波器等线性方法估计状态只是一种近似的手段,IEKF也算是另外一种手段。
但上述这些方法都或多或少的有些奇怪,因为观测的状态本身总是不符合Kalman滤波器所要求的线性,而我们希望设定的姿态能满足可加和的性质。实际上在误差状态Kalman中就已经提到了一些关于流形(Manifolds)上的操作,比较专业一些的算法例如FAST-LIO设定的状态也是在流形上的。不过目前正是因为缺少这部分的基础知识,看不明白这些论文的方法,于是找了(1)(2)(3)几本书补一下。
文(2)(3)覆盖内容比较全面一些,而文(1)主要覆盖的是工程运用里面所用到的基础知识,比较适合速成,这里也主要是围绕(1)展开。

基本概念

  • 流形(Manifold):状态降维的抽象概念,表征高维数据中的低维结构,可以理解为为带约束的高维空间
  • 李群(Lie Group):一个光滑(可微分)的流形,且其元素满足如下性质:
  • 切空间(Tangent space):给定流形上随移动一点,其导数所构成的空间。可以理解为与流形相切的平面构成的空间,是流形在某一点处线性化的向量空间。流形上一点的切空间记作
  • 李代数(Lie algebra):流形在其幺元(Identity)处的切空间,可以理解为流形在其“原点”处线性化的向量空间。流形的李代数可记作

需要注意的是,流形的组合操作类似矩阵乘法,一般情况并不满足交换律。
实际上李群的概念并不是具体指代一种集合,而是说符合上述性质的一类抽象的集合,具体在现实中可能有很多种符合上述条件的集合。这些集合上很多操作都是非线性的,例如最常见的姿态表示的空间中旋转的组合都是采用乘法叠加的,这就为许多线性的信号处理的方法带来了麻烦。而在流形切空间上进行姿态的线性处理是一个非常合适的解决方法。虽然如扩展Kalman也可以直接对当前姿态状态求Jacobian近似线性化,但是流形切空间的优势在于由于流形上每一点总是相似的,其切空间也是相近的,这样其非线性程度远小于直接线性化。

阅读全文 »

问题提出

在之前ESKF或者EKF算法中采用四元数对姿态进行估计时,由于采用的是六轴传感器,Yaw轴的数据仅来源于Kalman的预测过程。在最后更新状态一步由于姿态融合的非线性,在加速度计数据通过线性融合进入四元数时会出现Yaw轴的额外偏移,使得最后积分结果偏离了角速度计积分出的Yaw轴结果。具体表现为当加速度计与角速度计数据较为不匹配时(例如受到冲击),Yaw会出现较大的偏移。

为了解决非线性带来的影响,除了消除线性更新中对于Yaw轴旋转的分量外,还需要进一步使用迭代Kalman滤波器(Iterated Extended Kalman Filter)的方法改进原有算法。

原理

EKF算法更新环节中中,我们在工作点附近用线性过程替代实现线性的融合,而迭代Kalman滤波器的思路是不改变模型采用数值迭代的方法隐式地逼近状态估计值,即通过某种非线性的方法调整状态使得观测值和预测值两者与实际值之间的误差最小化。在数学上,令[1]

如果假设Z的分布符合,则在最大似然准则下可以取令Z的似然函数最大化时的状态值作为非线性的观测结果,也即最小化二次型

取其导数为0的点作为结果,带入后验方差的计算中可推导出与传统Kalman滤波器一样的方差更新公式。而对于状态值的更新则采用高斯-牛顿法求解,若令

根据高斯-牛顿法的迭代过程,状态值的迭代式为

代入经过推导可以得到迭代式

另外如果结合之前的误差状态Kalman滤波器其迭代过程依然类似,最主要的区别仅在于与后面两项之和是在流形上相加[2],当然也有为了进一步理想化非线性环节将一项也改写为流形上操作的[3]

阅读全文 »

原始算法

求某个数的平方根倒数是一个十分常见且高频的操作,比起直接调用数学库里的sqrt函数,一个显著快速的方法是这样的

1
2
3
4
5
6
7
8
float InvSqrt(float x){
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f-xhalf*x*x);
return x;
}

实际上这个算法可以说是为了性能完全牺牲了解释性,因为绝大多数人第一次看到它的时候可能完全摸不着头脑。本文除了详细解释算法的原理以外,还希望揣测算法编写者的动机,并在其他的数值算法性能的的优化上给出指导。

原理

阅读全文 »