自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分享本地文件给其他人访问

在想分享的文件夹下执行 python3 -m http.server 9999。为了保证不用每次都自己手动输入上述命令,则设置开机启动。

2023-03-24 14:51:22 240

原创 jupyter notebook import torch报错

jupyter

2023-02-17 14:42:32 504

原创 docker限制cpu使用率

1

2022-07-20 10:06:05 526

原创 ubuntu18.04 安装 ros

ubuntu18.04安装ROS(国内源)_W_X_123的博客-CSDN博客ROS报错:IOError:[Errno 13]permission denied: /home/neousys/.ros/roscore-11311.pid"_weixin_34343000的博客-CSDN博客

2022-03-31 20:51:46 220

原创 [apollo planning ] 参考文献

[1] github apollo 3.5- 2019年的,基于Apollo3.5 进行讲解。- 优点:对代码进行了详解[2] github - apollo 学习笔记- 清晰的介绍了规划模块的工程框架- 2021 年更新的- 没有深入到代码层面[3] 华为steve的规控算法之路- 这个专栏包含了规划中多个模块(pnc_map, QP 等)的详细讲解- 框架解析不错:Apollo 7.0 规划算法框架解析[4] 解析百度Apollo之参考线与轨迹...

2022-02-17 11:28:29 667

原创 常见的旋转插值

1. 四元数slerp插值 - slerp 插值的原理:这里- slerp 插值的工程实现:eigen 的 slerp 函数Eigen::Quaterniond q = q0.slerp(x0,q1);2. 轴角插值已知 R1 R2,以及插值尺度 s .1) 先计算 deltaR = R1.t * R22) deltaR = ( axis, theta)3) 插值结果 = R1 * (axis, theta * s )...

2022-01-25 11:33:38 4075 2

原创 Eigen 库使用的注意事项--- 运行时报错

