自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 收藏
  • 关注

原创 Linux Qt配置PCL库问题记录

问题记录

2023-11-04 17:32:10 156

原创 位姿误差雅可比的N种写法

对位姿误差的推导做个整理,不同的资料上求导的对象以及是左扰动还是右扰动会略有差别,注意区分。

2023-03-26 18:22:41 416

原创 ROS2中IMU话题的发布及可视化

代码是从维特智能的示例代码修改的,实现基本的加速度、角速度和角度读取,发布IMU消息。这个传感器还支持磁场输出等功能,后面再加上吧。安装用于IMU消息显示的插件,之后在 Add -> By topic 中选择IMU消息即可。环境:Ubuntu 20.04,ROS2 Foxy。传感器:维特智能BWT901CL。RViz2进行可视化,需用。

2023-03-09 22:30:11 1526 4

原创 论文阅读《Improved RANSAC performance using simple, iterative minimal-set solvers》

从特征点匹配对求取本质矩阵的方法一般是用五点法,这篇论文给出了一种迭代优化求解的方法。

2022-10-07 23:45:36 214 1

原创 Hacker‘s Delight中的Trick

Hacker's Delight里的各种技巧真有意思。

2022-09-25 20:51:29 110

原创 C++仿函数真好用

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为。

2022-09-04 23:12:42 696

原创 [踩坑]特征值计算

最近尝试将一个MATLAB程序通过codegen编译成C++库调用,好不容易编译通过但是运行结果不对,一步步跟踪下来发现是eig函数的问题,记录一下。

2022-08-21 22:11:21 530

原创 DSP Trick:向量长度估算

最近看RichardG.Lyons的时学到的向量长度估算技巧,Alpha-max-plus-beta-min algorithm,还挺好用。

2022-07-26 23:23:09 291

原创 玩玩Raspi(2):QEMU联合MATLAB进行算法部署

上文中树莓派使用NAT方式与主机进行通信,能实现的功能有限,更好的方式是使用桥接方式使得将QEMU中的Raspi虚拟机可以被视作一个独立的网络用户。NAT方式和桥接方式的区别可以参考这篇文章。原先自己玩的时候是将源码文件传入Raspi进行编译运行,因此并未注意这两种方式的区别,后来某个朋友需要用MATLAB直接编译生成程序并部署在Raspi上,借此摸索了一下QEMU模拟树莓派并用桥接方式与主机MATLAB连接的方法。环境:MATLAB 2020a,安装MATLAB Support Package fo

2022-05-04 14:17:24 653

原创 玩玩Raspi(1):QEMU模拟

参考这个教程:QEMU仿真树莓派1和3B-保姆级教程树莓派1启动后,登录login:pi, password:raspberry,然后开启SSH:$ sudo service ssh start$ sudo update-rc.d ssh enable然后在Windows主机上再打开一个CMD窗口,就可以访问虚拟机或者传文件了,比如这样(这里的端口号是5022,是启动QEMU时设置的):$ ssh [email protected] -p 5022$ scp -P 5022 source pi@127.

2022-05-02 23:54:56 1216

原创 [踩坑]整型提升

C was designed to implicitly and silently change the integer types of the operands used in expressions. ……These rules are often not even known by the average C programmer and therefore causing all manner of very subtle bugs.——stackoverflow/implicit-type.

2022-04-17 21:02:34 841

原创 Github pages搭博客技巧

Latex公式显示STEP 1在head.html文件中加入<script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true } }); </script> <script src="https://cdnjs.cloudf

2022-02-13 21:14:21 295

原创 static和inline在C++头文件中的使用

先上例子:// foo.hpp#ifndef FOO_HPP#define FOO_HPPvoid foo(){ //}#endif// a.cpp#include "foo.hpp"void func_a(){ foo();}// b.cpp#include "foo.hpp"void func_b(){ foo();}// main.cppextern void func_a();extern void func_b();int main

2021-12-23 23:32:16 1131

原创 由NaN引出svdcmp()的BUG

svdcmp()是Numerical Recipes in C书中提供的SVD计算程序,之前用的时候遇到一个坑,记录以备忘。发现在NR in C的论坛上早已有提及到:BUG: svdcmp() out-of-bounds array access,摘录部分如下:BUG: svdcmp() out-of-bounds array accessedward04-10-2006, 05:48 PMHi,I’ve encountered a bug in svdcmp() (NR in C) whic

