- 博客(62)
- 收藏
- 关注
原创 点云的动态目标识别与滤除(视频)
4、用当前帧的点检测参考观测帧中待定的动态点,如果这些待定点被当前帧的视线穿过,那么这些待定点被认为是真正的动态点,否则转为稳定点。3、有些候选动态点,会被参考观测帧的点遮挡,那么暂时无法判断是否是真正的动态点,这部分点待定,由后续的观测帧判断是否是动态点。2、将当前的候选动态点转换到参考观测帧,检测那些被参考观测帧视线穿过的点,这部分点一定是动态点。1、对非地面点根据匹配情况以及目标跟踪模块的动态先验信息确定候选动态点。0、对输入点云进行快速分割,获取地面点和非地面点。2、进一步提高效率。
2025-01-08 10:51:45
229
原创 [开源]自动化定位建图系统(视频)
机器人建图定位系统-增量地图构建,手动回环检测演示。机器人建图定位系统-基础重定位,定位功能演示。2、Lifelong后端地图管理模块。1、多传感器融合里程计。3、Qt人机交互系统。
2025-01-06 18:50:51
547
原创 GDB调试ROS工程
如果没有-ex run,那么启动后就需要手动输入r才能使程序运行。1、CMakeLists.txt开启调试模式。-ex表示启动gdb后要执行的命令。
2024-12-17 15:05:02
195
原创 ROS2工程引用第三方库
这里我们以ndt_omp库为例来讲解ROS2工程如何引用第三方库。我们自己的库是slam_lib_3d, 这个库是一个标准的ROS2库,slam_lib_3d内部会使用到ndt_omp,因此,我们需要将ndt_omp引入slam_lib_3d中,使得slam_lib_3d能够使用ndt_omp中的符号以及找到对应的头文件。step1它将告诉colcon编译器slam_lib_3d的编译需要依赖ndt_omp,这样colcon将先编译ndt_omp,然后再编译slam_lib_3d。
2024-11-16 14:01:33
659
原创 使用docker进行ros2开发
docker的安装可以参考:https://blog.youkuaiyun.com/weixin_48602203/article/details/135057755启动小乌龟…这里再介绍一下正在运行的容器如何停止以及删除,这个实际操作中肯定能用得到。如果执行这条命令出现没有权限的问题,请执行,并且重启动电脑。vscode的dev-container 也可能出现连接不到docker容器的情况,同样这样处理。
2024-11-16 13:54:16
136
原创 [cmake] target_include_directories 以PUBLIC模式添加的路径为什么有时候无效
我们知道target_include_directories对于某个库文件采用PUBLIC的模式添加搜索路径后,不仅这些搜索路径会添加到该库文件的编译过程中,也会添加到依赖该库文件的其他目标文件的编译过程中。但是我最近在构建某些项目的时候发现有时target_include_directories的这个性质好像不管用,重新研究了一下总结了一下需要注意的点。
2024-11-05 11:12:15
399
原创 基于perf和火焰图进行程序性能优化
sudo perf top 可以看到整个系统消耗性能的函数。这里记录一次我使用perf和火焰图优化程序性能的过程。1、启动程序,查找到想要分析的进程的pid。2、使用perf对程序进行运行监测。4、在浏览器中打开火焰图进行分析。5、找出影响系统性能的函数。
2024-10-24 16:44:50
282
原创 gdb调试多线程程序
step:其他线程也会随着调试线程的执行(continue、n、finish)而执行,但是调试对象一般不会切换到其他线程,保持在当前线程,除非某一线程遇到了断点,此时gdb会将遇见断点的线程作为当前线程。目的:gdb中断于某个线程后,通过n单步执行,会使得所有线程都走一步,那么能不能让其他线程停止而只让我们关心的线程运行?作用:切换到某个线程,然后通过bt可以查看该线程的堆栈。on: 只有当前线程可以运行,其他线程暂停。ps aux | grep 可执行文件名。命令:t + 线程id。*表示当前调试线程。
2024-07-17 16:00:46
778
原创 使用Socket进行通信时send函数和recv函数的底层机制
答:如果接收方没有及时读取数据(即没有执行recv),接收缓冲区可能会填满,这可能会导致发送方的发送缓冲区也填满(因为TCP协议会保证数据的可靠传输,所以发送方在收到接收方的确认之前不会释放发送缓冲区中的数据)。另一方面,如果发送方发送数据的速度远远超过接收方读取数据的速度,接收方的接收缓冲区可能会很快填满,从而间接导致发送方的缓冲区填满,从而导致send阻塞(在阻塞模式下)。答:在Linux中,socket的接收和发送内核缓冲区大小是可以通过系统配置和编程接口进行调整的。修改缓冲区大小的方法。
2024-06-12 13:35:22
712
原创 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
1265
原创 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
582
原创 ros导航框架-move_base
那么,局部规划模块便会依据这个全局路径以及反馈的机器人实时位姿,求解出速度,细节见---------------------------------------在这里runPlanner_ 执行规划标志置位,同时触发条件变量planner_cond_, 这时把目光转移到MoveBase::planThread线程中,runPlanner_){} 开始继续执行,可以看到,全局规划的结果latest_plan_赋值给了controller_plan_,然后,将全局规划的路径传给了局部规划模块。
2024-04-30 08:52:03
1020
原创 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
1352
2
原创 C++对象的内存结构以及RTTI
类中一旦有虚函数,就会产生虚函数表,虚函数表的按照顺序保存了该类中所有虚函数指针,并且对象中会生成指向该虚函数表的虚函数指针,虚函数表通常被放置在程序可执行文件的只读数据段(例如 .rodata 或 .rdata)中。RTTI(Run-Time Type Information,运行时类型信息)是C++语言的一个特性,它提供了在运行时获取对象的类型信息的能力。如果类B继承自类A,那么B对象的内存放置顺序是先布置继承来的A相关成员数据,且和A对象的内存对齐情况一致。如下,4字节对齐时,内存占用是16。
2023-12-18 21:30:15
193
原创 平面运动机器人的传感器外参标定
对任意两个传感器进行外参标定可以采用手眼标定算法来完成,但是,传统手眼标定算法对于运动具有一定的要求,可以证明,才可以正确估计出外参旋转,因此,如果使用手眼标定算法标定外参,例如标定imu与激光雷达、imu与相机、多激光雷达的外参… 那么需要充分的全方位空间的旋转和平移运动,才可以成功完成标定。但是如果机器人是处于平面运动的地面机器人呢?
2023-11-10 18:47:57
873
原创 交叉编译错误:小心符号链接
一个被破坏的链接符号,原来这仅仅是个链接符号而不是库文件实体,其链接的对象是/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
382
原创 记录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
416
原创 一种简单高效的IMU姿态解算方法
(2)、陀螺仪短时间准确,而长时间有累计误差,加速度计短期噪声大,而长期比较准确,因此,将校正的时间间隔作为权重的考量因素,时间过的越久,就越不相信陀螺仪的结果,而更相信重力观测的结果。(3)、除了模长外,还要考虑由重力和陀螺仪单独恢复出来的姿态角之间的差异,校正只在两个姿态角接近的时候执行,因为,在重力观测可靠时,重力恢复的姿态角和陀螺仪恢复的姿态角之间的误差很小,而当这个误差很大时,大概率是由与剧烈运动所产生的加速度噪声引起的,因此过滤掉。静止时,可以看到加速度解算的结果有很大的噪声。
2023-08-10 00:03:08
1034
原创 欧拉角内旋和外旋的等价性
我们知道对于欧拉角一直有一个结论是:一个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
1398
原创 noexcept移动构造函数对vector push_back的优化作用
noexcept移动构造函数对vector push_back的优化作用
2022-09-24 22:38:47
765
原创 多激光雷达的在线外参标定
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
3049
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
2705
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
1522
原创 cmake编译时出现 /usr/bin/ld: cannot find -lBoost::timer
加入find_package(Boost REQUIRED COMPONENTS timer)即可
2021-03-30 10:57:24
1648
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人