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%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/,这个版本是 ubuntu20.04
ros2 安装可以参考 https://seashore.top/Blog_ButterFly/2024/03/24/ros2%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/,这个版本是 ubuntu22.04
w ...
进入ubuntu之后必做的配置
安装显卡驱动众所周知,在 ubuntu 上很多项目都需要利用 CUDA 调用 GPU 来进行高效的并行计算,CUDA通过CPU任务分发和GPU并行处理的方式,显著提升计算效率,尤其在需要大规模并行计算的人工智能和深度学习领域发挥着关键作用。但是想要使用 CUDA 就需要安装 NVIDIA 的显卡驱动,但是很多时候安装就很容易出问题,所以如果要用的话,就把它作为第一件事,降低时间成本。
查找驱动在 NVIDIA 官网的驱动页面,可以自己选择手动搜索驱动程序,根据自己电脑的显卡型号(可以上网查查,或者查看购买记录),搜索适合自己显卡的驱动
查看合适的版本号需要利用外部的工具来查看合适的 NVIDIA 合适的版本号,ubuntu-drivers-common 是 ubuntu 系统中用于管理硬件驱动的核心工具,特别是针对专有驱动程序(如 NVIDIA/AMD 显卡驱动、无线网卡驱动等)。它提供了 ubuntu-drivers 命令行工具,能够自动扫描硬件并列出可用的驱动版本(包括开源和专有驱动)
12sudo apt install ubuntu-drivers-commonubuntu-d ...
状态估计器
前言状态估计是根据可以获取的测量数据估算动态系统内部状态的方法,对系统的输入和输出进行测量而得到的数据只能反映系统的外部特性,而系统的动态规律需要通过内部状态变量来描述,因此状态估计对于系统控制很重要。
状态估计器介绍状态估计器是控制系统和信号处理中的一个重要组件,用于根据系统的测量数据和数学模型来估计系统的内部状态
主要功能
从带有噪声的观测数据中推断系统的内部状态
当某些状态变量无法直接测量时进行估计
提高系统状态信息的准确性
常见类型
最小二乘估计
卡尔曼滤波器
扩展卡尔曼滤波器
无迹卡尔曼滤波器
粒子滤波器
Luenberger 观测器
最小二乘估计基本最小二乘估计对于线性观测模型
y=Cx+v其中 $C$ 是观测矩阵, $v$ 是观测噪声, $x$ 是待估计状态。最小二乘法状态估计就是找到 $x$ 的最优估计 $\hat{x}$ 以最小化残差平方和
J(x)=\Vert y-Cx\Vert^2=(y-Cx)^T(y-Cx)对上述代价函数求导并令其梯度为 0,即最小化残差平方和,得到
\frac{\partial J}{\partial x}=-2C^T(y-Cx)= ...
系统的可观测性和可估计性
前言线性系统线性系统是一种数学模型,是指同时满足叠加性与均匀性的系统
叠加性:当几个输入信号共同作用于系统时,总的输出等于每个输入单独作用时产生的输出之和
均匀性:当输入信号增大若干倍时,输出也相应增大同样的倍数
非线性系统非线性系统是输出与输入不成正比的系统,特征是叠加性原理不再成立
时不变系统时不变系统,指特性不随时间变化的系统
T(x(n))=y(n)\\\Downarrow\\T(x(n-n_0))=y(n-n_0)时变系统时变系统是指系统中一个或多个参数值随着时间而变化,从而整个特性也随着时间而变化的系统,其数学模型是一个变系数线性微分方程
时变系统的特点是,其输出响应的波形不仅同输入波形有关,而且也同输入信号加入的时刻有关,这一特点增加了分析和研究的复杂性
可观测性系统是完全可观测的,当且仅当通过有限时间内的输出测量 $y(t)$ 和输入 $u(t)$ 可以唯一确定系统的初始状态 $x_0$
对于 $n$ 阶的线性时不变系统
\dot{x}=Ax+Bu\\y=Cx+Du其可观测矩阵为
O=\begin{bmatrix}C\\CA\\\vdots\\CA^{n-1} ...
将 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\times256\times256$ 种颜色,仅凭一根信号线即可实现多种多样的效果
硬件电路根据 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
$\geq80$
-
-
us
协议中每个码元都必须有低电平,每 ...
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 虚拟化技术的依赖项。启用之后可以支持更高效的 WSL2 ...
串联式轮足机器人控制
LQR 控制器设计参考 双轮足式机器人分析
连杆质心拟合
由于在分析和设计控制器的过程中,机器人的腿部连杆需要简化为一个直杆,所以就需要将原来的腿部连杆的转动惯量和质心拟合到虚拟的杆上,如图所示
这里使用机体坐标系,计算可以得到每个杆的坐标位置
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}计算其组合体的质心位置
m_1Z_{l_1}+m_2Z_{l_2}=(m_1+m_2)Z_1之后将组合体的质心映射到虚拟杆上,这里直接使用垂足进行映射,是由于点到直线,垂线最短,从而质心映射拟合时产生的误差会最小,联立如下方程求解
(\frac{Z_{1y}-Z_{ly}}{Z_{1x}-Z_{ ...
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 文件,这个文件中需要写入 ca ...
超前和滞后补偿器
拉普拉斯变换拉普拉斯变换一个定义在区间 $[0,\infty)$ 的函数 $f(t)$ ,它对应的拉普拉斯变换 $F(s)$ 定义为
F(s)=\int_0^{\infty}f(t)e^{-st}dt$F(s)$ 称为 $f(t)$ 的象函数,而 $f(t)$ 称为 $F(t)$ 的原函数,这个变换过程通常记作 $F(s)=\mathcal{L}[f(t)]$
拉普拉斯逆变换拉普拉斯逆变换就是已知上述的 $F(s)$ 求解 $f(t)$ 的过程,公式如下
f(t)=\frac{1}{2\pi j}\int_{\beta-j\infty}^{\beta+j\infty}F(s)e^{st}ds记作 $f(t)=\mathcal{L}^{-1}[F(s)]$
对于比较复杂的 $F(s)$ 来说,拉普拉斯逆变换并不容易求解,所以一般会将 $F(s)$ 进行因式分解为 $\frac{1}{(s-p)^r}$ 的形式再进行求解
根轨迹根轨迹的介绍
上述系统中的闭环传递函数为
\Phi(s)=\frac{KG(s)}{1+KG(s)H(s)}而根轨迹是指当系统开环的某个参数从零变化到无穷 ...
机器学习-非监督学习
非监督学习是指在没有标签或输出变量指导的情况下,算法自行从数据中学习模式、结构和关系的过程。这种学习方式不需要预先定义好的类别或标签,而是让模型自主地从数据中探索潜在的模式和规律,但是结果往往难以解释和评估,因为发现的模式可能不易理解
聚类聚类算法是数据挖掘中的概念,指的是按照某个特定的标准把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象相似性尽可能大,同时不在同一个簇内的对象之间的差异尽可能大
样本的距离度量对于样本之间的距离函数 $dist(x_i,x_j)$ 应该满足一定的性质:
非负性 $dist(x_i,x_j)\geq0$
同一性 $dist(x_i,x_j)=0$ 当且仅当 $x_i=x_j$
对称性 $dist(x_i,x_j)=dist(x_j,x_i)$
直通性 $dist(x_i,x_j)\leq dist(x_i,x_k)+dist(x_k,x_j)$
对于距离的度量方法
欧氏距离(Euclidean Distance):两点之间的直接距离 $d(x,y)=\sqrt{(x_1-y_1)^2+…+(x_n-y_n)^2}$
曼哈顿距离(Man ...
概率分布
前言概率分布(probability distribution)是给出事件发生的概率的函数,它是一种通过样本空间(sample space)和事件的概率描述随机事件的方式,下面有一些需要了解到的概念
边缘分布
假设有一个和两个变量相关的概率分布 $p(x,y)$ ,关于其中一个特定变量的边缘分布则为给定其他变量的条件概率分布如下
p(x)=\sum_yp(x,y)=\sum_yp(x\vert y)p(y)
偏度
偏度(Skewness)衡量数据分布的对称性,计算公式如下
Skewness=\frac{E[(x-\mu)^3]}{\sigma^3}
$\mu$ 是均值
$\sigma$ 是标准差
$E$ 是期望值
$Skewness=0$ 分布对称
$Skewness>0$ 分布右偏,右侧尾部长
$Skewness<0$ 分布左偏,左侧尾部长
峰度
峰度(Kurtosis)反映数据分布的尖锐程度和尾部厚度
Kurtosis=\frac{E[(x-\mu)^4]}{\sigma^4}
$Kurtosis=3$ 正态分布的峰度
$Kurtosis>3$ 分布更 ...
机器学习—监督学习
前言监督学习是利用一组已知类别的样本(即已标注的训练数据)来调整分类器(或模型)的参数,使其达到所要求的性能。在监督学习中,每个训练样本都包含一个输入对象(如向量、图像、文本等)和一个期望的输出值(也称为标签或监督信号)。模型通过学习这些输入输出对之间的关系,从而能够对新的、未标注的数据进行预测或分类
监督学习的原理基于模型对输入数据的学习过程。通常一个监督学习算法会使用某种数学模型(如神经网络、决策树、支持向量机等)来拟合训练数据。通过调整模型的参数,使其在训练数据上达到最佳性能(如最小化损失函数),从而能够对新的数据进行准确的预测或分类
统计检验均值检验(T 检验)T 检验的原理是通过计算 T 统计量来比较两个样本均值之间的差异是否超出了随机误差范围,从而判断差异是否显著。它基于样本数据,通过计算 T 统计量和对应的P值,来判断两组数据的均值是否存在显著差异
T 检验类型
单一样本:用于检验一个样本的均值是否与一个已知的总体均值存在显著差异
\mu=\frac{\sum^n x_i}{n}\\\bar{x}=\frac{\sum^k x_i}{k}\\s=\sqrt{\f ...
机器人轨迹规划
三次多项式插值轨迹三次多项式
位置表达式
q(t)=k_0+k_1t+k_2t^2+k_3t^3速度表达式
\dot{q}(t)=k_1+2k_2t+3k_3t^2加速度表达式
\ddot{q}(t)=2k_2+6k_3t其中 $k_0\sim k_3$ 是未知系数
计算
给定起始和结束的位置,速度和轨迹的时间,可以构造出如下几个方程
q(t_0)=q_0\\q(t_1)=q_1\\\dot{q}(t_0)=\dot{q}_0\\\dot{q}(t_1)=\dot{q}_1\\t_1-t_0=T假设初始时间 $t_0$ 为 $0$ ,则上述方程写作矩阵格式为
\begin{bmatrix}1&0&0&0\\0&1&0&0\\1&T&T^2&T^3\\0&1&2T&3T^2\end{bmatrix}\begin{bmatrix}k_0\\k_1\\k_2\\k_3\end{bmatrix}=\begin{bmatrix}q_0\\\dot{q_0}\\q_1\\\dot{q_1}\end{bmatrix}求解得到如下结果
\left\{\begin{aligned}&k_0 ...
利用tensorflow.keras搭建神经网络
前言介绍在无数深度学习的框架中,Keras 是为人类设计的 API,它提供一致且简单的 API,它将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈
Keras 与底层深度学习语言(特别是 TensorFlow)集成在一起,所以它可以让用户实现任何可以用基础语言编写的东西
安装首先是安装 Python,然后安装对应的包即可
1pip install tensorflow
神经网络神经元模型神经元模型是组成神经网络的最基本单位,它起初来源于人体,模仿人体的神经元,功能也与人体的神经元一致,得到信号的输入,经过数据处理,然后给出一个结果作为输出或者作为下一个神经元的输入
神经元可以单方向的传输信号,一个神经元有多个树突,只有一个轴突,轴突尾端有多个轴突末梢给其他多个神经元传递信息
一个简化的神经元模型如下,是一个包含输入,输出与计算的模型。输入对应着神经元的树突,计算对应着细胞核,而输出对应着轴突。连接是神经元中最重要的东西,每一个连接上都有一个权重,一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好
123456789101112fl ...
















