自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SLAM中使用四元数和李代数求导的区别

就用四元数方法,如何后面乘以一个列向量就用李代数方法。后面乘以一个旋转矩阵。

2025-04-02 10:49:37 300

原创 一些SLAM中Ceres优化问题记录

Ceres options可以选择优化的策略,一开始我用的是Levenberg-Marquardt优化。因为需要对姿态进行优化,当执行行驶的时候,姿态残差优化正常能够收敛。后来发现Levenberg-Marquardt不适合初值不好的情况,当初值和最终优化值比较接近时才比较好用。所以拐弯的时候,姿态初值偏离最终优化值较大,LM就不能正常收敛了。自己用轮式码盘的速度写了一个约束Factor,后面优化的时候发现这个约束的残差越迭代越大。但是我Evaluate函数里面的雅可比矩阵是正常的。

2025-04-02 10:13:47 165

原创 多传感器融合SLAM中如何检验编写的Factor是否有效

多传感器融合中,用Ceres做后端优化,后端可能包含不同Factor,例如雷达的Factor,相机的Factor,或者一些约束例如地面约束的Factor。一般如果这个Factor的雅可比矩阵没有问题,这个Factor的残差都会收敛到接近0。

2025-04-02 09:38:27 213

原创 Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value

【代码】Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int;int Value。

2025-03-13 11:40:43 218

原创 ROS中cv_bridge动态库与Opencv库版本版本冲突导致goodFeaturesToTrack() Segment Fault错误

opencv中goodFeaturesToTrack()是检测角点的函数,然后在ROS中调用这个函数检测图像角点出现了Segment Fault错误。然后我排查了所有参数,都没有任何问题。然后我在Debug模式中,发现最后出问题的地方是。以前也经常在ROS中调用其它的版本的OpenCV的库。编译的时候会提示冲突,我没有管,也可以正常运行。没想到这次栽在这上面了。所以怀疑是库版本不一致导致的冲突。我的OpenCV版本是4.10, ROS2中。

2025-03-12 15:24:47 188

原创 SLAM如何在Ceres中计算残差对四元数的雅可比矩阵

rq2∗Qimu−1⊗Qivecrq​2∗Qimu−1​⊗Qi​vec其中Qi是待优化变量rq对Qi求导其表达式为:其中Qi​是待优化变量rq​对Qi​求导RleftQimu−1⊗QiRleft​Qimu−1​⊗Qi​1000010000100000​1000​0100​001。

2025-02-20 11:42:56 574

原创 Ceres中LocalParameterization参数Jacobian矩阵计算过程

以四元数为例,QuaternionParameterization 的方法 bool ComputeJacobian(const double* x, double* jacobian) 计算得到一个 4x3 的矩阵。这些由 ComputeJacobian 计算得到的矩阵在 ceres 代码中被称作 “global_to_local”,含义是 Manifold 上变量对 Tangent Space 上变量的导数。例如四元数维度为4,其实际自由度为3。对于这类变量,Ceres在优化这类变量时,会定义一个。

2025-02-20 10:11:50 554

原创 Apollo如何在编译组件时引入自定义头文件和库文件

如果你已经有一个动态库文件A.so,并希望在 Bazel 中引用它,你需要使用cc_import规则来导入这个现成的动态库。以下是具体的步骤和示例。

2025-01-11 03:27:37 348

原创 Ceres优化时梯度下降很小,优化变量几乎没有更新

最近写了一个IMU-轮式紧耦合的里程计,IMU的角速度积分比较准确,但是IMU加速度积分出的速度漂移特别大。轮式的速度比较准确,因此轮式的速度来约束IMU加速。但是,雅可比矩阵就是单位矩阵,为什么或错了。Eigen::Map如果不声明,就是按照列顺序填充,举一个例子。不可能这么小,因此只有一种可能,就是雅可比矩阵。特别下,梯度非常小,优化几步就停止优化了。,行数与残差维度相同,列数与变量维度相同。算出的列向量中最大的那个值,其中。是按照行顺序计算的雅可比矩阵,即。如果按照列顺序填充,如果按照行顺序填充,

2024-12-18 12:12:31 638

原创 double const * const * x 用法和行为,指针常量指向一个常量指针

x是一个常量指针,不能改变其指向。x指向的指针的指向可以改变,但它所指向的double值是不可修改的。通过这个例子,我们可以清楚地看到如何使用以及它的限制。

2024-12-17 15:48:54 833

原创 IMU姿态推算,根据角速度更新IMU的姿态

