makefile编写
功能
makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章。Makefile执行之后所进行的操作是编译和链接,就是先将源文件编译为中间文件(object file),然后把大量的中间文件链接起来合成执行文件
规则
如果这个工程没有编译过,那么我们的所有源文件都要编译并被链接(按需)
如果这个工程某些源文件被修改,那只编译被修改的源文件,并链接目标程序
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的源文件,并链接目标程序
基本格式
123target ...: prerequisites ... command ...
target 目标文件,是命令执行后生成的目标,可以是 Object File ,也可以是执行问价,还可以是一个标签,类似于 clean
prerequisites 依赖,也就是生成目标文件所需要的文件或者是目标
command make 需要执行的指令,可以是任意的 shell 指令
核 ...
DOB扰动观测器
GitHub - Luo25177/modelControl
前言——一些用到的概念
最小相位系统:对于FIR系统(没有极点),如果系统函数的所有零点都位于单位圆内,则称该系统为最小相位系统。如果系统函数的所有零点都位于单位圆外,则称该系统为最大相位系统。如果一部分零点位于单位圆内,一部分零点位于单位圆外,则称该系统为混合相位系统或非最小相位系统。对于IIR系统(存在极点),如果系统函数的所有零点和极点都在单位圆内,则称该系统为最小相位系统。也就是相频特性 φ(w)\varphi(w)φ(w) 在 w=0w=0w=0 和 w=πw=\piw=π 之间经历的净相位变化为零
最小相位系统主要特性
最小相位系统是因果且稳定的
其逆系统也是因果且稳定的
在所有具有相同幅频响应的零-极点系统中,最小相位系统的群时延最小
基本原理
基本思想就是将外部扰动以及模型参数变化造成的实际模型与理想模型输出的差异统统等效为控制输入,即观测出等效干扰,在控制中引入等量的补偿,实现对干扰完全抑制。干扰观测器的基本思想,系统实际控制输入与计算输入(由系统标称模型计算得到)的差值,来得到扰动和不确定 ...
IMU滤波
前言
向量叉乘
二维
a=[x1y1],b=[x2y2]⇓a×b=x1y2−y1x2a=\begin{bmatrix}x_1\\y_1\end{bmatrix},b=\begin{bmatrix}x_2\\y_2\end{bmatrix}\\\Downarrow\\a\times b=x_1y_2-y_1x_2
a=[x1y1],b=[x2y2]⇓a×b=x1y2−y1x2
三维
a=[x1y1z1],b=[x2y2z2]⇓a×b=[y1z2−z1y2z1x2−x1z2x1y2−y1x2]a=\begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix},b=\begin{bmatrix}x_2\\y_2\\z_2\end{bmatrix}\\\Downarrow\\a\times b=\begin{bmatrix}y_1z_2-z_1y_2\\z_1x_2-x_1z_2\\x_1y_2-y_1x_2\end{bmatrix}
a=⎣⎢⎡x1y1z1⎦⎥⎤,b=⎣⎢⎡x2y2z2⎦⎥⎤⇓a×b=⎣⎢⎡y1z2−z1 ...
stm32学习
stm32f4内部的flash
stm32芯片内部有一个flash存储器,主要用于存储编译之后烧录进来的代码,由于flash存储器的内容在掉电之后不会丢失,芯片重新上电复位之后内核可以从内部flash中加载代码并运行。
除了使用外部的工具(如下载器)读写内部FLASH外,STM32F4芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部FLASH比外部SPI-FLASH的速度快的多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算机机密信息并记录到某些区域,然后删除自身的部分加密代码,这些都涉及到内部FLASH的操作。
芯片内部存储的分区
主存储器
介绍芯片时提到的flash的内存的大小都是指主存储器的大小,用于存放代码和数据常量(例如const类型的数据)。
主存储器分为256页,每页大小2KB,一共512KB。这个分页就是 ...
轮式底盘解算
四舵轮底盘控制
四舵轮底盘就是由四个舵轮来控制底盘运动的,一般在进行速度分析时,会将底盘的整体运动映射到四个轮子的单独运动上去
一般来说是将直角坐标的速度和角速度分别映射到轮子上,进行累加得到最终的结果
直角坐标速度分析
直角坐标的速度分析相对来说比较简单,直接就是坐标平移,所以就是
vixx=Vxvixy=0viyx=0viyy=Vyv_{ixx}=V_x\\v_{ixy}=0\\v_{iyx}=0\\v_{iyy}=V_y\\
vixx=Vxvixy=0viyx=0viyy=Vy
其中 viyxv_{iyx}viyx 就是机体的 xxx 方向速度向轮子 yyy 方向速度的映射
角速度分析
角速度分析实际上就是把机体转动的角速度通过轮子的运动来实现,也就是
viw=Liwv_{iw}=L_iw
viw=Liw
再将其分解到直角坐标系中
vixw=wLicos(φ−90)viyw=wLisin(φ−90)v_{ixw}=wL_i\cos(\varphi-90)\\v_{iyw}=wL_i\sin(\varphi-90)
vixw=wLicos(φ−90)vi ...
传感器
激光测距仪
原理:距离大致是光速和往返时间的乘积的一半,就是测距仪和被测物体之间的距离
测量方法:实际是测量光传播的时间,用于远距离测量
DT35
参数
数据
测量范围
50~12000mm
分辨率
0.1mm
光源
红外线光源
激光等级
1
接口
IO-Link
功能
过程数据,参数设置,诊断
模拟输出端分辨率
12 bit
开关量输出
1x/2x反向脉冲:PNP/NPN(100mA)
温宽
-30~55
电压
12V~30V
多功能输入
1x4
滞后
0~11950mm
响应时间
2.5/6.5/12.5/24.5/96.5 ms
开关频率
333/100/50/25/6 Hz
输出时间
1/2/4/8/32 ms
纹波
≤5 Vpp
功耗
≤1.7 W
初始化时间
≤500 ms
预热时间
≤20分钟
重量
55g
DT50
参数
数据
测量范围
15~10000mm
工作电压
0~10V
工作温度
-30~65
分辨率
1mm
响应时间
20/30 ms ...
ros学习记录
安装
配置软件源
打开软件与更新,配置 ubuntu 的软件和更新,并且允许安装未经认证的软件
官方默认安装源
1sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
清华的安装源
1sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
中科大安装源
1sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ ...
ros2学习记录
前言
ros2 跟 ros1 相差并不是非常大,但是毕竟是一个新的机器人操作系统,相比 ros1 来说强大的很多,总结就是
节点干掉了 Master
通信换为了 DDS
核心概念没变化
编程难度上升
github仓库
这是我自己的学习之后写的代码 github
注意
需要注意在 package.xml 和 CMakeLists.txt 中声明所需要的依赖
安装
设置编码
1234sudo apt update && sudo apt install localessudo locale-gen en_US en_US.UTF-8sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8export LANG=en_US.UTF-8
添加源
123sudo apt update && sudo apt install curl gnupg lsb-releasesudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/r ...
网站引导页和分站制作
前言
一开始是看到了这个博客 花猪のBLOG,大受震撼,但是这个博客所用的方法需要在 ubuntu 系统上建立一个服务器,还是挺复杂的,然后就看到了这篇文章 Hexo自定义页面做首页,然后将两篇文章的内容作为参考,做出了我的效果,因此记录下来
新建仓库
假设你已经做好了一个网站,并且是基于 github 的,那么在 github 上新建一个仓库,名为 Blog 可以是其它名字,然后把你自己创建网站所用的 github 仓库清空,也就是 xxx.github.io ,这个后续会用来作为你的引导页的仓库
修改站点配置文件
然后在你已经做好的网站本地的站点配置文件中按照如下修改
12url: https://xxx.github.ioroot: /Blog/
然后找到其中的 deploy 做出以下修改
1234deploy: type: git repository: https://github.com/xxx/Blog.git branch: main # 这里看你的仓库里有哪个分支了,尽量保证你的仓库内有一个分支
对于你的主题内调用的本地的 css 和 js 文件,需要在前面加一 ...
ctags使用
安装
在linux系统中安装只需要一行指令
1sudo apt install ctags
指令
终端中指令
创建索引文件
ctags 其它的指令使用的前提都是为操作的文件建立索引文件的基础上进行的,所以在使用 ctags 对文件进行检索之前,先执行命令如下指令来创建索引文件
1ctags -R .
可以在该指令之后添加参数,参数具体说明看下述 ctags参数,例如
1ctags -R --c++-kinds=+p --fields=+iaS --extra=+q /usr/include
生成的tags文件所描述的符号信息都只针对当前项目源代码树中的文件,而不包含任何外部文件的符号信息,例如标准头文件(例如 <stdio.h><stdlib.h> )等,因此 vim 无法在外部头文件中找到符号
利用 ctags 查找变量或者函数名
1vi –t variable_name/function_name
ctags参数
--list-maps ctags可以根据文件的扩展名以及文件名的形式确定该文件是何种语言。用–list-maps查看默认情况下支持那些语言,每 ...
opencv-cpp
对像素点进行处理,保证rgb数值不超过范围
12345678int stemp(int a){ if (a > 255) a = 255; if (a < 0) a = 0; return a;}
读入图像和想要实现的操作,实现相应的操作,例如灰度图,HSV图,LAC图等
12345678910111213141516171819202122232425262728293031void operate(cv::Mat image, const std::string operate, int light = 0, float contrast = 1){ cv::Mat dst; if (operate == "LAC") { int i, j; multiply(image, cv::Scalar(contrast, contrast, contrast), dst); dst = dst + c ...
C语言基础
编译器
文本编辑器
用于对 C 语言代码进行编写,一般来说使用的是 vscode 或者是 vs , devc++ 之类的,还有在终端上可以直接使用的 vim 之类的编辑器。编辑器的类型无关紧要,主要是用于编写 C 语言代码
编译器
各种编程语言写完之后都不可能直接运行,而是需要编译器来把代码编译成电脑能识别的语言——机器语言,是二进制语言,只有 0 和 1 组成。所以编译的过程相当于是翻译,把 C 代码给翻译成机器代码了。
最常用的就是 GNU 的 C/C++编译器,mingw 中实际上就是 GNU 的编译器
在 GNU 中的编译指令为
12gcc a.c -o b.exe // windows为.exe后缀gcc a.c -o b.out // linux为.out后缀
C语言程序结构
C程序主要包括下列指令
预处理指令
就是文件上部以 # 开头的指令,例如
1#include <stdio.h>
预处理指令会在预编译的时候就把对应文件中的代码复制过来,预编译指令为
1gcc -E a.c -o b.i
之后打开 b.i 文件将会看到文件中不仅有 a.c 中的内容,也有 ...
ButterFly解决公式显示问题
公式渲染
首先需要换一个渲染器,要先把安装的渲染器卸载,然后安装 hexo-renderer-markdown-it-katex ,在根目录打开终端输入指令
12npm un hexo-renderer-marked --savenpm i hexo-renderer-markdown-it-katex --save
然后在站点配置文件添加下列内容
1234567891011markdown: render: html: true xhtmlOut: false breaks: true linkify: true typographer: true plugins: anchors: level: 1 collisionSuffix: ''
如果在之前配置过 MathJax 的话,在主题配置文件中找到,并修改为如下
12345678910# MathJaxmathjax: enable: false per_page: false# KaTeXkatex: enable: true per_page: fal ...
Hexo加载动画
前言
hexo 默认是没有加载动画的,偶然在做博客时看到了这个教程,在此基础上做了一些小改动,效果很不错,所以记录下来
原文链接: Hexo站点加载动画修改
加载动画设置
创建js文件
在 themes\butterfly\layout\includes\loading 文件夹下创建一个名为 loading.ejs 的文件,并且写入
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<% if (theme.preloader.enable) { %><div id='loader'> <% if(theme.preloader.layout == 'gear' ) {%> <div class="outer_box"> <div class='loader_overlay'>&l ...
Hexo动态效果
雪花动态效果
在做 ButterFly 美化过程中,看到了这个博客,漫天飘落的雪花效果很不错,所以记录一下
原文: Hexo添加雪花动态效果背景
添加雪花动态效果
首先在 \themes\butterfly\source\js 目录下新建一个文件 snowflake.js ,然后将下列内容写入文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|Brows ...
Hexo标题旋转风车
前言
这个特效是看到了别人的博客之后学到的,很不错,可以看看原文 Hexo小标题旋转风车设置
为了以后自己换电脑的话方便找,所以做一些记录
设置旋转风车
打开主题配置文件,查找 beautify 并且修改为如下代码
123beautify: enable: true title-prefix-icon: '\f863'
并且在 inject 的 head 处引入文件
123inject: head: - "<style>#article-container.post-content h1:before, h2:before, h3:before, h4:before, h5:before, h6:before { -webkit-animation: avatar_turn_around 1s linear infinite; -moz-animation: avatar_turn_around 1s linear infinite; -o-animation: avatar_turn_around 1s linear i ...
Hexo博客添加自定义css和js文件
创建文件
进入到主题目录资源文件夹下,也就是 themes\butterfly\source 文件夹下,然后就会看到三个文件夹 css , img , js , css 和 js 文件就可以建在这里
当然这样的话会导致主题更新的时候会把你的文件更新掉,所以可以在根目录下创建 css 和 js 文件夹,并且把对应的文件放在这里面
在引用文件时要注意,一般来说是在主题配置文件里的 inject 引入。 css 一般在 head 引入,而 js 文件一般在 bottom 中引入,当然某些特殊情况除外
使用文件
123456789101112inject: head: # 自定义css - <link rel="stylesheet" href="/css/style.css?1"> # 静态文件后面加个 ?任意内容 可以在每次更新之后用户自动重新请求. # 例如添加 ?1 ,在修改此文件后改成 ?2 ,用户访问你的网站时,不会使用本地的缓存,而是请求新的内容。没修改的话就不用动。 bottom: # 自定 ...
ButterFly导航栏居中
前言
之前样式的导航栏实际上倒也还好,只是在查找 ButterFly 美化时恰巧看到了这个,所以就做一下并且记录下来,原文请参考 butterfly博客导航栏居中
搜索按钮修改
按照如下代码修改文件 themes\butterfly\layout\includes\header\nav.pug
1234567891011121314151617181920nav#nav span#blog-info a(href=url_for('/') title=config.title) if theme.nav.logo img.site-icon(src=url_for(theme.nav.logo)) if theme.nav.display_title span.site-name=config.title #menus !=partial('includes/header/menu_item', {}, {cache: true}) ...