PlatformIO使用中遇到的坑
PlatformIO使用中遇到的坑
首先,最重要的多翻翻官方文档中心,VSCode上的使用说明主要可以参考VSCode章节
另外一个,除了文档,遇到问题官方的论坛PlatformIO Community也是可以帮忙的,就是除了都英文之外
根据文档中心,PlatformIO大概分为以下三个部分:
PlatformIO IDE:个人理解就是下面两个东西的打包(官方目前提供两个:VSC和CLion上的插件做的IDE)
PlatformIO Core:核心文件,提供CLI(命令行接口)供用户调用,给那种没有使用IDE的人用
PlatformIO Home:由Core提供的一个前端(图形界面,一个网页,所以说VSC在某种程度上就是一个浏览器 :) )
注意:对于PlatformIO IDE来说,只要装上插件,所有东西都会自动设置完毕,不需要重新安装PlatformIO Core
本人早几年就一直在关注PlatformIO IDE(VSCode端插件),但是当时候一直不满意,就放在VSC禁用列表中吃灰,最近捡起来一看,感觉好使多了,但是仍然遇到不少坑,遂总结如下
推荐设置
Platfor ...
V4L2接口编程
V4L2接口编程
官方文档连接:LinuxTV文档中心
参考链接:3-1.V4l2接口编程
基本使用为以下几个步骤:
打开设备
123456int fd = open("/dev/video0", O_RDWR);if(fd < 0){ perror("打开设备失败"); return -1;}
通过ioctl获取支持格式
1234567891011121314struct v4l2_fmtdesc v4fmt;v4fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//指定类型v4fmt.index = 0;//指定获取格式的序列号(有的摄像头可能有多个可支持的格式)int ret = ioctl(fd, VIDIOC_ENUM_FMT, &v4fmt);//VIDIOC_ENUM_FMT命令,获得支持格式if(ret < 0){ perror("获取失败");}printf("index=%d\n&qu ...
寒武纪嵌入式笔试
这是一篇加密文章,内容可能是个人日常吐槽或者特殊技术分享。如果你确实想看,请与我联系。非亲友团勿扰。
Leetcode
一、复杂度
时间复杂度
nnn 表示数据规模
O(f(n))O(f(n))O(f(n)) 表示运行算法所需要执行的指令数,和 f(n)f(n)f(n) 成正比。
在学术界,严格地讲, O(f(n))O(f(n))O(f(n)) 表示算法执行的上界,如:归并排序算法的时间复杂度是 O(nlogn)O(nlogn)O(nlogn) 的,同时也是 O(n2)O(n^2)O(n2)
在业界,则使用 OOO 来表示算法执行的最低上界,所以一般不会说归并排序是 O(n2)O(n^2)O(n2) 的
例子:
有一个字符串数组,将数组中的每一个字符串按照字母序排序;之后再将整个字符串数组按照字典序排序。整个操作的时间复杂度?
假设最长的字符串长度为s;数组中有n个字符串
对每个字符串排序:O(slogs)O(slogs)O(slogs)
将数组中的每一个字符串按照字母序排序:O(n∗slog(s))O(n*slog(s))O(n∗slog(s))
将整个字符串数组按照字典序排序:O(s∗nlog(n))O(s*nlog(n))O(s∗nlog(n)) (n个字符串,比较nlognnlogn ...
数据结构与算法
一、基础排序
对于排序这个问题来说,最优的时间复杂度在O(N∗logN)O(N*logN)O(N∗logN)级别的
常用排序算法时间复杂度:
排序算法
平均时间复杂度
原地排序
空间复杂度
稳定性
冒泡排序
O(n2)O(n^2)O(n2)
O(1)O(1)O(1)
√
选择排序
O(n2)O(n^2)O(n2)
O(1)O(1)O(1)
×
插入排序
O(n2)O(n^2)O(n2)
√
O(1)O(1)O(1)
√
希尔排序
O(n3/2)O(n^{3/2})O(n3/2)
O(1)O(1)O(1)
×
快速排序
O(N∗logN)O(N*logN)O(N∗logN)
√
O(nlog2n)O(nlog_2n)O(nlog2n)
×
归并排序
O(N∗logN)O(N*logN)O(N∗logN)
×
O(n)O(n)O(n)
√
堆排序
O(N∗logN)O(N*logN)O(N∗logN)
√
O(1)O(1)O(1)
×
基数排序
O(n∗k)O(n*k)O(n∗k)
O(n+k)O(n+k)O(n+k)
√
稳定排序 ...
算法套路与框架
动态规划
动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。
核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。
首先,动态规划这类问题存在「重叠子问题」,如果暴力穷举的话效率会极其低下,所以需要「备忘录」或者「DP table」来优化穷举过程,避免不必要的计算
一定会具备「最优子结构」,才能通过子问题的最值得到原问题的最值
另外,虽然动态规划的核心思想就是穷举求最值,但是问题可以千变万化,穷举所有可行解其实并不是一件容易的事,只有列出正确的「状态转移方程」才能正确地穷举。但是在实际的算法问题中,写出状态转移方程是最困难的,这里提供一个思维框架,辅助思考状态转移方程:
明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义
1234567# 初始化 base casedp[0][0][...] = base# 进行状态转移for 状态1 in 状态1的所有取值: for 状态2 in ...
Linux更换home到其他硬盘
Linux更换home到其他硬盘
有时候有多块硬盘,而又因为一开始装系统的时候没有分配好空间,导致home目录在一块小硬盘上,这个时候需要把home分配到一个大点的硬盘上:
通过Ubuntu自带的Gparted将新硬盘进行分区和格式化
创建临时的home目录
1sudo mkdir /media/home
挂载硬盘到临时目录上
1sudo mount /dev/sda /media/home
同步home目录到新硬盘上
1sudo rsync -aXS /home/. /media/home/.
【注意】切换到root用户并执行以下步骤
12345678su# 备份home目录mv /home /home_old# 创建新的homemkdir /home# 取消之前的挂载并重新挂载到新的home上umount /dev/sdamount /dev/sda /home
查看新硬盘的UUID
1blkid
复制新硬盘的UUID,并修改/etc/fstab文件
1sudo vim /etc/fstab
添加如下内容:
1UUID=07204790-aa16-4 ...
传感器融合
概念
信息融合分类
信息融合的分类方法有多种,其中较为通用的一种方法是依据信息的抽象层次将其划分为三类,即数据层融合、特征层融合、决策层融合
数据层融合:每个传感器分别对目标进行观测,然后将各传感器的原始数据或者经过简单滤波处理的目标数据传输给融合中心;随后,融合中心对各种传感器的测量数据进行融合处理,提取目标特征,识别目标身份
原始数据损失量较小,细节信息保存较为完整,精度相对较高
数据量较大,需要较多计算资源,实时性差
仅能对同质传感器融合
特征层融合:每个传感器需要对各自的原始数据进行处理,从中提取目标特征,然后再将数据传输给融合中心;随后,融合中心依据各传感器提取的目标特征进行数据关联,并进行目标数据融合与目标身份识别
数据线明显减小,实时性提高
融合中心接收到的信号存在一定损失,融合精度会下降
决策层融合:每个传感器需要对各自的原始数据进行预处理,提取目标特征并进行身份识别,然后再将目标识别的结果传输给融合中心;融合中心只需要对识别的目标进行关联以实现数据融合
损失部分数据,使得融合中心的处理速度更快,实时性更好
鲁棒性较好
论文
基于毫米波 ...
vim使用总结
vim使用总结
一、两种模式及常用快捷键
1.1 标准模式及命令模式
光标移动
单位级光标移动:
h 向左一字符
j 下一行
k 上一行
l 向右一字符
单词级光标移动:
w or W 向右移动到下一单词开头(word)
e or E 向右移动到单词结尾(end)
b or B 向左移动到单词开头
块级光标移动:
gg:到文档第一行
0:到行首(第 1 列)
^:到第一个非空白字符
$:到行尾
G:到文档最后一行
:<N> or <N>gg 跳转到第 N 行
:+<N> or <N>j 向下跳 N 行
:-<N> or <N>k 向上跳 N 行
打开文件
gf:文件内跳转到对应的文件(打开include文件时)
:e <filename> 打开名为 filename 的文件,若文件不存在则创建之
:Ex 在 Vim 中打开目录树,光标选中后回车打开对应文件(提示:- 进入上级目录)
文件buffer
:buffers 或 :ls :查看 buffer 列表(即打开文件的历史记 ...
C++感悟与积累
C++感悟与积累
各种初始化问题
默认初始化
指定义变量时没有指定初值时进行的初始化操作。这些变量被定义了而不是仅仅被声明(因为没有extern关键字修饰),而且没有显式的赋予初值。
特别的,如果采用动态分配内存的方式(即采用new关键字)创建的变量,不加括号时也是默认初始化,加了括号为值初始化。
如:
123456// 默认初始化int a;Sales_data myData;int *p=new int;// 值初始化int *p=new int();
变量的值与变量的类型与定义的位置有关系:
对于内置类型变量(如int,double,bool等),如果定义在语句块外(即{}外),则变量被默认初始化为0;如果定义在语句块内(即{}内),变量将拥有未定义的值
对于类类型的变量(如string或其他自定义类型),不管定义于何处,都会执行默认构造函数。如果该类没有默认构造函数,则会引发错误。因此,建议为每个类都定义一个默认构造函数(=default)。
值初始化
值初始化是值使用了初始化器(即使用了圆括号()或花括号{})但却没有提供初始值的情况。
注意,当不 ...