时刻的姿态,有两种方法。具体推算过程这里就不放了,只放最后公式,会用就行了。在看下述内容之前,大家需要对四元数有一定基础。可以做下述线性近似,在一些计算时可以做简化。已知IMU的三轴角速度。已知IMU的三轴角速度。,就可以算出旋转的角度。

2024-12-11 14:28:01 1054

原创 C++中#param once使用以解决multiple definition错误

可以避免重复引用,同一个源文件如果已经引入过一次莫个头文件就不会再引入第二次。因为引入头文件,可以理解为把头文件的内容赋值粘贴到当前文件中。的时候就不会出现多重定义的错误,因为所有源文件都共享同一个变量。但是上述代码只针对同一个编译单元(同一个源文件)有效。,并且它们两个编译为一个可执行程序。就会报多重引用的错误。如果解决这个问题,就需要用到。中间文件,再连接为可执行文件。中就会报错多重定义的错误,因为。,相当于把里面的内容复制两次到。都是单独编译的,先编译为。被定义了两次,一次在。如何引用并不会影响到。

2024-12-04 16:28:12 209

原创 无默认构造函数的类成员变量如何初始化

使用初始化列表: 在构造函数的初始化列表中初始化成员变量是 C++ 的标准做法,确保成员变量在构造函数主体执行之前被正确构造。避免赋值: 在构造函数主体中对成员变量进行赋值可能会导致错误,特别是当成员变量没有默认构造函数时。始终在初始化列表中进行初始化。如果B的构造函数参数需要在A的构造函数中才能确定,可以使用或者在A的构造函数中进行一些计算或逻辑处理,然后在初始化列表中使用这些计算结果来初始化B的实例。使用可以延迟B的构造,直到有足够的信息来初始化它。

2024-11-18 15:12:53 379

原创 vscode GDB debug ROS2的launch文件如何选择Python解释器

ROS2中launch文件改用Python脚本,运行命令为因此,如果在vscode中对ROS2的launch文件进行debug,就需要调用vscode的Python解释器。之前,本人在运行一个ROS2的launch文件时,使用命令运行脚本,没有任何报错。后面才发现这是因为Python版本不同导致的。在 ROS 2 中,使用启动 Python 脚本和直接使用运行脚本之间有几个关键的区别,这可能会导致你遇到的问题。

2024-10-12 19:31:15 584

原创 Ubuntu中Python加载C扩展模块命名格式

模块名中的是由 Python 的构建工具根据当前的Python 版本和操作系统自动生成的,以确保模块能够被正确识别和加载。

2024-10-12 18:41:11 484

原创 Ubuntu中vscode如何选择ROS版本

Ubuntu中可能安装了多个ROS版本,比如ROS1 noetic, ROS2 foxy, humble等。有时候需要在vscode中对ROS程序进行debug,一般会先安装。插件不知道选哪个版本。这个时候在.vscode目录中新建。这是因为系统中有多个ROS版本,vscode中。对ROS launch文件进行Debug。当电脑上有多个ROS版本时,选择。然后重启vscode就可以使用。

2024-10-12 18:27:41 459

原创 vscode如何通过ssh远程链接其它电脑

解压解包后名为 vscode-server-linux-x64 文件夹改名为。

2024-10-12 13:20:18 648

原创 CMakeLists.txt 中add_libraries()生成动态库和静态库的区别,以及各自链接依赖库的区别

静态库:编译时链接,运行时不需要外部库,体积大,更新不便。动态库:运行时链接,体积小,更新方便,但依赖于外部库的存在和兼容性。选择使用静态库还是动态库,通常取决于具体的应用需求和部署环境。在 CMake 中,函数可以用来创建库,但默认情况下它并不总是创建静态库。具体来说,的行为取决于你提供的参数。

2024-09-02 00:15:09 814

原创 CMake中指定find_package()包的路径的方法

选项都是用于指定查找库和包的路径,但它们的用途和优先级有所不同。推荐使用场景:当你有自定义的查找模块或需要使用特定的 Find 模块时,可以使用这个变量。用途:用于指定查找包时的前缀路径。用途:用于指定交叉编译时的查找根路径。推荐使用场景:当你有多个安装位置或需要指定特定的库路径时,可以使用这个变量。推荐使用场景:在进行交叉编译时,指定目标平台的库和头文件路径。用途:用于指定 CMake 模块的查找路径,主要是用于查找。:用于指定查找包时的路径,优先级高于默认路径,但低于。中的路径会被优先考虑。

2024-08-16 17:04:56 664

原创 Linux动态库链接问题常见错误(/usr/bin/ld或者undefined reference to)报错

Linux系统下编译和运行程序时候,经常出现动态库链接的问题,主要有两种情况,一种是编译的时候链接问题,另一种是运行的时候链接。

2024-08-12 01:03:01 10457 2