因为eigen库分配内存的问题,所以使用eigen库时,如下两种情况要注意1. 自定义的类中包含 eigen::Matrix4d 等固定尺寸的类型参考:eigen官方说明例如:class Foo{ ... Eigen::Vector2d v; ...}; ... Foo *foo = new Foo;需要将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 插入到代码中:class Foo{ ... Eigen::Vector4

2022-01-18 14:27:17 1996

原创 [毫米波雷达建图系列]2. map generator node

目的:利用点云,生成概率栅格地图,并保存成 pgm 图片格式主要的函数有三个:void GetGridMap(); 注册地图SaveMap 可以保存成 pgm图片 或者 pcd 格式(3D点云)--pcl库publishMap 发布地图问题:1. TraceLine 函数是干啥的? cartographer中对于射线经过的格子做了free 处理吗?在 CastRays 函数中,有一个选项 insert_free_space 来决定,是否更新射线经过的格子。...

2021-12-08 16:13:55 892 1

原创 [cartographer] 10. ShrinkToFit

该函数的核心目的就是缩小xy搜索框:因为如果对于某一个xy,该帧点云已经全部位于待匹配submap的外部,则该xy肯定不是正确解。该函数就是为了去除这些无效解的。这也可以理解,为啥全局搜索时,给定的初始xy搜索范围很大:1e6特地说明一点:cartographer中的栅格图的坐标是:原点在右上角,x 朝左,y朝下。而且对于某个cell,其在栅格中的坐标是行优先即:(row, col)第一个元素表示该cell在第几行。这与矩阵中某个元素的位置表示方法类似。主要参考该文章:这里...

2021-11-26 19:34:12 431

原创 [cartographer疑问系列] 8. lidar数据类型解析 + 多lidar数据时间对齐操作+运动畸变去除

一、lidar数据类型解析1. bag包发布的lidar数据数据的类型是:ros中激光雷达的消息类型 sensor_msgs/LaserScan Messageheader.timestamp : 该帧激光的time; 是获取第一束激光的时刻。但是cartographer中,设置为获取最后一束激光的时刻。然后转为所需的数据结构:{ time; // 该帧激光数据的时间; PointCloudWithIntensities;//点云数据}// 以下是类型..

2021-11-25 18:11:43 1794 1

原创 [cartographer疑问系列] 9. 如何利用3D 数据生层2D栅格地图

记轨迹系 为 L 系, 当前帧系 为 c 系, 重力系为 W 系我们想要做的是: 1. 估计的 3D pose Tlc 的投影,直接取 x y ----- 在 L系下进行投影 2. 当前帧的点云投影,直接取 x y --- 必须满足:当前帧系 与L系的 Z 轴重合如果机器人肯定是在平面上运动,那么很简单,直接取 x y 即可。如果机器人是一个3D空间的运动呢,如何达到上述要求呢?难点是第2点,地图系是固定的,但是当前帧系是变化的啊,如何保证两者的 Z 轴重合呢?...

2021-11-25 18:09:55 858

原创 [cartographer疑问系列] 3. 地图如何增长

通常,初始化一个Grid Map时,地图不会很大,而是随着移动而实时的扩大地图。cartographer中,地图增长函数是 gird_2d.cc文件中 GrowLimits。我们还是从地图增长的源头(即插入rangedata to 地图)开始:在文件 probability_grid_range_data_inserter_2d.cc 中,CastRays 函数内容如下:void CastRays(const sensor::RangeData& range_data,

2021-11-22 18:34:39 775

原创 [cartographer疑问系列] 1. 优化之后的recover

优化后的recover有两个目的:1. rviz显示2. for 下一次优化具体的recover操作在pose_graph_2d.cc 的 RunOptimization 函数://正式进行优化的函数.void PoseGraph2D::RunOptimization(){ if (optimization_problem_->submap_data().empty()) { return; } // No other thread is access.

2021-11-22 18:08:48 666

原创 [cartographer] 9. proto配置文件读取

目录1. proto文件2. .lua配置文件3. 代码1)读取lua文件2)赋值给proto options 获取proto参数值有两种方式:1)lua文件 2)通过service,例如如下代码中 InitialTrajectoryPose 的赋值3) 如何使用 proto options纯定位模式入口我们需要掌握的是什么?要知道在哪里改变参数,从而更深入的理解算法。系统的配置文件框架主要有三部分构成:1. proto文件 - 根据自己的需要,自定...

2021-11-20 16:04:24 1721 1

原创 [Cartographer] 8. 后端 BNB fast-CSM

1. 如何选择 BFS bnb or DFS bnb ? 由 什么时候可以确定 下界 来决定。 肯定是优先选择 BFS , 因为这样可以减少分支情况。 1)如果每个分支都可以作为可行解,那么每个分支都可以计算下界并更新全局下界。则采用广度优先。 例如:MF 曼哈顿求解时,在 Bpai 空间中 求解旋转矩阵。2)如果必须在叶子分支才可以计算下界,则必须采用深度优先。例如:cartographer中 ,多分辨率地图。中间的分支可以计算得到上界,因为每个分辨率地图中大栅格的值都是m...

2021-11-18 20:13:31 666

原创 [cartographer] 7. 传感器数据从ROS流到slam

我们知道了,GlobalTrajectoryBuilder 是 slam系统的顶层设计,该类中包含了两个成员变量:localTrajectoryBuilder 负责前端localslam ; PoseGraph 负责后端 (是从MapBuilder类中的posegraph传递过来的)。那么,传感器数据是如何流到GlobalTrajectoryBuilder从而被处理的呢?一、基础类 OrderedMultiQueue下面介绍 sensor::TrajectoryCollator 类absl::f

2021-11-17 10:46:34 477

原创 [ESKF] Quaternion kinematics for the error-state Kalman filter 阅读笔记