2021-11-28 00:43:19 362

原创 QT GUI仅用于主线程

搞个多线程差点被GUI坑了T_T记录一下相关资料:[1]Qt多线程编程总结(一)警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心类(比如,QProcess)和网络类都不是线程安全的。[2]QT 多线程程序设计尽管QObject是可重入的,但GUI类,特别是QWidget与它的所有子类都是不可重入的。它们仅用于主线程。正如前面提到过的,QCoreApplication::exec()也必须从那个线程中被调用。实践上,不会在别的线程中使用GUI类,它们工作在主线程上,把一些耗

2021-05-27 00:48:11 249

原创 整理一下去年踩过的坑

1.vector线程不安全A线程在使用例如for (vector<int>::iterator iter=ivec.begin();iter!=ivec.end();iter++)这样的循环对vector进行处理时,B线程向该vector中插入了一个新的元素,由于刚好遇到了重新申请内存&复制vector的操作,导致A线程中的迭代器失效,现象表现为变成了死循环,A线程卡死。解决方法:加锁。或许还可以参考这个知乎问题C++ STL容器如何解决线程安全的问题?下的回答。2.函数引用传参

2021-03-08 00:21:58 94

原创 ARM中的浮点运算测试

对于ARMv8-A/R和ARMv7-A/R中浮点运算的介绍可以在这里看到ARM Floating Point其中,个人比较在意的是SIMD(对于ARM来说大致就是NEON吧)对浮点运算的支持。ARMv8在AArch64模式下对于IEEE 754的支持是比较好的:Floating-point support in AArch64 state SIMD is IEEE 754-2008 compliant with:Configurable rounding modesConfigurable De

2020-12-26 23:06:12 2025

原创 谈谈MATLAB中的相机Extrinsics

通过estimateCameraParameters函数求出的RotationMatrices和TranslationVectors表示了世界坐标系相对于相机的位姿,而求取相机相对于世界坐标系的位姿还需要通过extrinsicsToCameraPose函数。通常,齐次变换矩阵可以写为[Rt01]\left[\begin{matrix}R & t \\ 0 & 1\end{matrix}\right][R0​t1​]的形式。但是如果将之前求出的RotationMatrices和Transla

2020-10-22 00:19:02 1222

原创 Matlab执行外部exe

比如待执行的程序为test.exe方法1:open('test.exe');虽然在m文件中确实能够执行成功,但是将m文件打包为APP后,似乎就没有执行test.exe了。方法2(推荐):system('test.exe');即使打包为APP也能执行test.exe。...

2020-10-12 23:00:24 1687

原创 基于C++和OpenCV的文件序列处理框架

上次分析了一个OpenCV视频处理的小框架,借鉴于此,实现一个对一系列文件进行处理的框架。还是先来看一下UML类图:整个框架是由StreamProcessor、FrameProcessor、FileProcessor和FileToolkit这4个类组成的。作为一个简单的例子,这里实现了TumRgbFileProcessor和TumDepthFileProcessor来读取TUM数据集,以及VideoPlayer将读取的图片文件以视频呈现。下面分别解释一下各个类的作用。FileToolkit,提供一些

2020-08-17 00:22:41 189

原创 使用UML类图分析程序

待分析的程序来自OpenCV2 Cookbook,UML画图工具使用PlantUML。参考:PlantUML 之类图Overview最近需要使用OpenCV分析一系列文件并形成视频输出,打算参考OpenCV2 Cookbook中这个视频处理的程序来写。UML类图如下,只列出了涉及不同对象之间交互的成员和方法:FrameProcessor作为一个接口,给出每帧图像的处理方法,其成员只有void process(cv:: Mat &input, cv:: Mat &output)这个纯

2020-08-09 21:26:43 690

原创 ubuntu16.04升级pip不成功的解决方法

pip安装一些库的时候发现不成功,报错类似:You are using pip version 8.x.x however version 20.x.x is available…报错信息中有提示用pip install --upgrade pip升级,但是也无法升级成功。最后是用sudo easy_install -U pip解决的。...

2020-08-06 00:10:30 1037

原创 VS2015社区版update3无法查看STL内容的解决方法

