串联式轮足机器人控制
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 ...
Spline
Bezier CurvesLerp由两个点组成的 Bezier Curve,定义表达式如下
P(t)=(1-t)P_0+tP_1Quadratic Bezier Curve由三个点组成的 Bezier Curve。该曲线中,每两个相邻点之间通过 Lerp 连接,得到中间点,而中间点经过 Lerp 处理之后可以得到最终的位置点
P(t)=(1-t)((1-t)P_0+tP_1)+t((1-t)P_1+tP_2)\\P(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2Cubix Bezier Curve由四个点组成的 Bezier Curve。同上述 Quadratic Bezier Curve 类似,定义表达式如下
P(t)=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3上述的公式可以简化如下
P(t)=P_0+t(-3P_0+3P_1)+t^2(3P_0-6P_1+3P_2)+t^3(-P_0+3P_1-3P_2+P_3)\\P(t)=\begin{bmatrix}1&t&t^2&t^3\end{bmatrix}\begin ...
ubuntu上配置ipopt和casadi求解二次规划
前言二次规划问题是是很多机器人控制器中所涉及到的问题,好的求解方式也非常重要。这里使用 casadi 来实现二次规划的求解
ipopt 安装安装依赖由于需要编译 C++,所以需要一些基础的依赖
1234apt-get updateapt-get -y upgradeapt install build-essentialapt-get install -y gcc g++ gfortran git patch wget pkg-config liblapack-dev libmetis-dev libblas-dev vim
下载所需要的代码文件一共有 5 个比较重要的包
12345git clone https://github.com/coin-or/Ipopt.git # ipoptgit clone https://github.com/coin-or-tools/ThirdParty-ASL.git # ThirdParty-ASLgit clone https://github.com/coin-or-tools/ThirdParty-HSL.git # ThirdParty ...
Linux系统配置clash
前言在 Linux 上进行项目开发时,经常会用到 github 来进行对项目的管理,但是苦于没有好的代理,经过一番查找,找到了 clash,是一个非常好用的代理软件
安装支持主要是需要用到 curl 工具,所以直接在命令行中输入如下代码即可
1sudo apt-get install curl
安装clash文件下载: https://zywang.lanzn.com/iPMwp2aneodc
下载完成之后,直接将其解压到 Documents 目录下,保证自己不会误删这个文件
使用clash使用 ctrl-alt-t 打开终端,然后进入该文件目录中,按照里面的 readme.md 文件做一些配置
在终端输入
1vim .env
使用 vim 修改该配置文件,将其中的 CLASH_URL 修改为自己的订阅地址,并且将 CLASH_SECRET 设置为一个比较简单的就行,例如 123。然后保存退出即可
之后在终端中输入
1sudo bash start.sh
启动程序,然后会出现如下情况,并且会有一些开始使用的提示
然后如果是初次使用的话,需要进行一些基础的配置
在终端中输入如下指令,打 ...
clang-tidy配置
前言介绍Clang-Tidy 是一个由 LLVM 项目提供的开源静态分析工具,用于进行静态代码分析和代码质量改进。利用 Clang 编译器强大的功能来对 C++ 代码进行静态分析,并且提供一系列代码改进建议和警告
Clang-Tidy 是基于 Clang 的 AST 抽象语法树进行分析的,并且能检测到许多常见的编码错误和代码风格问题,包括语法,逻辑,性能问题和风格问题等
安装windows
Download LLVM releases
直接从上述网站上找到一个对应的发行版安装即可
然后在命令行中输入如下指令来查看是否安装完成,一般来说安装完成之后需要重新启动一下
1clang-tidy -version
ubuntu
LLVM
根据该文章的内容来安装
安装最新版 LLVM,需要注意,该指令只能在 bash 中使用
1sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
安装 Clang-format
1apt-get install clang-18 clang-tools-18 clang-18-doc ...
clang-format配置
前言简介Clang-format 是一种代码格式化的工具,可以用来格式化各种代码,支持的语言如下
C/C++
Java
JavaScript
Objective-C
Protobuf
C#
Clang-format 的配置文件可以取名为 .clang-format 或者 _clang-format ,该文件被放在项目的根目录下,一般来说 Clang-format 会自己去寻找配置文件的
安装windows
Download LLVM releases
直接从上述网站上找到一个对应的发行版安装即可
然后在命令行中输入如下指令来查看是否安装完成,一般来说安装完成之后需要重新启动一下
1clang-format -version
ubuntu
LLVM
根据该文章的内容来安装
安装最新版 LLVM,需要注意,该指令只能在 bash 中使用
1sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
安装 Clang-format
1apt-get install clang-18 clang-tools-18 c ...
STM32CubeMX入门
前言cubemx是一个可以自动生成代码的单片机学习和使用的软件,非常方便,但同时配置时需要注意芯片以及外设的各个引脚的配置以及使用情况
C语言:内存四区
下载直接在官网上下载
基础配置 RCC 配置需要完成的如下
新建工程,选择 MCU 或者 ST 芯片
在右侧查找自己所使用的芯片型号,然后选择对应的芯片
打开 RCC,将始终源设置为外部时钟,有两种即 HSE 和 LSE,即高速外部时钟和低速外部时钟。如果板子上添加有晶振的话一般需要此设置,一般是设置外部高速时钟为谐振器(包括晶振和陶瓷)。
然后配置时钟树
一个需要注意的问题如果在中文路径下,在生成代码之后,在第一次编译时会有一个报错,就是找不到对应的启动文件,报错的具体内容为 xxx.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
实际上这个错误就是就是 startup 开头的汇编文件 startup_stm32f407xx.s 没有添加到整个项目中,这个文件是用来启动整个项目的,这个文件可以在该项目地址下的 \M ...
GPIO八种工作模式
前言简介GPIO 是通用输入输出端口的简称,可以通过软件控制其输出和输入。stm32 芯片的 GPIO 引脚与外部设备相连来实现与外部的通信,控制以及信息的采集功能
上拉和下拉当闭合上图中的 VDD 处的开/关时,此时设置为上拉通路导通,这时候如果不接入外设或者电路断开时,整条回路的电压时断路时的电压,也就相当于电阻不存在,这时候中间处的电平被拉高为 VDD 的电平,也就是处于高电平
如果闭合 VSS 处的开关时,也就是打开下拉电阻,这时候没有外部输入的时候,中间点处电压为 VSS
实际上在 stm32 内部的上拉实际上是一个弱上拉,也就是通过上拉电阻的电流很小,如果想要输出一个大电流,就需要外接上拉电阻了,其实就是增加导线的输出电流。而对于下拉电阻,是让 stm32 的 CPU 引脚输出低电平,结果由于后续电路影响输出的低电平达不到 GND。这时候接入下拉电阻是为了降低导线的输出电流。当上下拉电阻都不开启,此时是浮空模式,引脚的电压是不确定的,此模式下的管脚电压会时不时改变
在 stm32 中上下拉以及浮空模式的配置是通过 GPIOx_CRL 和 GPIOx_CRH 寄存器控制的
...
IIR滤波器设计
前言IIR(Infinite Impulse Response)数字滤波器是指无限长冲激响应数字滤波器,因其具有良好的幅频响应特性,被广泛应用于通信、控制、生物医学、振动分析、雷达和声呐等领域
IIR滤波器的设计可以通过设计一个模拟滤波器,进而利用脉冲响应不变法或者双线性变换法来进行数字滤波器的设计。
设计思路通常利用模拟滤波器的理论和设计方法来设计 IIR 数字滤波器。设计过程是:先根据技术指标要求设计出一个相应的模拟低通滤波器,得到模拟低通滤波器的传递函数 $H(s)$ ,然后再按照一定的转换关系将设计好的模拟滤波器的传递函数转换为数字滤波器的系统函数 $H(z)$ 。转换方法有两种:脉冲响应不变法和双线性映射法
利用模拟滤波器设计数字滤波器,就是从已知的模拟滤波器传递函数 $H(s)$ 设计数字滤波器传递函数 $H(z)$ ,这是一个由 s 平面到 z 平面的映射变换,这种映射变换应该遵循两个基本原则
$H(z)$ 的频响要能模仿 $H(s)$ 的频响,即 s 平面的虚轴应该能映射到 z 平面的单位圆 $e^{j\omega}$ 上
$H(s)$ 的因果稳定性映射到 $H(z) ...