原创 编译报错boost::shared_ptr指针赋值类型错误

所以上述bug是因为shared_ptr的reset()函数传参时将boost::shared_ptr* 的变量赋值给laserScan*的变量,因为指针类型不同出现报错。cast一般用于类型转换,BOOST_ASSERT( p == 0 || p!= px )表示指针为空或在指针类型不同。所以,根据上述报错信息可以判断Bug是源自指针赋值时类型不同。’ ,另一个是‘boost::shared_ptr::element_type。然后提示信息中指出一个指针类型是‘boost::shared_ptr。

2024-08-07 00:07:54 315

原创 Docker使用教程(全网最全面,看完包会)

Docker 是一个开源的容器化平台,旨在简化应用程序的开发、交付和运行。它允许开发者将应用程序及其所有依赖项打包到一个轻量级的、可移植的容器中,从而确保在不同环境中(如开发、测试和生产)都能一致地运行。

2024-08-06 17:34:36 5600

原创 Kalibr 运行kalibr_calibrate_imu_camera报错 python boost库报错

运行kalibr中相机-IMU标定节点kalibr_calibrate_imu_camera 报错。kalibr_calibrate_imu_camera是一个python ROS节点。python ROS节点运行时需要在开头指定对应的python解释器。

2024-07-30 17:56:55 452

原创 error: #include nested too deeply #include “glog/vlog_is_on.h“

这种情况一般是有两种一种是A.h中引入了B.h,然后是B.h中引入A.h了,就是嵌套引用,这种情况可以看一下下述链接的解决方法。后来排查我是在A.h中不小心又#include <A.h>

2024-07-12 16:30:48 574

原创 Ubuntu Lightdm相关命令

Ubuntu开机黑屏,可以尝试下面两行命令。

2024-07-10 00:59:49 209

原创 BA优化中,存在5个相机10个点,假设10个点都能被观测到,求状态矩阵维度、误差矩阵维度、雅各比维度

