- 博客(65)
- 收藏
- 关注
原创 蒙特卡洛法求定积分方
对于连续函数密度函数,求某一个区间的概率时,理论上通过积分获取,那么在[a,b]之间随机选取四个点,做四次采样,以求曲线围成的面积为例。
2024-06-28 21:13:24
217
原创 ubuntu 生成动态库及使用
此外,库对应的文件的目录也必须给出,使用include_directories。即使库文件在当前文件夹下,但不在系统路径中,所以必须加上绝对路径或使用。${PROJECT_SOURCE_DIR}代表当前项目目录。cmakelist.txt的写法。
2024-03-22 10:30:33
427
原创 cmu中间代码groud_based_autonomy_basic在适配不同机器人时主要修改的参数
param name="pathFolder" type="string" value="$(find local_planner)/paths" />这个是黄色的局部曲线,根据机器人的外接圆进行修改,如机器人为一个长方体,长L,宽w,则path_generator.m中的 Radius >= sqrt(pow(L/2,2) + pow(W/2,2)),可以稍微大一点.。" type="double" value="1" />默认是7.5,这个用来增加角速度的,根据线速度调试确定,否则摆动很大前进时。
2023-09-09 16:33:00
545
原创 std::map使用std::piecewise_construct & std::forward_as_tuple
c++11 std::tuple元组,c++11中引入的新的类型,可类比std::pair。 但是std::pair只能支持两个元素。 理论上, 元组支持0~任意个元素。#include <iostream>#include <utility>#include <string>#include <map> int main(){ std::map<std::string, std::string> m;
2022-01-11 14:46:24
916
原创 loam 在ubuntu20.04 ros noetic下运行问题
问题1:运行bag或 .pcap, 然后启动loam,直接就程序就死了,这个里有答案https://github.com/laboshinl/loam_velodyne/issues/71#issuecomment-416024816把CMakeLists.txt中的 add_definitions( -march=native ) 注释掉 再编译。问题2:[ERROR] [1623136765.617027771]: Error transforming odometry 'Odo
2022-01-11 10:21:32
2201
1
原创 Cartographer 多雷达时间同步原理
针对两个及以上的雷达点云以简单的两个雷达为例1.先确定本次同步的开始时间current_start_, 结束时间current_end_2. 代码中,有两种情况, 上一次该sensor_id的雷达数据还有没处理完的,先处理即t1-t2,再把本次过来的点云存入容器id_to_pending_data_,下一次同步; 另一种就是,id_to_pending_data_没有该sensor_id的剩余,开始新的同步处理, 即t2-t4如果两个激光雷达的数据都过来了,以上一次融合结束时间为
2022-01-05 14:46:28
1692
4
原创 ROS noetic serial软件包的安装
noetic不能采样 sudo apt-get install的方式安装,只能通过源码安装,并且最好安装在/opt/ros/noetic的文件下,因为在ros软件包的CMakeLists.txt中的find_package要包含serial的话该serial需要安装在/opt/ros/noetic的安装前缀下,具体设置cmake变量CMAKE_INSTALL_PREFIX.serial 源码git clone https://github.com/wjwwood/serial.git先安装下
2021-12-01 09:46:02
3089
3
原创 ORB特征
ORB特征由关键点和描述子组成关键点选取:采用FAST算法ORB 特征检测的第一步是查找图像中的关键点,而关键点检测算法即使用 FAST 算法。FAST 是 Features from Accelerated Segments Test 的简称,可以快速选择关键点,算法步骤如下:给与一个像素点 p,FAST 比较目标 p 圆圈范围中的 16 个像素,每个像素按高于 p,小于 p,或者与 p 相似,分为三类。注意这里的比较是带有阈值 h 的。对于给定的阈值 h,更亮的像素将是亮度超过 Ip
2021-11-23 13:42:22
2314
原创 c++11 智能指针
主要看常用的std::shared_ptr std::unique_ptr 比及可构造智能指针的std::make_unique(c++14引入)和std::make_shared.这里设计到完美转发 以及类模板等相关知识。
2021-11-23 09:51:13
1150
原创 lambda的捕获和参数的使用
std::for_each()[capture list] (params list) mutable exception-> return_type {function body}含义:captrue list:捕获外部变量列表 params list:形参列表 mutable 指示符:用来说明是否可以修改捕获的变量 exception:异常设定 return_type:返回类型 function body:函数体此外,我们还可以省略其中的某些成分来声明“不完整”的Lamb
2021-11-22 09:49:38
1928
原创 14讲 点云拼接
1点云读取boost::format fmt( "./%s/%d.%s" )colorImgs.push_back( cv::imread( (fmt%"color"%(i+1)%"png").str() ));这个的用法与printf中的一样,格式化输出的方式%s :字符串格式 %d:10进制整数格式而 (fmt%"color"%(i+1)%"png"是实际调用了这个格式, fmt%"color"就是传入这个格式的参数,按照上面初始化fmt时的格式顺序;然后使用boost :...
2021-11-19 14:29:02
590
原创 c++ 中的 隐藏 继承 重载
这几个词的英文 重载overload 覆盖override 隐藏hide覆盖override和隐藏hide对于不同类覆盖override 是指 子类对父类virtual函数进行覆盖,要求子类的该函数与父类的中的完全相同,包括名字 返回类型 参数,前面也要带virtual隐藏hide 对于父类中没有virtual的函数,子类中同名的函数,其他相同或不相同不管,就会调用子类的而隐藏父类重载overload 对于一个类中的函数的,函数同名,但参数不同,同一个函数的不同行为...
2021-11-18 15:52:25
447
原创 c++ 中结构体重载操作符的三种方式
//c++ 中结构体重载操作符的三种方式 struct node{int x;node(int val):x(val){}bool operator<(const node &a)const{ return x < a.x ;}};struct node1{int xx;node1(int val):xx(val){}friend bool operator<(const node1 &a, const node1 &am.
2021-11-17 08:59:22
1902
原创 SVD分解
是对奇异矩阵的分解先从特征值的分解说起, 对于方阵 A, n*n , Ax=λxx是一个n维向量, 则我们说λλ是矩阵A的一个特征值,而x是矩阵A的特征值λλ所对应的特征向量。求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵A特征分解。如果我们求出了矩阵A的nn个特征值λ1≤λ2≤...≤λnλ1≤λ2≤...≤λn,以及这nn个特征值所对应的特征向...
2021-11-15 10:44:17
324
原创 c++ 虚函数及虚函数表
子类对象地址为什么能赋值给父类对象指针?因为,子类对象地址赋值给父类对象指针,父类对象指针就指向了子类的对象空间,父类操作子类的范围是有限制的,只能操作到子类中父类的范围。基类和子类各有自己的虚函数表;不管是基类还是子类实例都会在其内存的开头自动创对象即虚函数表指针vptr, 用来访问所在类的虚函数表...
2021-10-29 11:41:50
957
原创 STL常用容器
std::list双向链表; 也是一个环形链表;push_back; front(第一个元素 back()最后一个元素 insert(迭代器, 数据)
2021-10-28 09:41:19
192
原创 Karto 后端
后端使用的Sparse Bunble Adjustment优化库:https://github.com/ros-perception/sparse_bundle_adjustment
2021-10-25 17:31:59
287
原创 cartor gazebo问题
Could not compute submap fading: Lookup would require extrapolation 31.723000000s into the past. Requested time 757.230000000 but the earliest data is at time 788.953000000, when looking up transform from frame [base_link] to frame [map]
2021-10-15 13:46:01
553
原创 github 管理代码
安装 git bash, 生成密钥等参考这个链接参考:https://blog.csdn.net/dongxiaocong/article/details/81316343提交代码:1.git add 文件夹 或文件 /从工作区添加到暂存区2. git commit -m "注释随便写一个" //添加到本地仓库3.git push origin master //提交到github但是git push 要小于100MB如果大于会失败,这是需要用到git r...
2021-08-29 13:17:46
72
原创 ROS中PCL和LaserScan转换总结
当我们要对激光雷达的数据进行处理时,我们也需要将ROS获取的雷达数据,即sensor_msgs::LaserScan,转化为PCL点云库可以使用的数据,如pcl::PointCloud<T>.pcl网站有详细的说明,这里说明一些基本的数据类型基本的类型 pcl::PointCloud<T>, 其具有宽度和高度, width, heighttypedef pcl::PointCloud<T> cloudcloud.width =200 代表有200...
2021-08-28 14:52:42
1695
原创 相关匹配Real-Time Correlative Scan Matching 总结
相关匹配算法作为Cartographer的前端算法,属于scan to Map.这里的Map是Submap子图,即通过几帧激光构成的地图。首先需要离散花世界坐标系,进入到栅格坐标中,对于通过一帧激光建立的地图,激光束打到的点就是障碍物点被击中,未击中的为空闲或未知,对应于高斯分布曲线,打中的栅格就是这个高斯分布的一阶矩u,其他栅格的概率计算是这样计算,一个栅格,找到距离其最近的障碍物栅格,先通过欧式距离计算出栅格索引的距离,再乘以地图分辨率得到实际距离,这个距离值就是高斯分布中的(x-u), 有了这
2021-08-23 14:34:59
516
原创 gmapping 激光匹配原理
对应gmapping中的scanmach的匹配是如何匹配的详细讲解匹配用得分来衡量,得分计算:首先,他是将这一帧激光点作用于某一粒子,粒子就是一个机器人。首先是把该粒子上的激光雷达坐标转换到世界物理系上,然后对这帧激光的每一束遍历。首先计算,激光束打到的点在世界系下的真实坐标phit,也转换为地图索引坐标iphit。然后计算这个打到的点前面一定距离的点认为肯定是空闲点,这个距离参数是freeDelta,得到这个空闲点的世界坐标。计算下这两个坐标的1范数。下面开始匹配了由于地图索引
2021-08-20 10:48:01
816
原创 gflags 用法
/******************已安装gflags软件包编译指令g++ -std=c++11 gflagtest.cpp -o gflagtest -lgflags带参数./gflagtest -isvip 1 -port 88 -ip 192.168.12.1ip:192.168.12.1port:88isvip:1默认参数./gflagtestip:127.0.0.1port:80*******************/#include <iost
2021-08-17 10:45:13
326
原创 laser_scan_matcher 坐标变换代码分析
整个是激光回调函数中的部分 代码getPrediction(pr_ch_x, pr_ch_y, pr_ch_a, dt);这里是先用里程计算出,上一次回调和本次回调时间内,里程计的增量。tf::Transform pr_ch;createTfFromXYTheta(pr_ch_x, pr_ch_y, pr_ch_a, pr_ch);把增量变换成tf类型的变换,相当于一个齐次坐标目标是得到 laser坐标系下,从参考帧PF到本次回调这时间内的变换关系f2b_:上一次回调时,ba
2021-07-17 05:55:18
720
原创 角度校准代码
#include "ros/ros.h"#include "geometry_msgs/Twist.h"#include <cmath>#include <string>#include <iostream>#include "tf/tf.h"#include "tf/transform_listener.h"#include "dynamic_reconfigure/server.h"#include "xtark_linear_calibrate/xt
2021-07-13 17:17:30
522
原创 ROS 角度标准
ROS 角度标准逆时针为正 角度在0-180if(theta >= M_PI) theta = theta -2 * M_PI;if(theta <= M_PI) theta = theta + 2 * M_PI;
2021-07-12 16:27:20
899
原创 ROS pluginlib步骤
1.创建插件一般情况是有基类的,以move_base导航栈为例。其nav_core包下有几个头文件,这就是基类所在,其具体实现由继承类完成,基类的构造函数是protected2.新建软件包catkin_create_pkg package_name roscpp 基类包名 ......3.继承类头文件要包含 基类#include <基类包名/基类头文件名.h> 这里是因为头文件在/include/包名/头文件名。如果就在include文件夹里 不用包名就可以了.cpp文件..
2021-07-10 23:24:57
522
原创 ROS 中里程计的计算代码理解
double dt = (current_time - last_time).toSec(); double delta_x = (vx * cos(th) - vy * sin(th)) * dt; double delta_y = (vx * sin(th) + vy * cos(th)) * dt; double delta_th = vth * dt; x += delta_x; y += delta_y; th += delta_th;x...
2021-07-07 09:54:04
1772
原创 ICP PL-ICP NICP IMLSICP
imlsicp:最小化这里用了point to plane的概念xj是源点云中的点,yj是投影到目标点云隐藏的曲面的投影点最小化 源点云的点到其投影点之间的距离在法向量上的投影,这个法向量与xj 最近的目标点云中点的法向量固定一个迭代次数和收敛精度。每求出一次R t ,将这个转换矩阵作用于源点云即新到点云更新,然后再进入循环进行又一次迭代计算,直到到达收敛精度退出或迭代次数退出xj:源点云点yj:xj投影在目标点云隐藏曲面上的投影点nj: 距离xj最近的目标点云中的那个...
2021-07-02 22:11:42
465
原创 ubumtu20.04 默认安装的是PCL-1.10
ubumtu20.04 默认安装的是PCL-1.10 如果代码用到PCL库,则CMakeList.txt的c++版本要用到至少c++14set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3")
2021-06-29 21:50:23
1072
2
原创 cmakelist.txt
link_directories(库路径)...add_executable(可执行文件名 源文件)target_link_libraries(可执行文件名 库名称)link_directories 和target_link_libraries 配合使用 可以链接自定义的库的位置这个库名词就是去掉lib 和后缀的名称link_libraries 和target_link_libraries用法相同, 只是前者在add_executable之前用,后者在add_execu...
2021-06-29 14:21:36
92
原创 std::make_shared<T>
头文件 #include template <class T, class... Args> shared_ptr<T> make_shared (Args&&... args);std::shared_ptr<int> cheng = std::make_shared<int>(10);
2021-06-29 14:17:10
204
原创 std::bind 类实例绑定参数
std::bind是c++11 ,绑定参数 返回新的函数指针。头文件#include 1.绑定参数,利用占为符int Func(int x, int y){ return x + y;}int main(){ //bf1把拥有两个参数的普通函数的第一个参数绑定为10,生成了一个新的一个参数的函数 auto bf1 = std::bind(Func, 10, std::placeholders::_1); cout< system("pause...
2021-06-25 15:28:24
448
原创 operator bool ()
类隐式类型转换。即将类实例转为该种类型。#include using namespace std;class A{public: A(int a) :_a(a) {} operator bool() { cout << "operator bool" << endl; return _a; }private: int _a;};int main(){ A a(0); A ...
2021-06-25 15:18:20
460
原创 c++11 =default
c++ 有默认构造函数,若自己定义构造函数,则不会再自动生成默认构造函数,导致如果生成该类的实例时如果使用默认构造函数会报错。涉及到POD类型,C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局的(standard layout)。只有满足这两个基本概念才能称为是POD类型。一个trivial class或者struct应该符合以下定义:拥有平凡的默认构造函数(trivial constructor)和析构函数(trivial destructor)trivia
2021-06-25 09:41:30
131
原创 dwa评价分析更新中
dwa_local_planner 源码的路径打分逻辑的分析首先是进行裁剪, 这里分了两部,首先,根据机器人当前的世界坐标系的位姿,然后将全局下坐标系map下的路径转到局部代价地图坐标系下/dom下,这里都是全局坐标系,其不同是在move_base的构造函数中实现的,planner_costmap_ros_=newcostmap_2d::Costmap2DROS("global_costmap",tf_);controller_costmap_ros_=newcostmap_2d:...
2021-06-07 00:38:51
364
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人