1. 无论是ESKF, 还是优化VIO 中,都需要得到 误差状态递推方程。因为都需要进行协方差传播更新。2. 深蓝VIO课程中给了两种计算误差递推方程的方法: 1) 一阶泰勒展开 2) 误差递推方程的微分形式一阶泰勒展开:已知离散形式的 真实方程和标称方程,得到误差方程。误差递推方程的微分形式:先根据真实方程和标称方程的微分形式得到连续时间的误差递推方程的微分形式。如何根据误差递推微分方程得到误差递推方程? 该书的附录B给出了闭式解---- 即 非近似解。...

2021-11-02 10:20:15 247

原创 [ESKF]系统总结-2021.11.01

目录一. ESKF的流程二. ESKF的好处三. 结合VINS 和 文献[1],讨论两种获得误差状态递推方程的方法(0)基础数学知识 (一)原理分析 1. 微分形式获得误差递推方程 2. 一阶泰勒展开获得误差递推方程 (二)获得误差状态递推方程的小技巧 (三)误差状态方程、标称状态方程离散化方法需要保持一致吗?四. 一些实际应用中的技巧五. 一些实践小例子TODO一. ESKF的流程 对应正常状态的EKF流程,ESKF流程...

2021-11-02 10:15:58 910 1

原创 软件设计模式总结

思维OO思维:谁拥有数据,谁拥有职责;告诉而不是询问;面向对象即每一个对象不仅拥有数据还要有行为,负责任; 数据都是private, 通过函数来获取数据、设置数据;方便改动 电脑主板,代码中留有插口,可扩展。 将变化分离,动态绑定,单一职责;防止类爆炸,提高灵活性,自由组合;原则模式模式一观察者模式适用场景:一对多;(例如: 控制多个屏幕显示气象信息)内容:控制者类中,存在一个list<oberver>容器,当消息改变时,直接遍历整个list进行广播即可。..

2021-10-18 15:52:22 377 2

原创 关于default 和 delete

1. big three 构造,析构,拷贝构造,拷贝赋值。 如果没有定义这四个函数,编译器会自动生成默认函数。 一旦自己定义了,则编译器不会产生默认版本。不能仅声明,否则编译报错。 如果自己还想要默认版本怎么办? A() = default; 仅限构造函数,因为其他函数只能有一个。2. delete 可以作用于任何函数。 只不过,作用于 big three 之外的函数没啥意义。你自己写的函数,又delete掉,自相矛盾。3. default 仅能作用于 bi...

2021-09-24 16:17:25 296

原创 动态绑定+虚析构函数

一、动态绑定(多态)(一)动态绑定(多态)的实现条件 1. 通过指针调用函数 2. 虚函数 3. 必须是向上转型(即 用基类指针指向子类对象)(二)动态绑定的实现过程1. 首先说明类对象的内存空间如果这个类有虚函数,则内存空间会包含一个虚指针。虚指针指向一块内存空间,保存了虚函数的地址。2. 向上转型时 A* a=new B(),具体发生了什么?1)内存方面,首先明确一点,只存在一个内存空间,即 new B()时产生的。a 也指向这块空间。所以,此...

2021-09-24 14:48:53 466

原创 CPU个数

1. 逻辑CPU个数查看命令如下:cat /proc/cpuinfo |grep "processor"|wc -l一个cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core出来,所以:逻辑CPU数量 = 物理cpu数量 * cpu cores 这个规格值 * 2(如果支持并开启ht)注意:Linux下top查看的CPU也是逻辑CPU个数2. 物理CPU个数物理CPU:实际Server中插槽上的CPU个数物理cpu数量,可以数不重复的

2021-08-24 14:24:31 426

原创 Linux htop 详解

参考 :https://zhuanlan.zhihu.com/p/296803907

2021-08-24 14:01:18 1319

原创 ROS之消息发布和接收

