- 博客(56)
- 收藏
- 关注
原创 gdb调试多线程程序
step:其他线程也会随着调试线程的执行(continue、n、finish)而执行,但是调试对象一般不会切换到其他线程,保持在当前线程,除非某一线程遇到了断点,此时gdb会将遇见断点的线程作为当前线程。目的:gdb中断于某个线程后,通过n单步执行,会使得所有线程都走一步,那么能不能让其他线程停止而只让我们关心的线程运行?作用:切换到某个线程,然后通过bt可以查看该线程的堆栈。on: 只有当前线程可以运行,其他线程暂停。ps aux | grep 可执行文件名。命令:t + 线程id。*表示当前调试线程。
2024-07-17 16:00:46
267
原创 使用Socket进行通信时send函数和recv函数的底层机制
答:如果接收方没有及时读取数据(即没有执行recv),接收缓冲区可能会填满,这可能会导致发送方的发送缓冲区也填满(因为TCP协议会保证数据的可靠传输,所以发送方在收到接收方的确认之前不会释放发送缓冲区中的数据)。另一方面,如果发送方发送数据的速度远远超过接收方读取数据的速度,接收方的接收缓冲区可能会很快填满,从而间接导致发送方的缓冲区填满,从而导致send阻塞(在阻塞模式下)。答:在Linux中,socket的接收和发送内核缓冲区大小是可以通过系统配置和编程接口进行调整的。修改缓冲区大小的方法。
2024-06-12 13:35:22
386
原创 ros DWA局部规划模块
generator_是轨迹生成器base_local_planner::SimpleTrajectoryGenerator,在DWAPlanner的构造函数中,可以看到,generator_被放置到了generator_list,然后传入了base_local_planner::SimpleScoredSamplingPlanner的构造函数构造出了scored_sampling_planner_。这里调用的是dp_的setPlan(),dp_是指向DWAPlanner的指针。
2024-06-01 06:20:56
902
原创 qt工程交叉编译出现Exec format error
初步判断是由于在X86计算机上交叉编译arm64平台的qt工程时,调用了ARM平台的moc(元对象编译器)和uic(用户界面编译器), 但显然在X86计算机上应该调用X86平台的,否则就会出现Exec format error。但个人更希望直接设置cmake或系统环境变量让qt能自行调用/usr/lib/qt5/bin中的执行程序,但目前没有找到方法。看到的朋友若有更好的解决办法还望告知一下^ . ^暂时的解决办法是,将X86的moc,uic,rcc文件直接拷贝到交叉编译系统目录下替换原文件。
2024-05-10 00:53:37
292
原创 ros导航框架-move_base
那么,局部规划模块便会依据这个全局路径以及反馈的机器人实时位姿,求解出速度,细节见---------------------------------------在这里runPlanner_ 执行规划标志置位,同时触发条件变量planner_cond_, 这时把目光转移到MoveBase::planThread线程中,runPlanner_){} 开始继续执行,可以看到,全局规划的结果latest_plan_赋值给了controller_plan_,然后,将全局规划的路径传给了局部规划模块。
2024-04-30 08:52:03
425
原创 ros导航框架-代价地图
ObstacleLayer继承了CostmapLayer的父类,而CostmapLayer类又继承Layer类和Costmap2D类,因此ObstacleLayer的地图数据保存在继承于Costmap2D类的costmap_。从前面可以知道,这里传入到master_grid的是LayeredCostmap类的costmap_,也就是将该障碍物层的代价数据更新到LayeredCostmap类的costmap_上。将各层代价地图的代价值整合到costmap_上,costmap_就是master layer.
2024-04-29 19:12:20
780
原创 C++对象的内存结构以及RTTI
类中一旦有虚函数,就会产生虚函数表,虚函数表的按照顺序保存了该类中所有虚函数指针,并且对象中会生成指向该虚函数表的虚函数指针,虚函数表通常被放置在程序可执行文件的只读数据段(例如 .rodata 或 .rdata)中。RTTI(Run-Time Type Information,运行时类型信息)是C++语言的一个特性,它提供了在运行时获取对象的类型信息的能力。如果类B继承自类A,那么B对象的内存放置顺序是先布置继承来的A相关成员数据,且和A对象的内存对齐情况一致。如下,4字节对齐时,内存占用是16。
2023-12-18 21:30:15
119
原创 平面运动机器人的传感器外参标定
对任意两个传感器进行外参标定可以采用手眼标定算法来完成,但是,传统手眼标定算法对于运动具有一定的要求,可以证明,才可以正确估计出外参旋转,因此,如果使用手眼标定算法标定外参,例如标定imu与激光雷达、imu与相机、多激光雷达的外参… 那么需要充分的全方位空间的旋转和平移运动,才可以成功完成标定。但是如果机器人是处于平面运动的地面机器人呢?
2023-11-10 18:47:57
722
原创 交叉编译错误:小心符号链接
一个被破坏的链接符号,原来这仅仅是个链接符号而不是库文件实体,其链接的对象是/etc/alternatives/libblas.so.3-aarch64-linux-gnu,这个实际指的是ARM系统中的路径,而我并没有将这个目录从ARM系统中拷贝到X86主机中来,因此这个符号链接自然就没法使用了。可以看到它指向的是同目录下的libblas.so.3.10.3,因此实际我们需要的库文件就在/usr/lib/aarch64-linux-gnu/atlas中。
2023-09-21 20:42:33
240
原创 记录YDLidar驱动包交叉编译时出现的一点问题
名称为ydlidar_sdk,pthread和rt的库,注意这个名称不是库文件名,而是库的标识名,是在add_library()中设置的,对于静态库,标识名为ydlidar_sdk的库实际的库文件名为libydlidar_sdk.a, 对于共享库为libydlidar_sdk.so。可以看到,缓存变量YDLIDAR_SDK_LIBRARIES设置为了"ydlidar_sdk;而YDLIDAR_SDK_INCLUDE_DIRS的路径是原X86系统的路径,这显然是不正确的,应该要改为交叉编译的系统根目录路径。
2023-09-15 22:04:18
243
原创 一种简单高效的IMU姿态解算方法
(2)、陀螺仪短时间准确,而长时间有累计误差,加速度计短期噪声大,而长期比较准确,因此,将校正的时间间隔作为权重的考量因素,时间过的越久,就越不相信陀螺仪的结果,而更相信重力观测的结果。(3)、除了模长外,还要考虑由重力和陀螺仪单独恢复出来的姿态角之间的差异,校正只在两个姿态角接近的时候执行,因为,在重力观测可靠时,重力恢复的姿态角和陀螺仪恢复的姿态角之间的误差很小,而当这个误差很大时,大概率是由与剧烈运动所产生的加速度噪声引起的,因此过滤掉。静止时,可以看到加速度解算的结果有很大的噪声。
2023-08-10 00:03:08
677
原创 欧拉角内旋和外旋的等价性
我们知道对于欧拉角一直有一个结论是:一个x-y-z的内旋,等价与z-y-x的外旋(内旋即下一次的旋转绕着上一次的坐标轴,外旋则是每次旋转都是绕着固定的初始坐标轴)。, 在对x->y->z的外旋的分析中,将对坐标系的旋转考虑成对每个坐标基底向量的旋转,求解出坐标系旋转后的即基底,的最后根据同一向量在不同基底下等价推出。, 即x-y-z的内旋和z-y-x的外旋过后实际得到的是一个相同的坐标,这就是等价的意义。,那么显然,如果是z->y->x的外旋,就和x->y->z的内旋的效果一样了。
2023-07-07 21:39:45
718
原创 CMAKE关于FIND_LIBRARY和FIND_PATH
FIND_LIBRARY()是一个用于查找.a,和.so库的CMAKE命令。常用的用法如下:(1)、查找.so库G2O_SOLVER_EIGEN_LIB:查找到库文件后,这个名字就是这个库的别名。NAMES:为要查找的.so库标识名,注意要把lib前缀和.so后缀去掉,比如在这个例子中,查找的就是libg2o_solver_eigen.so库。PATHS:即查找的父目录。PATH_SUFFIXES:指定了要搜索的子目录名称。
2023-04-09 06:01:19
1357
原创 noexcept移动构造函数对vector push_back的优化作用
noexcept移动构造函数对vector push_back的优化作用
2022-09-24 22:38:47
632
原创 多激光雷达的在线外参标定
MLOAM源码要点总结1、简介2、算法流程3、主要问题1、简介MLOAM是港科大刘明教授团队开源的多激光雷达里程计方案,其主要特色为:1、多激光雷达的外参在线标定。2、基于滑动窗口优化的多激光融合运动估计。2、算法流程1、标定模式2、里程计模式(1)、仅仅利用参考激光雷达(IDX_REF)的数据计算粗略的帧间里程计(2)、对每个激光雷达的激光数据进行降采样,并存放与:corner_points_stack_中(3)、滑动窗口窗口优化 optimizeMap()滑窗中优化的状态主要有:
2022-02-20 19:14:12
2413
3
原创 ceres 使用时链接报错
编译成功后出现:/usr/local/lib/libceres.a(visibility_based_preconditioner.cc.o):在函数‘ceres::internal::VisibilityBasedPreconditioner::ComputeBlockPairsInPreconditioner(ceres::internal::CompressedRowBlockStructure const&)’中:visibility_based_preconditioner.cc:(.
2021-08-24 13:44:44
2287
3
原创 cartographer 模块篇1 激光数据处理
传感器数据处理1、激光数据处理1.1 原始点云处理1.2 点云去畸变1.3 滤波1、激光数据处理1.1 原始点云处理1.2 点云去畸变首先, 获取该帧第一个激光点的时间戳,// 得到第一个点的时间戳 const common::Time time_first_point = time + // 第一帧时间 common::FromSeconds( synchronized_dat
2021-05-11 13:12:27
1168
原创 cmake编译时出现 /usr/bin/ld: cannot find -lBoost::timer
加入find_package(Boost REQUIRED COMPONENTS timer)即可
2021-03-30 10:57:24
1427
7
原创 基于因子图优化的激光IMU融合SLAM学习
因子图优化激光&IMU融合激光特征的处理IMU的处理GPS的处理主要学习今年最新开源的LIOSAM.LIOSAM 点云预处理与特征提取的环节的分析见这里 legoloam系列算法之点云处理与特征提取这里主要学习的是在提取了激光特征后, 融合IMU, GPS 实现激光里程计的方法, 虽然LIOSAM也是具有回环的, 但是用的方法基本和legoloam一样, 所以重点就放在 激光里程计上.梳理一下主要文件:关于IMU的融合主要在src/imuPreintegration.cpp中完成.接
2020-12-21 02:09:24
4771
3
原创 legoloam系列算法之点云处理与特征提取
lins和legoloamlins和lego_loam的点云预处理环节是一样的, legoloam 在 imageProjection.cpp中完成, 而 lins 在image_projection_node.cpp中完成.
2020-08-12 21:35:44
2814
原创 手写VIO代码解析(1) -IMU
IMU欧拉角欧拉角与旋转矩阵的转换欧拉角速度与body角速度的转换IMU模拟数据的产生IMU运动学模型欧拉积分中值积分欧拉角欧拉角是一种表达姿态的方法,一般常用的欧拉角是ZYX,表示先绕Z轴旋转(yaw),再绕Y轴旋转(pitch)。再绕X轴旋转(roll),如果世界坐标系能够通过某个欧拉角旋转使之与body坐标系重合,那么就可以用该欧拉角表达body坐标的姿态。欧拉角与万向锁万向锁视频...
2020-08-10 16:19:08
843
原创 const 与 & 做为函数返回值
首先我们有下面两个函数, 一个返回引用一个返回值。int temp; // 全局变量 float fn1(float r){ temp = ... .... return temp;} float &fn2(float r){ //&说明返回的是temp的引用,换句话说就是返回temp本身 temp = ... ...... return temp;}有以下几种情况:float a=fn1(5.0);此时,fn1返回时
2020-07-24 12:34:27
1379
1
原创 Vins-mono 源码笔记 (8) 后端优化各种残差Factor总结
后端优化理论总结IMU factorEvaluate()IMU factorIMU factor的定义是:// ceres 中每个Factor 都是 CostFunction 类的子类 7,9 分别表示 姿态, 速度偏置的维度 class IMUFactor : public ceres::SizedCostFunction<15, 7, 9, 7, 9>{ ....... }它是 SizedCostFunction 类的子类, 同时也是 CostFunction
2020-07-08 00:52:23
935
原创 基于卡尔曼滤波器融合的激光IMU激光里程计学习
主要学习的是港科大今年开源的LINS算法.该算法是直接在lego上面改的,主要针对的还是16线激光.算法主要的核心是在激光里程计节点, 只需要重点学习这部分就可以了.
2020-06-21 17:17:55
3963
1
原创 slam 与定位中的 地面检测
pcl::PointIndices在PCL中的定义如下,它通过std::vector indices来存储索引。struct PointIndices { PointIndices () {} ::pcl::PCLHeader header; std::vector<int> indices; public: using...
2020-05-18 01:18:04
3061
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人