SLAM中相机姿态用李代数(SE3)表示, SE3是6维的,路边点的位置是三维的(X,Y,Z),因此状态矩阵的维度是60。雅克比矩阵为误差矩阵对状态矩阵求导,维度为误差矩阵维度x状态矩阵维度,即100x60。一个相机中10个点的误差维度为20,5个相机为100。一个路标点的误差的维度为2,误差即为实际像素坐标(状态矩阵:1x(5x6+10x3)=1x60。误差矩阵:2x5x10 = 100。雅克比矩阵维度:100x60。)与观测的路标点的像素{

2024-04-23 10:09:10 263

原创 位姿的插值怎么做

【代码】位姿的插值怎么做。

2024-04-23 00:59:41 1037

原创 从零手写VIO-ch01课后习题答案和推导过程

【代码】从零手写VIO-ch01课后习题答案和推导过程。

2024-04-17 23:51:32 290

原创 Linux dpkg -x 安装deb包到制定目录

dpkg -i xx.deb是安装到系统制定目录,Linux文件系统是将相同类型对文件放在同一个文件夹下。所以这样安装十分分散。如果需要将deb包安装在制定目录 ,使用下面命令行dpkg -x。

2024-01-28 18:00:38 3789 1

原创 Linux C++ main函数终端参数输入空格导致的错误

在lauch,json文件里,因为加了“ ”,所以当成一个字符串处理。自己debug一点问题没有,没有任何报错,代码也想不出哪里有问题。解决方法是要么将wall contour2.pg改成wall_contour2.jpg或者在终端输入的时候加入双引号。上面代码是opencv对图像进行裁切的函数,代码非常简单。这段程序需要在命令终端传人参数。

2024-01-25 22:57:08 485 1

原创 二维数组索引越界

自己定义了一个二维数组,初始化值为0,大小是图片mask的大小,里面的值代表点云的索引,即point_index。程序里面索引到mask.rows和mask.cols时就越界了,导致值溢出。通过Debug调试软件定位,发现是point_index超出点云最大的索引了。上述代码运行的时候报一下错误。但是取值的时候忘了,其。

2024-01-19 22:02:24 468 1

原创 error: static assertion failed: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES

根据报错信息发现是矩阵相乘维度不统一的错误,一个矩阵是Derived = Eigen::Matrix<double, 4, 4>,另外一个矩阵是Eigen::Matrix<double, 3, 1>。Eigen可以表示空间转换的还有两种形式,一个是Eigen::Affine3d, 另一个是Eigen::Isometry3d。它们之间的区别在于它们所表示的变换类型和所包含的自由度。Eigen::Isometry3D 和Eigen::Affine3D是可以和3维向量直接相乘的。T是齐次转换矩阵,维度是。

2023-12-28 18:17:28 1792 1

原创 error: declaration of ‘pcl::CorrespondencesPtr correspondences’ shadows a parameter

开始以为是pcl::CorrespondencesPtr的变量声明有问题,后面发现不是这个问题。当一个局部变量的名称与外部作用域的参数名称相同时。这种情况可能会导致混淆和错误的使用,因此编译器会给出警告或错误。解决 “shadows a parameter” 错误的方法是避免在局部作用域内使用与外部作用域同名的变量。可以通过修改变量名或者将变量的作用域限定在不同的范围内来解决这个问题。原因是自定义的变量名与函数的输入参数同名了,所以会出现shadows a parameter的问题。

2023-12-28 17:29:32 576 1

原创 pcl::PointCloud<pcl::PointXYZ>和pcl::PointCloud<pcl::PointXYZ>::Ptr传参的时候的转换

cloud_max_cluster是Ptr的格式,所以传入*cloud_max_cluster,对指针进行取值,结果还是出现报错。在函数声明的地方忘记改了,函数声明的地方,参数是智能指针。将函数声明的地方和函数定义的地方改成一样的即可。

2023-12-20 11:52:03 1080

原创 opencv像素值索引越界导致异常的问题

例如,在 C++ 中,uchar value = img.at(y,x) 中,y 代表纵坐标,x 代表横坐标,ptr(y)[x]。但是在运行过程中发现有些点的像素值大于39,例如153,255等。我是用指针的方法查询像素值的。后来打印出来像素值异常的像素点的横纵坐标,发现v的坐标比cols大,但是程序并没有越界报错。当索引像素值时,只有当y为负数时,才会越界报错, y比行数大的时候,不会报错只会出现错误像素值。这里不得不提一下opencv像素索引的规则了,无论是用指针的方式,还是at的方式,都是y,x。

2023-07-10 22:32:23 368 1

原创 自定义语义点云可视化渲然,多版本VTK库冲突导致段错误(核心已转储),已解决。

总结一下,这个是一个由于多版本第三方库导致的问题,当我们运行的程序多的时候,电脑上有时候不可避免要装多个版本的第三方库,所以在编译的时候,一定要指定好第三方库的版本,如下面所示。Linux文件管理方式和Windows是不一样的,windows是把同一个库装到一个包中,Linux是按照文件类型进行分类的,比如把不同的库的头文件都放到 /usr/include中,把库文件放到 /usr/lib中,比较杂。找了好久才发现,他们不是同一个版本的库,头文件是7.1,源文件是9.2.2,我怀疑是库版本错误导致的。

2023-07-05 20:14:57 357 1

原创 ubuntu20.04 pcl1.08 cmake vtk报错The `PATH` argument is required.

近日在Ubuntu20.04上编译PCL 1.08,在cmake时遇到一个问题CMake Error at /usr/local/vtk922/lib/cmake/vtk-9.2/vtkDetectLibraryType.cmake:23 (message): The `PATH` argument is required.Call Stack (most recent call first): /usr/local/vtk922/lib/cmake/vtk-9.2/FindFreetype.c

2023-07-04 17:26:57 844 2

原创 Makefile入门,超级详细,cmakelists.txt生成的makefile文件一行一行注释

link.txt文件如下,这是一个链接命令,它使用 /usr/bin/c++ 编译器将 CMakeFiles/yolov8_onnx.dir/src/main.o 文件链接到可执行文件 yolov8_onnx。以前自己都是写CMakeList.txt文件,没有关注过Makefile文件,但是有时候CmakeList.txt却存在一些问题,比如当装有两个版本的库的时候,指示制定库的版本或者设置链接库的路径,但是仍然存在库链接错误的问题。同时all参数,说明是执行makefile2中的target all。

2023-07-03 21:25:54 2152 1

原创 PCL自定义点云可视化undefined reference to `pcl::visualization::PointCloudGeometryHandlerXYZ<PointXYZIL>问题

这类错误一般都是链接库时出现问题,但是我在CMakeLists.txt中已经链接了${PCL_LIBRARIES},后来查资料,发现undefined reference to 除了因为是没有找到库外,也有可能是函数定义的头文件没有引入。之前自己尝试写过很多代码调试的笔记,但是都是在飞书上写的。但是飞书上记录有个问题,就是自己没有动力去整理笔记,每次都相当于草稿一样简单记录一下。一个是给大家分享解决方法,另一个也是想当成一个笔记记录自己debug思路,同时也为自己积累经验。结果编译时出现如下问题。

2023-07-02 22:19:10 630 2

空空如也

空空如也

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

TA关注的人

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