ros::Subscriber subscriber_ = nh_.subscribe(topic_name, buff_size, &CloudSubscriber::msg_callback, this);参数1: 话题名字参数2:接收消息队列长度,即可以暂时存储多少个消息。因为如果pub消息很快,回调处理的时间比较长,导致sub的消息不能被及时处理,就会存在队列里。如果存的消息超过队列的长度,那么最早的消息就被扔掉。所以,设定一个很大的值就可以了。参数3:回调函数。注意:一定要取.

2021-08-20 17:36:43 2217

原创 cmake 之 add_dependencies

add_dependencies(back_end_node ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)# 这又是个什么玩意. 这句话不加 也没事吧1. add_dependencies1)用到的状况就是两个targets(可执行程序 or 库 )有依赖关系(经过target_link_libraries解决)而且依赖库也是经过编译源码产生的。这时候一句add_dependencies能够在直接编译上层ta...

2021-08-13 18:37:49 2405

原创 Cmake 之 调用第三方库

1. 需要知道库二进制文件路径 以及 库头文件路径2. findpackage 归根结底就是要找到上面的 库文件/头文件路径。而 .cmake文件正好保存了 库文件/头文件路径信息。 所以,findpackage 最终就是要寻找 .cmake文件3. config模式 module 模式4. include_directoy 中还需要包含 第三方库的头文件路径吗? target_link_libraries 中还需要指明 第三方库文件吗? 必须要 包含啊。 因为,find...

2021-08-13 18:28:34 1552

原创 ROS 之自定义 service

service 和 topic 都是ROS中数据交流的方法,区别在于:1. topic 发送之后,并不要求有人能接收,或者说,并不确定谁来接收;2. 接收topic之后,处理的结果并不会返回给 发送者。但是对于 service 来说,client 是数据的发送者/客户/请求者, server 是接收端/服务者,提供某些操作,两者是一对一的,而且,server处理结果会返回给 client。自定义 service 主要分为两个步骤:1. 定义request 和 response 数

2021-08-13 18:11:37 583

原创 Cmake之静态库,动态库

一、静态库与动态库的区别 参考:https://www.cnblogs.com/codingmengmeng/p/6046481.html静态库后缀 .a .lib。 静态库的调用/链接,是在可执行程序编译时候产生的。假设有一个静态库 my.lib,现在需要生成一个可执行程序 hello 底层调用了my.lib。则hello 这个可执行程序中,会包含一份 my.lib。如果有1000个可执行程序都包含静态库,则静态库需要产生1000份。而且,有一个致命的坏处,当静态库改变时,1000个可执...

2021-08-13 10:05:57 1134

原创 组合导航(GNSS+惯性导航)

一、GNSS 至少需要四颗星。怎么判断GNSS数据是否准确?数据中是否携带星数?二、惯性导航 关于磁力计的使用: 1)类似重力,磁力也是一个矢量。地球任意位置的磁力在东北天地理系下的表示为(0,y,z)即永远指向北极。但是区别于重力,磁力的大小不是常量,因此,在后面的使用中需要借助重力得到初始姿态,然后计算磁力的大小。 2)利用磁力计可以计算pitch roll yaw. 原理和重力计算姿态一样。因此,想使用磁力计计算yaw, 必须将磁力计...

2021-08-12 11:39:33 11251 2

原创 float double 的范围以及 有效数位

1. float double 的存储方式 float 4字节,double 8字节 分为指数部分和尾数部分: https://blog.csdn.net/C2681595858/article/details/84865920 浮点数的进制转换:https://blog.csdn.net/C2681595858/article/details/538442652. 可表示范围 因为指数部分的存在,范围非常大;但是受困于 有效数位,所以这个大的范围几乎没有意义。...

2021-08-10 15:20:48 1281

原创 sim3 求解

参考吴博的ORB讲解,以及 这个网页:https://blog.csdn.net/weixin_39373577/article/details/86030981需要注意的一点是:orb代码中 虽然只有三个点,但是还是采用 特征向量的办法, 像吴博 讲解中说的。 而且,orb 代码中计算尺度的时候,使用的是非对称性的结果。...

