利用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,是一个非常好用的代理软件
安装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
启动程序,然后会出现如下情况,并且会有一些开始使用的提示
然后如果是初次使用的话,需要进行一些基础的配置
在终端中输入如下指令,打开配置文件
1vim /etc/profile.d/clash.sh
将其中的所有 127.0.0.1 修改为自己的 ip 地址 ...
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,并且设置为外部时钟源
然后配置时钟树
一个需要注意的问题在生成代码之后,在第一次编译时会有一个报错,就是找不到对应的启动文件,也就是 startup 开头的汇编文件( startup_stm32f407xx.s ),是用来启动整个项目的,这个文件可以在 CubeMX 保存在 C 盘中的系统文件中找到
开启调试在 SYS 中的第一个选项 Debug 中选择 Serial Wire 即可开启 SWD 的调试,如下
时钟树的配置时钟介绍时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。
STM32本身十分 ...
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) ...
C语言可变参数的原理及实现
前言使用过 C 语言的人都会知道 printf 函数,它的参数中有固定参数 format 和可变参数 ... ,那 format 后面的参数个数不确定,类型也不确定,这些参数都存放在栈中。在 format 中在特定的位置指定对应可变参数的类型,也就是根据 format 里的格式依次将数据取出
原理所有可变参数都存放在栈中。在 format 中在特定的位置指定对应可变参数的类型,也就是根据 format 里的格式依次将数据取出。而取出的动作需要用到 va_arg va_list va_end 这些宏定义,而且取出可变参数的时候,就相当于是指针指向栈中存放数据的位置,然后将指针不断移动来取出数据。
所以就需要对应着可变参数的数量,一定要注意,一旦出现可变参数数量不对应的情况,那就会产生 crash ,主要还是由于参数的数量如果少于使用参数的数量时,就会导致访问栈内存溢出,从而导致 crash
由于参数分为两个部分:固定参数和可变参数,至少需要有一个固定参数,可变参数的数量可以有多个,声明中使用 ... 表示
va_list1typedef char * va_list;
实际上就是一个指针 ...