前馈神经网络
前言
前馈神经网络是人工神经网络的一种,研究始于20世纪60年代。其结构由输入层、隐含层和输出层单向连接组成,信号通过有向无环图单向传播,各层神经元仅与相邻层建立连接。前馈神经网络的核心特征就是信息的单向传递,即输入数据从输入层流向隐藏层,最终到达输出层,不存在层与层之间的反向连接或循环连接。
如图中所示,每个圆圈都是一个神经元,神经元是模拟生物神经元的接收-处理-输出的结构,通过接收来自于上一层的信号,每个输入对于一个可学习的权重和偏置参数,输出结果为 z=w⃗x⃗+bz=\vec{w}\vec{x}+bz=wx+b 。之后加上激活函数,激活函数对上述的线性输出结果进行非线性变换,输出结果为 a=f(z)a=f(z)a=f(z) ,这个主要是向网络中引入非线性,让网络能拟合复杂的函数模型。神经网络学习的本质就是不断调整这些权重和偏置的过程。
网络结构
输入层
输入层是网络的数据入口,接收原始的特征数据,不进行任何计算操作,神经元数量等于输入数据的特征维度。输入层的神经元只起到数据传递的作用,无激活函数
隐藏层
隐藏层是位于输入层和输出层之间的核心计算层
层数与神经元数量:隐藏层的 ...
循环神经网络
前言
循环神经网络 RNN 是一种对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。它的核心特点就是网络中存在循环,可以使得信息可以从当前步骤传递到下一步骤,从而能够记住之前的信息。相当于是它是一个有记忆的网络,特别适合处理句子、时间序列等有前后依赖关系的数据。
传统的神经网络都有一个主要局限:假设输入是相互独立的,没有记忆功能,每次输入单独处理。循环神经网络中引入了上下文信息,作为当前时间步下网络的输出,传递给下一个时间步
一些经典的 RNN
Elman RNN
Elman RNN 是最早的 RNN 架构之一,目的就是为了处理时间序列数据并且学习其中的时间依赖模式。最核心的创新就是引入了上下文单元,也就隐藏状态,这个状态会在时间步之间循环传递,作为网络的记忆。
RNN 的核心是循环单元,单步循环单元的输入输出关系如下
将循环神经网络的隐藏层展开,展开的示意图如下所示
如图中所示,其中 x(t)x(t)x(t) 是 t 时刻的输入向量, h(t)h(t)h(t) 是 t 时刻的隐藏状态, y(t)y(t)y(t) 是 t 时刻的输出,每个时刻都是共享同一组参数。 ...
卷积神经网络
前言
卷积神经网络时一种在计算机视觉领域的深度学习的模型,它的设计主要来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络是多层感知机的变种。
基本概念
不变性
不变性意味着即时目标的外观发生了某种变化,但是依然可以识别出来。不变性在图像识别中是一种很好的特性,都希望图像中的目标无论是被平移、旋转还是缩放,甚至是不同的光照条件、视角下都能被很好的识别出来。
平移不变性:识别物体的能力不因物体在图像中的位置变化而改变。
在卷积层中,使用相同的卷积核在图像中滑动,无论特征出现在哪里都会被识别到
在池化层中,对局部区域进行下采样,即使特征有微小偏移,池化后也能得到相同输出
旋转不变性:识别物体的能力不因物体的旋转角度而改变
在训练时随机旋转图像
旋转等变卷积
尺度不变性:识别物体的能力不因物体在图像中的大小变化而改变
将输入图像缩放成不同的尺寸,然后分别送入网络检测,最后合并结果
在训练时随机缩放图像,迫使网络学习不同尺度下识别物体
光照不变性:识别物体能力不因光照条件而 ...
傅里叶变换
前言
傅里叶变换是一种将信号从时间域转换到频率域的数学方法,傅里叶变换的核心思想就是:任何复杂的信号,都可以分解为一系列不同频率、不同振幅、不同相位的简单正弦波的叠加。在频域中,横轴是频率,对应的纵轴就是该频率的强度。傅里叶变换有连续和离散的两种形式。
卷积
线性卷积
在离散时间信号处理中,对于输入信号 x[n]x[n]x[n] ,系统的单位脉冲响应为 h[n]h[n]h[n] ,那么系统的输出信号就是 x[n]x[n]x[n] 和 h[n]h[n]h[n] 的线性卷积
y[n]=∑k=−∞∞x[k]h[n−k]y[n]=\sum_{k=-\infty}^{\infty}x[k]h[n-k]
y[n]=k=−∞∑∞x[k]h[n−k]
当序列移动时,多出来的部分就是 0,结果的序列通常会比原序列长,结果的长度为 M+N−1M+N-1M+N−1 ,其中 MMM 和 NNN 就是两个输入序列的长度
循环卷积
对于上述的卷积信号,对于两个长度为 NNN 的输入信号 x[n]x[n]x[n] 和 h[n]h[n]h[n] ,循环卷积的公式为
y[n]=∑k=0N−1x[k]h[(n−k) ...
Clion+AT32 配置
前言
最近在做一个基于 AT32 的 FOC 的项目,在开始写代码之前对整体的代码框架构思了一下,有些部分打算用 C++ 来写。另外由于之前的经验,用 keil 中的 arm 编译器编译出来的 C++ 的程序有很大问题,所以就打算使用 Clion 来做这个。网络上很多教程说的不是很清楚,或者说并没有把整个部分做完整,所以打算自己记录下来。
软件版本
Clion 2025.2.4
AT32 WorkBench 1.2.00
芯片型号
芯片型号为 AT32F403ACGT7
编译工具配置
整个项目编译过程需要 AT32 官方提供的工具包 OpenOCD 下载支持和 arm-none-eabi-gcc 等编译器。可以直接从官网上下载,也可以点击下面的链接进行下载。
OpenOCD_v2.0.7
mingw 这个需要自己选择一个合适的版本,最新的不一定是最好的,因为 Clion 对 GDB 的支持是有版本限制的。
GNU Arm Embedded Toolchain 10.3
上述的 OpenOCD 和 mingw 是不需要自己安装的,所以它需要你将它解压到某个你熟悉的位置,方便查找, ...
webots+ros 机器人仿真
前言
之前我做机器人仿真一直是在 windows 上,利用 webots+vs 进行仿真的,但是在 vs 上进行的仿真,移植到硬件上时需要改动的东西太多,几乎得重新写一遍,所以打算在 linux 上利用 ros 进行仿真。但是问题又来了,ros 中比较常用的仿真的软件就是 gazebo,但是 gazebo 的电机模块的力矩控制在我测试之后好像是有问题的,一旦施加力矩就会疯转。后来偶然间发现 linux 上是可以使用 webots 的,而且网络上的配置资料不算少,所以就打算使用 webots 来进行仿真。
ros 安装
ros1 安装可以参考 https://seashore.top/Blog_ButterFly/2024/03/24/ros学习记录/,这个版本是 ubuntu20.04
ros2 安装可以参考 https://seashore.top/Blog_ButterFly/2024/03/24/ros2学习记录/,这个版本是 ubuntu22.04
webots 安装
直接去官网上下载安装包即可,不要直接在主页上下载最新版的,那个不一定适配你的 ubuntu 版本,所以需要 ...
进入ubuntu之后必做的配置
安装显卡驱动
众所周知,在 ubuntu 上很多项目都需要利用 CUDA 调用 GPU 来进行高效的并行计算,CUDA通过CPU任务分发和GPU并行处理的方式,显著提升计算效率,尤其在需要大规模并行计算的人工智能和深度学习领域发挥着关键作用。但是想要使用 CUDA 就需要安装 NVIDIA 的显卡驱动,但是很多时候安装就很容易出问题,所以如果要用的话,就把它作为第一件事,降低时间成本。
查找驱动
在 NVIDIA 官网的驱动页面,可以自己选择手动搜索驱动程序,根据自己电脑的显卡型号(可以上网查查,或者查看购买记录),搜索适合自己显卡的驱动
查看合适的版本号
需要利用外部的工具来查看合适的 NVIDIA 合适的版本号,ubuntu-drivers-common 是 ubuntu 系统中用于管理硬件驱动的核心工具,特别是针对专有驱动程序(如 NVIDIA/AMD 显卡驱动、无线网卡驱动等)。它提供了 ubuntu-drivers 命令行工具,能够自动扫描硬件并列出可用的驱动版本(包括开源和专有驱动)
12sudo apt install ubuntu-drivers-commonubunt ...
状态估计器
前言
状态估计是根据可以获取的测量数据估算动态系统内部状态的方法,对系统的输入和输出进行测量而得到的数据只能反映系统的外部特性,而系统的动态规律需要通过内部状态变量来描述,因此状态估计对于系统控制很重要。
状态估计器介绍
状态估计器是控制系统和信号处理中的一个重要组件,用于根据系统的测量数据和数学模型来估计系统的内部状态
主要功能
从带有噪声的观测数据中推断系统的内部状态
当某些状态变量无法直接测量时进行估计
提高系统状态信息的准确性
常见类型
最小二乘估计
卡尔曼滤波器
扩展卡尔曼滤波器
无迹卡尔曼滤波器
粒子滤波器
Luenberger 观测器
最小二乘估计
基本最小二乘估计
对于线性观测模型
y=Cx+vy=Cx+v
y=Cx+v
其中 CCC 是观测矩阵, vvv 是观测噪声, xxx 是待估计状态。最小二乘法状态估计就是找到 xxx 的最优估计 x^\hat{x}x^ 以最小化残差平方和
J(x)=∥y−Cx∥2=(y−Cx)T(y−Cx)J(x)=\Vert y-Cx\Vert^2=(y-Cx)^T(y-Cx)
J(x)=∥y−Cx∥2=(y−Cx)T(y−Cx)
...
系统的可观测性和可估计性
前言
线性系统
线性系统是一种数学模型,是指同时满足叠加性与均匀性的系统
叠加性:当几个输入信号共同作用于系统时,总的输出等于每个输入单独作用时产生的输出之和
均匀性:当输入信号增大若干倍时,输出也相应增大同样的倍数
非线性系统
非线性系统是输出与输入不成正比的系统,特征是叠加性原理不再成立
时不变系统
时不变系统,指特性不随时间变化的系统
T(x(n))=y(n)⇓T(x(n−n0))=y(n−n0)T(x(n))=y(n)\\\Downarrow\\T(x(n-n_0))=y(n-n_0)
T(x(n))=y(n)⇓T(x(n−n0))=y(n−n0)
时变系统
时变系统是指系统中一个或多个参数值随着时间而变化,从而整个特性也随着时间而变化的系统,其数学模型是一个变系数线性微分方程
时变系统的特点是,其输出响应的波形不仅同输入波形有关,而且也同输入信号加入的时刻有关,这一特点增加了分析和研究的复杂性
可观测性
系统是完全可观测的,当且仅当通过有限时间内的输出测量 y(t)y(t)y(t) 和输入 u(t)u(t)u(t) 可以唯一确定系统的初始状态 x0x_0x0
对于 ...
将 PyQt 项目编译为安装包
前言
对于做网站的我来说,有一个好用的能管理网站的图片的工具确实很实用,但是网络上比较流行的 PicGo 不能从 github 网站上读取图片,所以就是在下载 PicGo 之后是无法使用它读取到 github 上之前上传的图片的,而且我用的时候老是上传失败,所以就自己利用 PyQt 做了一个软件,用以实现这些功能,并且可以对 github 上的图床进行管理。写完测试完成之后,又想把这东西打包成安装包,那之后的使用就很方便了,所以就有了此文章
感兴趣的可以看看这个软件 GitPic
将 PyQt 项目打包为可执行文件
可以利用可视化的工具,Auto-py-to-exe,实际上也是一个基于 Pyinstaller 的工具,但是它有 Gui 界面,能更方便的打包
安装
在终端输入
1pip install auto-py-to-exe
安装完成之后,就可以在终端中输入 auto-py-to-exe.exe 打开软件
打包流程
软件如图所示
基本上只需要设置上述的几个选项
Script Location:选择脚本文件的位置,只需要选择一个脚本文件,这个脚本文件需要包含 python 的入口 ...
SK6812 炫彩灯珠控制
介绍
炫彩灯珠内置 IC,可以显示 256×256×256256\times256\times256256×256×256 种颜色,仅凭一根信号线即可实现多种多样的效果
硬件电路
根据 SK6812 的电气参数和手册上的典型应用电路来设计其硬件电路
参数
符号
范围
单位
电压
VDD
+3.7~+5.5
V
逻辑输入电压
VI
-0.5~VDD+0.5
V
工作温度
Topt
-40~+85
℃
储存温度
Tstg
-40~+85
℃
ESD耐压(设备模式)
VESD
200
V
ESD耐压(人体模式)
VESD
2K
V
控制方式
SK6812 的数据传输方式比起一般的外设来说,有点特别,每个位都是一个码元,然后通过控制码元的高低电平时间来控制该位的高低
时序表名称
min
typic
max
单位
T
1.20
-
-
us
T0H
0.2
0.3
0.4
us
T0L
0.8
-
-
us
T1H
0.6
0.67
1.0
us
T1L
0.2
-
-
us
Trst
≥80\geq80≥80
-
- ...
Windows配置WSL2+Ubuntu20.04
前言
WSL 是一个允许用户在 Windows 上运行 Linux 环境的功能,安装 WSL 之后,可以安装 Linux 发行版,并且直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,也无需承担传统虚拟机或双启动设置的费用
基础配置
配置查看
进入 PowerShell 中,终端中输入
1winver
查看 windows 的配置信息,如果是 windows11 的话是默认支持 WSL2 的,否则需要查看 OS 内部版本号,WSL2 需要内部版本号不低于 18362,否则只能安装 WSL。另外如果在 Windows Server 2019 (版本 1709+) 上安装 WSL的话,需要手动安装
启用虚拟机平台
在 PowerShell 中输入指令
1dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
这条指令用于启用 Windows 的虚拟机平台组件,是 WSL2 和 Hyper-V 虚拟化技术的依赖项。启用之后可以支持更高效的 W ...
串联式轮足机器人控制
LQR 控制器设计
参考 双轮足式机器人分析
连杆质心拟合
由于在分析和设计控制器的过程中,机器人的腿部连杆需要简化为一个直杆,所以就需要将原来的腿部连杆的转动惯量和质心拟合到虚拟的杆上,如图所示
这里使用机体坐标系,计算可以得到每个杆的坐标位置
Zl1=[l1bcosθ1l1bsinθ1]Zl2=[l1cosθ1+l2bcos(θ2+θ1−180°)l1sinθ1+l2bsin(θ2+θ1−180°)]Z_{l_1}=\begin{bmatrix}l_{1b}\cos\theta_1\\l_{1b}\sin\theta_1\end{bmatrix}\\Z_{l_2}=\begin{bmatrix}l_1\cos\theta_1+l_{2b}\cos(\theta_2+\theta_1-180\degree)\\l_1\sin\theta_1+l_{2b}\sin(\theta_2+\theta_1-180\degree)\end{bmatrix}
Zl1=[l1bcosθ1l1bsinθ1]Zl2=[l1cosθ1+l2bcos(θ2+θ1− ...
Ansys柔性体与Adams联合仿真
SW 模型导出
在 SW 中选择对应的单个零件,注意是单个零件(不论是由多少个零件合成的,都算作单个零件)这样方便导入 adams 中替换掉刚性体。将单个零件导出为 Parasolid 格式,之后便可以导入到 ANSYS 中
导入 ANSYS 中
导入模型
打开 WorkBench,选择右侧栏内的模态,双击之后出现左侧项目原理图,右键几何结构即可选择导入模型
生成模型
导入模型之后,再次右键几何结构,即可出现如下窗口,选择 DesignModeler 中编辑几何结构
进入 DesignModeler 之后,在右侧栏中选择导入,生成导入模型即可
检验模型
可在 WorkBench 中右键几何结构,选择 spaceclaim 中编辑几何结构,来检验模型,能生成模型即可,好像这一步用处不大
工程数据设置
在 WorkBench 原理图中,右键工程数据,选择编辑即可进入,这里面是零件所用的材料,也可自定义材料
如图所示,添加了一个新材料——橡胶,点击表格中源的那一项即可出现下面属性大纲,之后双击右侧栏中的项目属性,即可将其添加进来,最后可以上网查找对应的数据填入表格中即可在后续过程中使 ...
Adams 仿真入门
SW 模型装配与导出
模型装配问题
这里使用一个简单的曲柄滑块模型来进行示例,如下图所示为装配好的装配体
注意
对于多个固定在一起的零件,建议是将这几个零件重新存储为一个结构体之后再另存为一个零件,最终生成的所有零件都变成了这个零件中的特征,对应在 Adams 中就可以看到生成的这个零件中包含了多个实体,就是这多个零件,最后记得将这个零件代替这几个零件插入到装配体中。这样可以减少生成的 adams 文件的连接个数(adams 中的连接是两个零件之间的),从而使得仿真运行更快,也更不容易出错
期望在仿真时运动的连接副,就不要在 SW 中完全配合,要能在 SW 中拖动
SW 中绘制模型时,不要使用中文名称,否则导入到 adams 之后会出现文件名称显示错误的问题,到时候不好操作
在 SW 模型中固定的零件,导入到 adams 中之后是属于 ground 的实体,所以如果期望这个结构不固定的话,就不能定义为固定的零件
模型导出问题
模型导出为 adams 文件需要使用 SOLIDWORKS Motions 这个插件,而且需要使用运动算例,步骤如下
点击运动算例
选择 Motion ...
VS2022 配置 casadi 求解 NMPC 问题
前言
最近在研究 NMPC 时,找到了 casadi 这个求解库,本来是在 ros+gazebo 平台上搭建的,但是最终的运行效果不太好,所以就打算先使用自己比较熟悉的 webots+vs 平台上进行测试,之后再移植过去
部署优化求解工具 casadi
下载 ipopt 的 vs2022 预编译程序
在 ipopt 的 github 官方仓库中找到 vs2022 的预编译版本,就是基于 vs2022 已经编译好的,不需要自行编译。可以直接选择较新的版本,记得要选择后面带有 msvs2022 的压缩包
下载 casadi 的源码
在 casadi 的 github 官方仓库中找到适合的版本,下载对应的 Source Code 压缩包即可
编译
由于下载的 ipopt 不需要编译,所以就只需要编译 casadi 即可。把上述的 ipopt 和 casadi 的源码放到一个不会被删掉的地方,建议是有一个比较统一存放 C++ 依赖库的地方,如下图所示
然后在 casadi 的目录下新建一个 install 目录下,并且在 casadi 目录下新建一个 run.bat 文件,这个文件中需要 ...
超前和滞后补偿器
拉普拉斯变换
拉普拉斯变换
一个定义在区间 [0,∞)[0,\infty)[0,∞) 的函数 f(t)f(t)f(t) ,它对应的拉普拉斯变换 F(s)F(s)F(s) 定义为
F(s)=∫0∞f(t)e−stdtF(s)=\int_0^{\infty}f(t)e^{-st}dt
F(s)=∫0∞f(t)e−stdt
F(s)F(s)F(s) 称为 f(t)f(t)f(t) 的象函数,而 f(t)f(t)f(t) 称为 F(t)F(t)F(t) 的原函数,这个变换过程通常记作 F(s)=L[f(t)]F(s)=\mathcal{L}[f(t)]F(s)=L[f(t)]
拉普拉斯逆变换
拉普拉斯逆变换就是已知上述的 F(s)F(s)F(s) 求解 f(t)f(t)f(t) 的过程,公式如下
f(t)=12πj∫β−j∞β+j∞F(s)estdsf(t)=\frac{1}{2\pi j}\int_{\beta-j\infty}^{\beta+j\infty}F(s)e^{st}ds
f(t)=2πj1∫β−j∞β+j∞F(s)estds
记作 f(t)=L−1[F(s)]f(t)= ...
机器学习-非监督学习
非监督学习是指在没有标签或输出变量指导的情况下,算法自行从数据中学习模式、结构和关系的过程。这种学习方式不需要预先定义好的类别或标签,而是让模型自主地从数据中探索潜在的模式和规律,但是结果往往难以解释和评估,因为发现的模式可能不易理解
聚类
聚类算法是数据挖掘中的概念,指的是按照某个特定的标准把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象相似性尽可能大,同时不在同一个簇内的对象之间的差异尽可能大
样本的距离度量
对于样本之间的距离函数 dist(xi,xj)dist(x_i,x_j)dist(xi,xj) 应该满足一定的性质:
非负性 dist(xi,xj)≥0dist(x_i,x_j)\geq0dist(xi,xj)≥0
同一性 dist(xi,xj)=0dist(x_i,x_j)=0dist(xi,xj)=0 当且仅当 xi=xjx_i=x_jxi=xj
对称性 dist(xi,xj)=dist(xj,xi)dist(x_i,x_j)=dist(x_j,x_i)dist(xi,xj)=dist(xj,xi)
直通性 dist(xi,xj)≤d ...