2021-08-06 09:15:43 590

原创 对‘vtable for g2o::EdgeLinear’未定义的引用

vtable 一出现就是虚函数的问题,这里是因为 g2o 中将 read write 函数定义为纯虚函数 即 加上了 =0 ; 而自己定义的类行 edgelinear 中没有对 read write 函数进行定义。 因此报错。

2021-07-30 11:19:55 196

原创 缺省参数放在哪里?

1. 定义 or 声明 都可以2. 不能既在定义中指定默认参数,又在 声明中指定默认参数。 如果两次指定值 相同还好,如果不同则报错。3. 建议在声明中 指定默认参数,可以被用户看到。参考:https://blog.csdn.net/sailor_8318/article/details/3348383?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai.

2021-07-29 14:44:43 135

原创 C++ 前置声明

1. 解决互相依赖的问题2. 只能声明为 指针或者引用类型3. 做了前置声明就不用include 头文件了,但是 cpp文件中还是需要 include 头文件参考:https://blog.csdn.net/qq_33375598/article/details/89329723

2021-07-28 18:15:56 104

原创 static && extern

static: https://www.runoob.com/w3cnote/cpp-static-usage.html 1. 可以作用于 函数 , 变量2. 其声明周期是整个程序结束,但是static 并不会改变 函数 or 变量 的作用域。(即, 在a 文件中定义的static 对象,并不能够在 b 文件中引用;如果想使用,那就是extern 关键字的作用了)3. static 变量一般会在声名处初始化,如果没有显示初始化,会默认初始化为0 初始化操作仅会执行一次ext...

2021-07-27 13:38:00 104

原创 智能指针和移动语义

这是两个不同的概念,不能混淆,没有联系!!!1. 智能指针的实现主要是:计数器 + 写时拷贝参考:https://blog.csdn.net/weixin_43297891/article/details/1147789052. 移动语义: 是用来解决 不必要的拷贝 问题如果使用智能指针,就没必要使用移动语义构建 move 构造函数,move 赋值函数了。std::move 的作用就是 左值转为右值;emplace_back :// 总结:// 1. emplace.

2021-07-20 15:48:53 217

原创 用临时对象进行初始化时,不会调用拷贝构造函数

因为编译器进行了优化,参考:https://blog.csdn.net/flowerjiashug/article/details/111629531

2021-07-20 10:54:14 480

转载 【转载】C++11 move带来的高效

前言 继续阅读之前,你最好了解了左值,右值,左值引用,右值引用等概念 引入 我由浅入深的引入move,先来看一个例子: 自己实现一个string类CMyString(简单实现了几个需要的函数),相信很多c++程序员面试的时候都会遇到,代码如下 // #include "stdafx.h"#include <iostream>using namespace std; class ...

2021-07-19 15:02:45 195

转载 【转载】C++11 forward完美转发

前言 继续阅读之前,你最好了解了左值,右值,左值引用,右值引用等概念。 最好阅读了C++11 move带来的高效 引入 这里我借上一篇C++11 move带来的高效中的CMyString类用一下,代码如下 class CMyString{public: CMyString(char* pStr) : m_pStr(NULL) , m_nLen(0) { if (NULL != pStr) { ...

2021-07-19 14:41:53 168

原创 侯捷STL(一)

1. 可以在 前面列出的网站上查到 每个容器相应操作的复杂度2. set map的底层是 红黑树实现的。红黑树是二叉树的一种。即高度平衡二叉树。左右子树的高度基本一致。3. vector 2倍扩展: 空间浪费; list,set , map 每次扩展 1 个 ; deque 扩展一个 buffer 8个4. forward-list 单向链表:只能push_front5. 如果容器有自己的sort, 必须使用自己的; 如果没有,就使用全局的sort。因为自己的肯定是经过特殊处理,会更快。.

2021-07-15 20:22:51 293

空空如也

空空如也

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

TA关注的人

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