使用update2版本。在官网下载的默认就是update3版本,调试的时候STL中元素的内容显示不出来,试了各种方法(本机兼容模式不勾选、在变量窗口显示对象的原始结构不勾选、natvis),仍未解决。经查, VS调试STL问题总结中提到了这是个update3版本的bug,Visual studio 2015 community 在debug时如何显示vector中的数据?这个问题的评论中提到了用update2版本无此问题,故下载update2版本试之,problem solved。下载地址:http:

2020-08-02 13:39:03 280

原创 while与超时

涉及到通讯/数据交互的时候,假如采用while来等待,例如//wait for datawhile (getData() == 0);//get data then do something//...有时候遇到了一直等不到信号/数据的情况,有造成程序异常的风险,最好还是加入超时处理的机制,例如:int time_before = getTime();//wait for datawhile (getData() == 0) { if (getTime() - time_before &

2020-08-02 10:59:35 1194

原创 写给自己看的B树(1):新建、插入、遍历&清除

参考:算法导论B树(B-tree),其实算是二叉查找树的一种扩展。在二叉查找树中,一个非叶子节点可以有1个key+2个children(左、右),而B树,则可以有n个key+(n+1)个children,对于其中的某个key,其左子树 <= key,其右子树 >= key。在《算法导论》中,采用了最小度数t对B树进行定义,其中比较关键的是:a.除根结点外的每个结点必须至少有t-1个key。因此,除了根结点以外的每个内部结点必须至少有t个children。如果树非空,根结点至少有1个key

2020-07-26 23:34:58 216

原创 写给自己看的DBSCAN(1):基本实现

参考:西瓜书DBSCAN的思想是基于密度来聚类,十分直观易懂,更严谨的描述可见西瓜书,其中个人认为最关键的是:若xxx为核心对象,由xxx密度可达的所有样本组成的集合记为X={x′∈D∣x′由x密度可达}X=\{x' \in D \mid x'由x密度可达\}X={x′∈D∣x′由x密度可达},则不难证明XXX即为满足连接性与最大性的簇。这就指明了实现的一种思路:先找到所有的核心对象,再找到这些核心对象密度可达的其他点。伪代码如下:这里给出C++的实现,基本上忠于上述的伪代码,没有对性能进行

2020-07-15 23:40:44 257

原创 多核Cache Coherence问题——以ARM为例

最近在多核ARM芯片上搞并行计算,涉及到核间数据交互,因此对多核cache coherence稍作探究。想解决的疑问是:各个核之间是否“知道”内存中的数据被其他核进行了改动?有何机制来保障cache coherence?CSAPP中似乎没有具体谈到多核之间cache是如何配合的(我看的是2ed,不知道3rd中是否有增加),但是在CMU Introduction to Computer Systems (ICS)课程中,最后一课正好讲的是Multi-core architectures,Slide十分NIC

2020-07-04 23:58:13 830

原创 C/C++中的全局变量与符号

0 引言起因是在头文件中定义了全局变量,而又有多个不同的源文件包含了这个头文件,这样显然会出现multiple definition的问题。以下是对上述问题的探索,文中若有不对的地方烦请指正。总的来说,一个变量是不能被多次定义的。以及,C和C++在关于multiple definition/redefinition的处理上会略有不同,原因在于tentative definition。1 Declaration & Definition既然谈论的是multiple definition的问题

2020-06-23 00:11:26 1146

原创 C语言函数传参与指针

C语言的函数传参只有传值的方式,想要在函数中修改参数值的话就需要传入参数的地址也就是指向这个参数的指针了。需要注意的情况是待修改的参数本身就是一个指针的时候,要传入这个指针本身的地址,也就是指向指针的指针。看这样的一个例子:当希望用init函数对传入的指针int型ptr分配空间,init接受的参数是int **arr,是一个指向指针的指针,而调用init函数时,需要传入的参数是&ptr,也就是ptr的地址。#include <stdio.h>#include <stdlib

2020-06-13 15:35:09 367

原创 virtualbox装Ubuntu16.04无法启动Fixing recursive fault but reboot is needed!

换了个新笔记本出现的问题。把虚拟机设置的系统->扩展特性->启用I/O APIC勾选上就好了。

2020-06-13 15:14:59 3386

原创 C++与C的一些不同点

