- 博客(45)
- 收藏
- 关注
原创 Tensorrt部署模板代码
Tensorrt是一个非常高效快速的深度学习推理部署框架,网上有很多关于这个原理和用法的介绍。这个部署代码看着非常复杂,其实很大一部分是固定的模版。所以我把其中固定模版部分,写一个代码模板,这样不了解背后原理的朋友也可以简单复用。我的代码是以Tensorrt 10.0为例,其它版本需要根据实际情况调整。
2025-12-19 22:41:39
142
原创 深度学习调试记录
今天编写了一个轨迹编码解码的神经网络,但是训练的时候loss下降的非常慢,最后在0.2附件徘徊。所以,记录一下轨迹编码的网络的训练过程:看起来是。这种情况先别盲改“层数/学习率”,按下面顺序快速定位——从“能不能在极简场景上学到接近 0 的损失”开始。如果连极简都不行,多半是问题;如果极简能,才去调容量/学习率。
2025-09-30 17:10:35
1032
原创 常见的相机模型针孔/鱼眼(Pinhole,Mei,K
2.1 切向径向畸变(RadTan,radial-tangential distortion)上述模型的计算公式,可以看上面两个链接。3.Kannala-Brandt(鱼眼相机):Pinhole + EQUI。1.Pihole(针孔相机): Pinhole + RadTan。2.Mei(鱼眼相机): Omni + RadTan。2.2 视野畸变(FOV,field of view)2.3 等距畸变(Equidistant,EQUI)1.1 Pinhole投影模型。上去畸变,然后再投影。
2025-09-04 11:36:11
444
原创 C++中不加{}导致的BUG
判断程序,然后第一次运行的时候,没有任何问题,后面想把中间过程打印出来,就加了一行。打印程序,结果程序直接无法运行了,找了半天也没有找到问题,后面发现是因为没有加。欸,写C++切莫装逼,老老实实一行一行写!最近改一个开源代码,里面有一段程序是一个。源码里面else后面没有加。,我加一个行打印就变成。
2025-08-22 10:42:01
282
原创 视觉惯性SLAM中初始化时g的大致验证方法
在视觉惯性里程计初始化的时候,我们会参照第一帧相机做初始化。因此,重力需要转换到第一帧相机坐标系下。在初始化过程中,我们会求得重力在第一帧相机坐标系的方向和大小。假设我们大致知道相机在世界坐标下的位姿,比如做轮式机器人,相机水平安装的话,y轴向下,z轴向前。如果与这个结果相差很多,说明结果有问题。在世界坐标系下实际加速度大小,
2025-08-12 20:58:12
212
原创 Lego-Loam TransformToStartIMU TransformToStart TransformToEnd的区别
因为雷达是在运动,所以每帧点云最后一个点的参考坐标系与该帧第一个点的点云坐标系不重合。这个函数就是将每帧中每个点的参考坐标系的旋转姿态都转换为该帧第一个点的参考坐标系的旋转姿态。帧最后一个点的参考坐标系与第一个点的参考坐标系之间的位姿变换。因为用每帧的最后一个点的参考坐标系作为该帧的参考坐标系,所以。Lego-Loam是以每帧的最后一个点的参考坐标系作为该帧的参考坐标系。帧最后一个点的参考坐标系与第一个点的参考坐标系之间的位姿变换。因为,每帧最后一个点的参考坐标系,就是下一帧的第一个点的参考坐标系。
2025-08-04 16:24:35
287
原创 一些SLAM中Ceres优化问题记录
Ceres options可以选择优化的策略,一开始我用的是Levenberg-Marquardt优化。因为需要对姿态进行优化,当执行行驶的时候,姿态残差优化正常能够收敛。后来发现Levenberg-Marquardt不适合初值不好的情况,当初值和最终优化值比较接近时才比较好用。所以拐弯的时候,姿态初值偏离最终优化值较大,LM就不能正常收敛了。自己用轮式码盘的速度写了一个约束Factor,后面优化的时候发现这个约束的残差越迭代越大。但是我Evaluate函数里面的雅可比矩阵是正常的。
2025-04-02 10:13:47
261
原创 多传感器融合SLAM中如何检验编写的Factor是否有效
多传感器融合中,用Ceres做后端优化,后端可能包含不同Factor,例如雷达的Factor,相机的Factor,或者一些约束例如地面约束的Factor。一般如果这个Factor的雅可比矩阵没有问题,这个Factor的残差都会收敛到接近0。
2025-04-02 09:38:27
293
原创 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
270
原创 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
264
原创 SLAM如何在Ceres中计算残差对四元数的雅可比矩阵
rq2∗Qimu−1⊗Qivecrq2∗Qimu−1⊗Qivec其中Qi是待优化变量rq对Qi求导其表达式为:其中Qi是待优化变量rq对Qi求导RleftQimu−1⊗QiRleftQimu−1⊗Qi100001000010000010000100001。
2025-02-20 11:42:56
745
原创 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
741
原创 Apollo如何在编译组件时引入自定义头文件和库文件
如果你已经有一个动态库文件A.so,并希望在 Bazel 中引用它,你需要使用cc_import规则来导入这个现成的动态库。以下是具体的步骤和示例。
2025-01-11 03:27:37
476
原创 Ceres优化时梯度下降很小,优化变量几乎没有更新
最近写了一个IMU-轮式紧耦合的里程计,IMU的角速度积分比较准确,但是IMU加速度积分出的速度漂移特别大。轮式的速度比较准确,因此轮式的速度来约束IMU加速。但是,雅可比矩阵就是单位矩阵,为什么或错了。Eigen::Map如果不声明,就是按照列顺序填充,举一个例子。不可能这么小,因此只有一种可能,就是雅可比矩阵。特别下,梯度非常小,优化几步就停止优化了。,行数与残差维度相同,列数与变量维度相同。算出的列向量中最大的那个值,其中。是按照行顺序计算的雅可比矩阵,即。如果按照列顺序填充,如果按照行顺序填充,
2024-12-18 12:12:31
728
原创 double const * const * x 用法和行为,指针常量指向一个常量指针
x是一个常量指针,不能改变其指向。x指向的指针的指向可以改变,但它所指向的double值是不可修改的。通过这个例子,我们可以清楚地看到如何使用以及它的限制。
2024-12-17 15:48:54
963
原创 IMU姿态推算,根据角速度更新IMU的姿态
时刻的姿态,有两种方法。具体推算过程这里就不放了,只放最后公式,会用就行了。在看下述内容之前,大家需要对四元数有一定基础。可以做下述线性近似,在一些计算时可以做简化。已知IMU的三轴角速度。已知IMU的三轴角速度。,就可以算出旋转的角度。
2024-12-11 14:28:01
1296
原创 C++中#param once使用以解决multiple definition错误
可以避免重复引用,同一个源文件如果已经引入过一次莫个头文件就不会再引入第二次。因为引入头文件,可以理解为把头文件的内容赋值粘贴到当前文件中。的时候就不会出现多重定义的错误,因为所有源文件都共享同一个变量。但是上述代码只针对同一个编译单元(同一个源文件)有效。,并且它们两个编译为一个可执行程序。就会报多重引用的错误。如果解决这个问题,就需要用到。中间文件,再连接为可执行文件。中就会报错多重定义的错误,因为。,相当于把里面的内容复制两次到。都是单独编译的,先编译为。被定义了两次,一次在。如何引用并不会影响到。
2024-12-04 16:28:12
345
原创 无默认构造函数的类成员变量如何初始化
使用初始化列表: 在构造函数的初始化列表中初始化成员变量是 C++ 的标准做法,确保成员变量在构造函数主体执行之前被正确构造。避免赋值: 在构造函数主体中对成员变量进行赋值可能会导致错误,特别是当成员变量没有默认构造函数时。始终在初始化列表中进行初始化。如果B的构造函数参数需要在A的构造函数中才能确定,可以使用或者在A的构造函数中进行一些计算或逻辑处理,然后在初始化列表中使用这些计算结果来初始化B的实例。使用可以延迟B的构造,直到有足够的信息来初始化它。
2024-11-18 15:12:53
486
原创 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
1020
原创 Ubuntu中Python加载C扩展模块命名格式
模块名中的是由 Python 的构建工具根据当前的Python 版本和操作系统自动生成的,以确保模块能够被正确识别和加载。
2024-10-12 18:41:11
590
原创 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
591
原创 CMakeLists.txt 中add_libraries()生成动态库和静态库的区别,以及各自链接依赖库的区别
静态库:编译时链接,运行时不需要外部库,体积大,更新不便。动态库:运行时链接,体积小,更新方便,但依赖于外部库的存在和兼容性。选择使用静态库还是动态库,通常取决于具体的应用需求和部署环境。在 CMake 中,函数可以用来创建库,但默认情况下它并不总是创建静态库。具体来说,的行为取决于你提供的参数。
2024-09-02 00:15:09
1010
原创 CMake中指定find_package()包的路径的方法
选项都是用于指定查找库和包的路径,但它们的用途和优先级有所不同。推荐使用场景:当你有自定义的查找模块或需要使用特定的 Find 模块时,可以使用这个变量。用途:用于指定查找包时的前缀路径。用途:用于指定交叉编译时的查找根路径。推荐使用场景:当你有多个安装位置或需要指定特定的库路径时,可以使用这个变量。推荐使用场景:在进行交叉编译时,指定目标平台的库和头文件路径。用途:用于指定 CMake 模块的查找路径,主要是用于查找。:用于指定查找包时的路径,优先级高于默认路径,但低于。中的路径会被优先考虑。
2024-08-16 17:04:56
1029
原创 Linux动态库链接问题常见错误(/usr/bin/ld或者undefined reference to)报错
Linux系统下编译和运行程序时候,经常出现动态库链接的问题,主要有两种情况,一种是编译的时候链接问题,另一种是运行的时候链接。
2024-08-12 01:03:01
16924
4
原创 编译报错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
439
原创 Docker使用教程(全网最全面,看完包会)
Docker 是一个开源的容器化平台,旨在简化应用程序的开发、交付和运行。它允许开发者将应用程序及其所有依赖项打包到一个轻量级的、可移植的容器中,从而确保在不同环境中(如开发、测试和生产)都能一致地运行。
2024-08-06 17:34:36
13164
原创 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
600
原创 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
695
原创 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
308
原创 Linux dpkg -x 安装deb包到制定目录
dpkg -i xx.deb是安装到系统制定目录,Linux文件系统是将相同类型对文件放在同一个文件夹下。所以这样安装十分分散。如果需要将deb包安装在制定目录 ,使用下面命令行dpkg -x。
2024-01-28 18:00:38
4907
1
原创 Linux C++ main函数终端参数输入空格导致的错误
在lauch,json文件里,因为加了“ ”,所以当成一个字符串处理。自己debug一点问题没有,没有任何报错,代码也想不出哪里有问题。解决方法是要么将wall contour2.pg改成wall_contour2.jpg或者在终端输入的时候加入双引号。上面代码是opencv对图像进行裁切的函数,代码非常简单。这段程序需要在命令终端传人参数。
2024-01-25 22:57:08
544
1
原创 二维数组索引越界
自己定义了一个二维数组,初始化值为0,大小是图片mask的大小,里面的值代表点云的索引,即point_index。程序里面索引到mask.rows和mask.cols时就越界了,导致值溢出。通过Debug调试软件定位,发现是point_index超出点云最大的索引了。上述代码运行的时候报一下错误。但是取值的时候忘了,其。
2024-01-19 22:02:24
564
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
2193
1
原创 error: declaration of ‘pcl::CorrespondencesPtr correspondences’ shadows a parameter
开始以为是pcl::CorrespondencesPtr的变量声明有问题,后面发现不是这个问题。当一个局部变量的名称与外部作用域的参数名称相同时。这种情况可能会导致混淆和错误的使用,因此编译器会给出警告或错误。解决 “shadows a parameter” 错误的方法是避免在局部作用域内使用与外部作用域同名的变量。可以通过修改变量名或者将变量的作用域限定在不同的范围内来解决这个问题。原因是自定义的变量名与函数的输入参数同名了,所以会出现shadows a parameter的问题。
2023-12-28 17:29:32
681
1
原创 pcl::PointCloud<pcl::PointXYZ>和pcl::PointCloud<pcl::PointXYZ>::Ptr传参的时候的转换
cloud_max_cluster是Ptr的格式,所以传入*cloud_max_cluster,对指针进行取值,结果还是出现报错。在函数声明的地方忘记改了,函数声明的地方,参数是智能指针。将函数声明的地方和函数定义的地方改成一样的即可。
2023-12-20 11:52:03
1262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