- 博客(45)
- 资源 (1)
- 收藏
- 关注
原创 图像处理-仿射变换
1.仿射变换(Affine Transformation)空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。 这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。不共线的三对点决定了唯一的仿射变换。 由公式看到,仿射变换可以描述为一个线性变换加平移。错切变换是指图形沿某坐标方向产生不等量的移动而引起图形变形的一种变换。如右下角,图形在x轴产生了不等量的平移。2.opencv实现(1)getAffine
2020-06-27 18:25:46 1159
原创 SLAM图优化poseGraph-(1)由来和概念
文章目录1.slam图优化由来2.poseGraph概念1.slam图优化由来slam前端是激光帧和激光帧或激光帧和地图的匹配,用来建立增量式地图。后端是闭环检测和优化问题。在比较大的环境中,我们跑一圈建图,会发现首尾地图常常无法衔接,或根本就对不准。此时就需要用到posegraph图优化,来调整各个子图位姿。2.poseGraph概念图优化和一般的数值优化都属于优化问题,只是图优...
2020-04-19 00:44:32 1813 1
原创 c++线程池原理和应用
文章目录1.线程池2.线程池作用及应用场合3. 线程池实例1.线程池线程池是在应用程序启动之后,将立即创建一定数量的线程(N1),放入空闲队列中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。当任务到来后,缓冲池选择一个空闲线程,把任务传入此线程中运行。当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,用于处理更多的任务。在任务执行完毕后线程也...
2020-04-08 01:35:00 950
原创 protobuf应用-(3).proto文件和存取数据
1.proto数据结构syntax = "proto3";message Account { //账号 uint64 ID = 1; //名字 string name = 2; //密码 string password = 3;}2.存取数据#include <iostream>#include <cstring>#include "accou...
2020-04-01 02:36:56 1175
原创 protobuf3.4-(2)程序终端编译报错( 未定义的引用undefined reference )
1.编译报错不正确编译$ g++ -o main account.cpp …/protobuf/build/libprotobuf-lite.a/tmp/ccOySh1U.o:在函数‘main’中:account.cpp:(.text+0x26):对‘Account::Account()’未定义的引用/tmp/ccbZPZqN.o:在函数‘protobuf_account_2epro...
2020-04-01 02:19:03 2219
原创 Protocol Buffer(协议缓冲)-1概念
protoBuf概念Google官方文档给出的定义和描述:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。你可以定义数据的结构,然...
2020-03-29 20:42:50 499
原创 C++-tuple元组
文章目录1tuple元组2 功能介绍3 实例1tuple元组是什么?tuple是一个固定大小的不同类型值的集合。是一个可以容纳不同类型元素的容器 。我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征, 在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员因此在需要保存3个及以...
2020-02-05 01:35:08 640
原创 ROS多线程组合std::thread使用imshow
文章目录1. ros多线程2.imshow单开线程显示在ros多线程的subscribe回调中使用imshow出现bug: 图像不更新,变灰色,窗口和终端卡死。不用ros的多线程,暂时在构造函数中使用std::thread单开一个线程 进行图像显示和获取键值.1. ros多线程`ros多线程类使用如下,开辟3个线程,响应3个回调。ros::MultiThreadedSpinner s(...
2019-12-19 02:56:50 2023 1
原创 C++-Windows消息循环GetMessage/TranslateMessage/DispatchMessage
1.windows消息循环if (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); //消息转化 DispatchMessage(&msg); //消息派遣. 把TranslateMessage转换的消息发送到窗口的消息处理函数,此函数在窗口注册时已经指定 }执行过程:消息循环调用G...
2019-12-06 21:05:56 4001 1
原创 C++-SetTimer定时器
1.Windows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息WM_TIMER。它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发送该消息。与该消息联系密切的函数是SetTimer(),它设置一个系统时钟,当设置的时间到时,系统产生WM_TIMER消息。通过对SetTimer()函数的参数进行设置,可以告诉用户哪一个时钟的时间到了。因此,可以将一些...
2019-12-06 20:08:28 3008
原创 C++_std::map用法
1.std::map说明STL头文件没有扩展名.h,包括头文件后就可以定义和使用map对象了。 map对象是模板类,需要关键字和存储对象两个模板参数,例如: std : map<int, CString> enumMap;这样就定义了一个用int作为关键字检索CString条目的map对象。std表示命名空间,map对象在std名字空间中,为了方便,在这里我仍然使用了CS...
2019-12-01 14:38:06 1848
原创 TF坐标变换-将雷达坐标系坐标变换到地图坐标系
1.坐标变换实际程序中有很多坐标变换。 例如,已知物体在雷达坐标系中坐标pL(xL ,yL),假设雷达坐标系和机器人坐标系重合,又已知机器人在地图中的坐标,求物体在地图中的坐标pM(xm, ym)? 问题很简单,已知pL, 再知道pL和pM之间的R&t,就能计算出pM。 直接给出公式: R* pL + t=pM 或 T*p...
2019-11-22 00:53:16 5238 2
原创 KF/EKF/UKF-卡尔曼滤波及其改进算法[1]
文章目录0. 卡尔曼滤波及其变种1. kf卡尔曼2. ekf扩展卡尔曼3. ukf无迹卡尔曼0. 卡尔曼滤波及其变种kf滤波是卡尔曼(kalman)20世纪60年代提出的一种递推滤波算法。核心思想:利用信号与噪声的状态空间模型(1)、前一时刻的估计值(2)和此时的观测值(3),来更新对状态变量的估计,求得现时刻的估计值。应用方向:机器人定位导航、控制、多传感器数据融合,现实应用如导弹追踪、...
2019-11-08 20:41:36 3926 1
原创 Kdevelop-加载ROS工程/设置debug模式
1 加载ROS工程1)选择工程-导入工程-选择src-下的CMakeLists.txt,finish。2)选择工程-打开配置 设置构建目录: /home/abc/first/build/ 设置额外参数: -DCATKIN_DEVEL_PREFIX=…/devel -DCMAKE_INSTALL_PREFIX=…/install 如下所示:3)编译工作区间 直接构建即可2 d...
2019-09-30 10:20:40 558
原创 数据结构-优先队列
1 #include 采用默认优先级构造队列priority_queue<int>que;//采用默认优先级构造队列 (默认递减)2 结构体自定义优先级 //方式一 priority_queue<int, vector<int>, cmp1>que1; //方式二 priority_queue<number1>que3;其中://...
2019-09-26 00:12:44 174
原创 求两个矢量的夹角(带正负)
文章目录1 由点乘求夹角,再判断正负向量点乘求夹角:2 由点乘和叉乘,使用atan2(y,x)求角度1 由点乘求夹角,再判断正负向量点乘求夹角:ab= |a||b|cos<a,b>=a.xb.x + a.y* b.y 所以<a,b> = acos((ab)/(|a||b|)); 结果为正值,需要判定正负,来确定角方向;由向量叉乘判断正负: a X b =......
2019-08-31 14:13:44 28124 3
原创 Eigen库(3)-欧拉角与旋转矩阵互转
#include <pcl/io/pcd_io.h>#include <pcl/point_cloud.h>#include <pcl/console/parse.h>void rpyMatrix() { //定义3x3变换矩阵,二维,一个角度(如果平移为0,其实就是3x3旋转矩阵,3维,有3个角度) Eigen::Matrix3d transf...
2019-08-10 15:19:50 3143
原创 PCL点云滤波函数
文章目录1 直通滤波器(粗处理,确定xy方向范围):2 统计滤波器(去除离群点):3 半径滤波器(去除离群点):4 体素滤波器:1 直通滤波器(粗处理,确定xy方向范围):如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广,但x,y向的分布处于有限范围内。此时可使用直通滤波器,确定点云在x或y方向上的范围,可较快剪除离群点,达到第一步粗处理的目的。pcl::PassThroughpc...
2019-07-27 09:42:15 715
原创 Eigen库-eigen代数运算(逆,特征值等)
1 Eigen数据类型Eigen是一个模板类,基本数据单元为矩阵,它的前3个参数为:数据类型,行,列,如下所示:Eigen::Matrix<float,2,3> matrix_23;Eigen通过tyepdef定义了许多内置类型,不过底层仍然是Eigen::Matrix,如下所示:Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero...
2019-06-09 12:36:10 8984 1
原创 ROS-TF库-使用ros::Time::now()及过去的tf
1 如果非要使用 ros::Time::now() ros::Time now = ros::Time::now(); listener.waitForTransform("/turtle2", "/turtle1", now, ros::Duration(3.0)); listener.lookupTransform("/turtle2", "/turtle1", now,...
2019-06-09 00:11:07 6876
原创 ROS-TF库-TF和ros::Time(0)
1 tf和时间在前面的教程中,我们学习了tf如何跟踪坐标系树。此树随时间变化,tf为每个转换存储一个时间快照(默认为最多10秒)。到目前为止,我们使用lookupTransform()函数访问该tf树中最新的可用转换,而不知道该转换是在什么时候记录的。2 ros::Time(0)和ros::Time::now()前面的listener中如下: try{ listen...
2019-06-08 23:39:03 4750
原创 ROS-TF库-添加坐标系-类似TransformBroadcaster
1 添加子坐标系tf建立了一个框架的树结构;不允许在框架结构中有一个闭合循环。这意味着一个框架只有一个父级,但它可以有多个子级。对于前面的教程,我们的tf树包含三个帧:world、turtle1和turtle2。这两只乌龟是世界的孩子。如果我们想给tf添加一个新的帧,现有的三个帧中的一个需要是父帧,新的帧将成为子帧。为/turtle1添加一个子坐标系/carrot1代码如下:#inclu...
2019-06-08 22:30:55 836
原创 ROS-TF库-写一个TransformListener监听器
1.TransformListener监听器类TransformListener监听,即tf数据接收tf包提供了TransformListener的实现,以帮助简化接收tf变换数据的任务。要使用TransformListener,我们需要包含tf/transform_Listener.h头文件。如下是监听接收一个turtle1到turtle2的一个坐标变换,计算tf关系,并发布控制tur...
2019-06-08 12:45:19 8079
原创 ROS-TF库-写一个TransformBroadcaster发布
1 TransformBroadcaster()tf包提供了TransformBroadcaster类的实现,以帮助简化tf发布转换的任务。要使用TransformBroadcaster,我们需要包含<tf/transform_Broadcaster.h>头文件。如下是发布一个world-turtle1的一个坐标变换,来具体看TransformBroadcaster类的用法:...
2019-06-07 21:04:10 4625
原创 c++ isnan和isinf
1 isnan()isnan() 判断是不是NAN值(not a number非法数字) 标准库中定义了一个宏:NAN来表示非法数字。 比如负数开方、负数求对数、0.0/0.0、0.0* INFINITY(无穷大)、INFINITY/INFINITY、INFINITY-INFINITY 以上操作都会得到NAN。 注意:如果是整数0/0会产生操作异常2 isinf()isinf()测...
2019-06-06 12:58:46 16352
原创 C++-运算符
1 &和&&、|和||两个重叠的是逻辑运算符,两边只能是bool类型,单个的可以是位运算符也可以是逻辑运算符。 1) &&是“逻辑与”运算符,||是“逻辑或”运算符,都是逻辑运算符,两边只能是bool类型 2) &与| 可以进行逻辑运算,也可以进行位运算,两边既可以是bool类型,又可以是数值类型...
2019-06-06 11:21:36 114
原创 SLAM-去除激光雷达运动畸变/去除激光帧畸变
1激光雷达运动畸变2去除畸变原理3 程序流程main-构造函数订阅scan话题调用scancallback处理scancallbackscan话题数据提取到vector数组(包括angles,ranges)vector数组保存到pcl::PointCloudplc::PointXYZRGB类型的点云中调用Lidar_Calibration进行畸变矫正Lidar_Calibra...
2019-05-20 02:39:01 8065 5
原创 OpenCv-高斯金字塔及DOG
1.高斯金字塔高斯金字塔的生成过程分为两步: 1)对当前层进行高斯模糊。 2) 删除当前层的偶数行与列。 然后即可得到上一层的图像,上一层只有下一层的1/4大小,而且是逐层得到的,不能隔层生成。2. DOG高斯不同DOG-高斯不同:(difference of gaussian) 就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,称为高斯不同。 用处:DO...
2019-05-18 16:14:28 1717
原创 ROS-PCL-读写点云PCD文件
1写PCD点云pcl::io::savePCDFileASCII (“test.pcd”, cloud);#include <ros/ros.h>#include <pcl/point_cloud.h>#include <pcl_conversions/pcl_conversions.h>#include <sensor_msgs/PointCl...
2019-05-08 02:29:06 3440 1
原创 C++-1-指针
1 this指针先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如myclass my,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclas...
2019-05-06 03:25:51 159
原创 Opencv-5-ORB特征提取和匹配
1 变量初始化 std::vector<KeyPoint> keypoints_1, keypoints_2; Mat descriptors_1, descriptors_2; Ptr<ORB> orb = ORB::create (500, 1.2f, 8, 31, 0, 2, ORB::HARRIS_SCORE,31,20 ); /...
2019-05-04 02:42:01 1204
原创 OpenCV-4-保存mat数据为一个文件
#include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h>using namespace std;using namespace cv;static void saveXYZ(const char* filename, const Mat& mat){ FI...
2019-05-03 01:28:37 2649 1
原创 ROS-创建、发布和显示PCL点云
文章目录1 PCL创建点云2编写节点发布点云3显示点云1 PCL创建点云 //定义点云类型 pcl::PointCloud<pcl::PointXYZ> cloud; // 添加点云数据 cloud.width = 50000; cloud.height = 2; cloud.points.resize(cloud.width * cl...
2019-04-29 22:56:06 4607 2
原创 OpenCV-3特征检测与匹配(FAST,SIFT,FlannBased)
1 特征检测与匹配(FAST,SIFT,FlannBased) opencv2.4特征检测程序: initModule_nonfree(); //if use SIFT or SURF //定义特征检测所需的变量和类 vector<KeyPoint> keypointsL, keypointsR; //vector模板类存放任意类型动态数组,增加和压缩数据 Ptr<F...
2019-04-29 19:59:30 1230
原创 ROS-编写节点订阅激光雷达scan话题
1 编写激光雷达订阅节点接上节的gazebo激光雷达插件,编写节点订阅/scan话题,方便后期数据处理,节点代码如下,主要是头文件和消息类型参数定义:#include "ros/ros.h"#include <iostream>#include <fstream> #include <sensor_msgs/LaserScan.h>//HAO Q...
2019-04-28 22:36:29 7711 2
原创 ROS-gazebo激光雷达
1 gazebo gazebo是一个虚拟仿真真实物理环境的软件,其仿真物理环境可以高度还原真实环境,包括重力环境,特殊光源,普通相机,RGBD相机,激光雷达,差速驱动插件等,这些传感器的使用只需要再xacro中加入相对应的插件即可。 如下是按照日本北阳hokuyo激光雷达设定的参数: 主要有update_rate扫描频率,samples一周采样数,min&max_angle扫描范围,还...
2019-04-28 11:41:22 6302 1
原创 OpenCV-2-nameWindow()图像窗口
如果直接使用imshow(“a”,img);默认显示原图大小,不能缩放 nameWindow函数可以新建一个显示窗口,可以指定窗口的类型 CV_WINDOW_AUTOSIZE 自动大小,默认图像大小,不能缩放 CV_WINDOW_NORMAL 可以鼠标拖动缩放用法如下:nameWindow("a“,CV_WINDOW_NORMAL); //新建一个normal类型的...
2019-04-26 00:46:48 1756
原创 windows-cmd终端文件操作命令
1 目录操作:切入盘符:直接d: 、c:,盘名加冒号切入文件夹:cd打开当前终端文件夹:start .清空屏幕cls创建目录mkdir … 或直接 md删除目录(remove directory)rd …2 文件操作:新建文件:cd > a.txttype nul > a.txt删除文件:del a.txt打开编辑文件:直接输入文件名 a....
2019-04-18 10:56:32 10213
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人