也是将C++改写为C时需要注意的一些地方。1.布尔类型C++中有原生的布尔类型bool,同时也有true和false关键字。然而C语言中直到C99才引入了布尔类型_Bool,同时还增加了一个头文件stdbool.h,其中定义了bool、true和false,以便与C++兼容。假如编译器不支持C99的话,可以这样来定义布尔类型:typedef enum { false, true } bool;2.结构体C++中可以在定义结构体的时候对结构体成员进行初始化,例如://cppstruct A_

2020-05-28 00:03:38 178

原创 C&C++中的const关键字

const关键字在C和C++中并非相同的含义。从字面含义上,const很容易让人认为它所限定的量是一个常量Constant,这样的理解在C++中是正确的,而在C语言中则是错误的。在C语言中,const的作用,更准确地说是将变量限定为read-only。Let’s look at what is meant when const is used. It’s really quite simpl...

2020-05-04 23:40:09 154

原创 case label does not reduce to an integer constant

一开始发现这个问题,是在switch中使用了const int类型的量作为case,举例如下:int main(void){ const int c[3] = {0, 1, 2}; int a = 0; switch (a) { case c[0]: a = c[1]; break; case c[1]: a = c[2]; break; c...

2020-05-02 18:19:34 18315 1

原创 存储器硬件笔记

参考:EEPROM和flash的区别为什么单片机中既有Flash又有EEPROM

2020-04-25 21:09:06 167

原创 数据buffer切换机制

Problem假设需要从一个外设中不断接收数据,每接收一段数据后CPU对这段数据进行处理,应该如何设计buffer以保证数据接收不被中断,且CPU处理时用到的数据是静态的(即所处理的数据是同一批)呢?A Simple Solution一种很简单的的想法就是采用2个buffer,当CPU处理buffer 1中的数据时,接收到的数据就放在buffer 2中,但是这样做是否足够稳健了呢?考虑这样...

2020-04-13 21:48:01 450

原创 vector的基本操作

今日工作感想:一顿操作猛如虎,结果还是最蠢的方法最好用。就当是复习了一下vector的用法吧。1.push_back()最基础的在末尾追加元素,不必多说。2.begin(),end(),rbegin(),rend()注意区间是左闭右开的,借用C++ Primer的图示如下:3.insert()在指定的位置之前插入元素,也可以用来拼接两个vector。vector<int&gt...

2020-04-05 23:36:52 325

原创 使用memset初始化数组

写在前面的ATTENTION:用memset初始化非char型(eg. int型、float型…)数组时,假如初始化值非0,可能导致错误的结果。先举个通常用法的栗子, 将int型数组arr的元素初始化为0:int arr[5];memset(arr, 0, sizeof(int) * 5);假如初始值不为0,会如何呢?例如设置为1:使用memset(arr, 1, sizeof(int...

2020-04-05 17:00:00 3390

原创 本周踩坑记录-200322

1.CAMERA中断程序中忘清中断,导致频繁进中断,内存被踩,最后的计算结果错误。采用GDB逐步调试找到了计算错误的原因是内存被踩后,再做减法逐步排除出问题的代码,才定位到中断程序。2.未注意程序执行的顺序,在A任务中用到了B外设,但是没有在创建A任务之前初始化B外设,而是在创建了A任务之后才初始化,导致有可能在执行A任务时B外设尚未被初始化而死机。3.SPI驱动能力不合适,过高过低都不行,导致读取FLASH失败。4.双核同时对一个外设/引脚进行配置,导致外设/引脚状态不确定。最后采用的方法是,COR

2020-03-22 21:31:20 269

原创 BUG!符号数与无符号数混合运算

写了一段类似这样的代码: vector<int> vec; for (int i = 0; i < 3; i++) { vec.push_back(i); } int div; div = -3 / vec.size();想当然地认为div结果是1?大错特错,其实结果是0x55555554!问题出在哪里?注意vec.size(),是unsigned!所...

2020-03-10 00:40:56 129

原创 数据拼接与处理Tips

最近搞了几个传感器,各个的数据格式都不太一样,记录一下处理数据的tips。1 注意是否溢出遇到这样的情况:原始数据本身是8bit,然而需要加上offset才能得到真实数据,一疏忽用了uint8_t来存放数据,显然就会存在溢出的风险。2 使用struct比如原始数据是这样的:每个data是12bit,byte1是data1的高8位,byte2是data2的高8位,byte3[3:0]是da...

2020-03-01 17:20:21 392

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除