自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(156)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++默认构造函数/拷贝构造函数/赋值构造函数

本文主要讲解C++默认构造函数,拷贝构造函数和赋值构造函数在哪些场景下会被调用到场景一调用代码输出注:虽然对于c的赋值使用的是等号,但是调用的仍然是拷贝构造函数输出

2024-03-12 14:44:17 385

原创 g2o -- circle_fit代码解析

***/class VertexCircle : public g2o::BaseVertex { // 顶点包含3个参数public:void setToOriginImpl() override { // 设置顶点的初始值void oplusImpl(const double* update) override { // 增量更新函数/***/

2024-03-05 11:15:57 361

原创 g2o -- curve_fit代码解析

***/class VertexParams : public g2o::BaseVertex { // 它包含三个参数public:void setToOriginImpl() override {} // 设定参数的原始值void oplusImpl(const double* update) override { // 增量更新函数,调整当前参数的值// 构造参数增量/***/

2024-03-04 20:02:23 434

原创 g2o--icp代码解析

概要个人理解Icp是一种location算法。我们先将全局的事物特征化,提取出特征点。在求解过程中,将观察的的图像,同样进行特征化。将全局点与当前特征点进行匹配,就可以求得观察者当前的位姿。Icp算法通常分为粗匹配和精细匹配两部分。粗匹配是将观察特征点移动到对应全局特征点的附近,而精细匹配这是将一个一个对应的特征点,使用最小二乘优化进行调整。在精细匹配的过程中,特征点对的选取也很重要,icp是一套迭代的算法,每次变换后都需要重新选取特征点对。

2024-01-29 17:54:17 441

原创 g2o--ba代码解析

g2o是常用的图优化理论c++库,其自带了很多example讲解如何使用该库文件,本文分析其中ba的示例代码。所谓的图优化,就是把一个常规的优化问题,以图(Graph)的形式来表述。在图中,以顶点表示优化变量,以边表示观测方程。于是总体优化问题变为n条边加和的形式边是约束在具体编写g2o代码时,我们也需要明确哪些是顶点(优化项),哪些是边(约束项)。

2024-01-25 17:45:03 406

原创 CMake编译选项CMAKE_CXX_FLAGS详解

概要本文涉及cmake在模式下的编译选项控制,其具体的实践是基于submodule的代码组织形式。基础知识先看一下和相关的参数默认值参数默认值无-g如果对应参数未设置,则使用默认值。我们在使用cmake命令时会指定使用哪种编译模式,它是通过来定义的,如我们可以这么干:Debug编译:Release编译:对于debug模式,实际使用的编译选项是对于release模式,实际使用的编译选项是代码假设我们有个工程,代码组织如下。

2024-01-11 17:38:12 1534

原创 双buffer切换与代码实现

在很多场景需要并发的去读写数据,如下图所示:考虑到数据写入的顺序性,通常只会有一个线程写入,读数据是可以多线程的。由于对于Data的一次写入不是原子操作,一个常用通常的方式就是在写的时候加写锁,读的时候加读锁。这在同一个线程每次读数据没有依赖时是可行的,否者还是可能出现问题。如在一次数据处理中,先通过用户“姓名”找到Data中对应的id,再通过id去Data中查找用户其它信息。在这两步之前,写线程可能已经把该用户从Data中删除了,这时就会出现异常。

2024-01-10 16:41:42 472

原创 std::cout输出设置项

在c++编程中,我们常常需要使用std::cout来打印日志,但是std::cout打印日志的格式可能和预期的不一致。笔者最近遇到有两处需要修改默认项的,都是针对double类型,记录如下。

2024-01-09 16:45:26 382

原创 在macos上查看当前进程的栈信息

在调试程序时,如cpu莫名的高或低,一个常用的方式就是打印当前进行的调用栈,然后确认各线程的执行函数是否有异常。在linux系统中可以使用pstack命令,直接打印各线程的栈信息,可惜在macos上没有该命令。一种解决方式就是将代码迁移到linux平台上进行debug(事实上笔者也是这么做的,因为linux平台有很多熟悉的工具),但代码迁移存在成本(系统函数版本不一致),macos上的系统文件版本和linux平台上大概率是不同的。

2024-01-08 19:40:03 640

原创 DWA算法实现

动态窗口算法(Dynamic Window Approaches, DWA) 属于局部路径规划算法,能有效避开障碍物。本文主要介绍dwa算法的一种c++实现,源代码库见(而这段时间是否会和障碍物接触会由开销函数来保证。算法还是希望能高速运行。

2023-11-01 20:31:58 808

原创 pragma once与ifndef的区别

代码编译过程中,为了防止同一份代码被重复引用,通常有两种实现方式方式一方式二#endif //!TEST_H通常情况下,使用上述两种方式中的任意一种都是可以的。最近工作中,代码按照其功能性被划分出不同的模块,这时二者的区别就体现出来了。

2023-10-19 19:06:04 176

原创 记一次crash问题分析

本文介绍近期工作中遇到的一次crash,问题分析花费了不少时间,最终得以解决。

2023-10-17 11:52:57 119

原创 valgrind排查内存问题

valgrind能在保证程序不会core的情况,将存在double free的问题代码快速定位。

2023-09-18 15:11:29 253

原创 通过lambda表达式实现上下层类型的解耦

代码架构中一种常见的组织结构 class A --> class B,A作为上层类型,可以调用类型B的方法。然而B类型也有可能会回调A类型的方法(同时修改A成员变量的值)。实现时可能有多种方案(假设都是单例模式)B类型中也包含A类型指针作为成员变量,这种方式实现最为简单,但要求A类型对于B类型是完全可见的(紧耦合);使用lambda表达式,在A类型调用B类型方法时,指定回调函数,这样B类型就不必去感知A类型的存在(松耦合);

2023-08-17 15:01:47 86

原创 异构线程池的c++实现方案

概要通常线程池是同质的,每个线程都可以执行任意的task(每个线程中的task顺序执行),如下图所示:但本文所介绍的线程和task之间有绑定关系,如A task只能跑在A thread上(因此称为异构线程池,每个线程的功能是有所区别的),如下图所示:接口设计TThreadPool接口设计TThreadPool类的主要功能是管理创建的线程(TThread,它是线程的具体实现),它提供了增加/删除线程的接口,同时给每个线程打上了标签(name)。TThread接口设计。

2023-07-26 19:30:55 131

原创 awk中的strftime浅析(含小数)

在文件数据处理中,awk是常用的unix工具命令。如果需要将unix时间戳(1687057855)转换成标准时间格式(06/18/23 13:07:28),可以使用其自带的strftime函数。

2023-07-10 09:43:13 292

原创 向量的点积与叉积

三维空间中有两个向量,它们的夹角为θ假设单位向量n垂直于两个向量形成的平面(满足右手螺旋法则)

2023-04-24 10:14:43 149 1

原创 欧拉角,四元数,旋转矩阵以及它们的转换关系

欧拉角,四元数,旋转矩阵以及它们的转换关系

2023-04-19 09:37:40 365

原创 python numpy库简介

numpy库是python语言处理矩阵运算常用的工具,本文对其常用命令进行简单的介绍。zeros,ones,empty[初始化数组]ravel[多维数组转换为一维数组]argwhere[满足条件的索引]reshape[改变列表的结构]delete[删除任意行|列]shape[数组的维度]array[创建数组]mean[求取平均值]diff[计算差值]

2023-03-24 17:53:47 141

原创 AStar路径规划算法

概要AStar是一种路径规划算法,其思想包含Dijkstra算法和启发式算法。该算法也是通过起点开始,逐步记录能够搜索到的节点,并记录它们离起点的最短距离;同时还会估算搜索到的点离终点的距离。公式G -- 当前节点离起点的距离H – 估算当前节点离终点的距离F = G + H两个队列开启列表 – 当前寻址到的节点,包含GHF三个值,但其值可能会在随后的迭代搜寻中被更新。在每次寻址的过程中,会有新的节点存入开启列表(除非当前节点寻址到的所有节点都已经在开启列表中),也会有一个节点从开启列表移

2023-01-11 17:07:10 921

原创 朴素贝叶斯

前文介绍了贝叶斯公式基础以及在统计领域的基本应用,本文将介绍它的一种新的转换形式,以及在机器分类领域的应用。

2022-12-23 12:09:43 442

原创 python包版本不一致问题排查

因为能确认该代码之前是能运行成功的,因此排除是代码的问题。同时怀疑是依赖的包版本发生了变化(在公共服务器上,有root权限的人都能随意改动)。pip install -v [package]==[version] // 安装指定版本的包。pip show [package] // 展示当前安装package的信息,包含版本号。pip install [package]== // 查看包有哪些适用版本。好嘛,使用的版本是4.21,明显高于代码中使用到的版本号。因此首先卸载该包,同时安装符合预期的版本。

2022-12-22 15:45:43 918

原创 贝叶斯基础

举个例子,如果A和B发生的概率都是50%,但两者是强相关的,A出现时B必然出现,那么P(A and B)=50%;从机器学习的角度,从全局无法知道事件(A)发生的概率,但是如果能确认一些事情发生,如事件(B),那么就可以更新事件(A)发生的概率,从而逼近真实值。解答:首先P(A)=20%, P(B)=50%, P(C)=30%,另一个条件,假设缺陷产品的事件为D,则P(D|A)=2%, P(D|B)=1%, P(D|C)=3%, 问题是P(B|D)边际概率是一个事件的概率,与另一个变量的结果无关。

2022-12-21 15:08:34 563

原创 C++ json-cpp库的基本使用方法

Json::Value value = array[i] // 每个元素也是一个Json::Value类型。double json_double = value.asDouble() // double类型。float json_float = value.asFloat() // float类型。bool json_bool = value.asBool() // bool类型。// value是一个有赋值的json类型.int json_int = value.asInt() // int类型。

2022-12-02 14:52:09 1582 1

原创 数据挖掘对道路地理位置的修正

另一方面,在某些特定的地理条件下(高山、峡谷等),gps定位系统给出的位置信息(统计平均)与实际也可能产生偏差。本文提出了一种纠偏的思路,它基于离线数据挖掘,将全局轨迹匹配的道路与线上服务实时匹配的道路进行比较,挖掘出哪些道路存在位置偏差(或gps偏差),将其补齐后在线上服务中应用,以提升线上匹配的准确性。MM按照匹配的实时性可以分为全局匹配和实时匹配,全局匹配的效果无疑是最优的,但实时匹配的互动性更加。在车载导航等场景需要用到实时匹配。本文的思路就是通过离线的全局匹配,来辅助线上实时匹配的准确性。

2022-11-17 10:35:37 211

原创 《Hidden Markov Map Matching Through Noise and Sparseness》读书笔记

个人觉得如果eta时间能比较准确的话,确实是一个好办法)In our map matching algorithm, the states of the HMM are the individual road segments, and the state measurements are the noisy vehicle location measurements. (隐马尔可夫模型的观察变量和隐形状态的定义)通常会认为频率越高,对算法是越友好的。(基于绕路惩罚的转移概率)低频下匹配准确度的变化趋势。

2022-11-16 14:10:56 543

原创 《Map-Matching for Low-Sampling-Rate GPS Trajectories》 读书笔记

这是我见过对场景定义最清楚的一篇论文了Definition 1 (GPS Log): A GPS log is a collection of GPS points 𝐿 = {𝑝1, 𝑝2,... , 𝑝𝑛} . Each GPS point 𝑝𝑖 ∈ 𝐿 contains latitude 𝑝𝑖 . 𝑙𝑎𝑡, longitude 𝑝𝑖 . 𝑙𝑛𝑔 and timestamp 𝑝𝑖 . 𝑡, as illustrated in the left part of Figure 3. (定义点的集合)

2022-11-10 20:49:49 450

原创 libcurl库简介

/一旦实例化后需要通过下一个函数清理,否则会产生内存泄漏设置headers// headers再赋值后也需要清理// 设置headers// 释放资源设置请求类型curl_easy_setopt(curl, CURLOPT_POST, 1) // post请求curl_easy_setopt(curl, CURLOPT_GET, 1) // get请求url设置超时设置// 读写超时// 连接超时写body接收返回的headers// 设置headers的载体//设置回调函数。

2022-11-10 14:54:54 542

原创 隐马尔可夫模型在map-matching中的应用

状态值的取值空间:图中所示有五条线段,因此状态空间为{S1,S2,S3,S4,S5}。考虑到map-matching是一个处理连续轨迹点的问题,因此我们可以以当前点的位置坐标出发,一定范围内的link都属于状态空间。有时连续两个gps点的位置差异过大,超过一定范围的点称之为跳点,对于跳点需要过滤掉。{o1,o2,o3,o4,o5,o6,o7,o8}(经纬度,方向,速度等)。转移概率矩阵:这里最主要考虑到的是轨迹的连续性。

2022-10-11 19:24:06 1354

原创 linux:argument list too long的解决方案

我们使用“find”命令和“xargs”命令组合,先找出需要删除的文件,每找到一个匹配的文件,通过pipeline的方式传递给后面的“rm”命令进行操作。(猜测)shell命令在做通配符匹配时,会计算匹配到的文件名个数。一旦超过设定值,则会放弃该命令的执行,同时报错。

2022-10-11 10:28:49 771

原创 一种路网划分的策略

一条link包含起点(start_node)和终点(end_node),非极端情况下,这条link所属的分片可以等价于起点所属分片与终点所属分片的并集(最多属于两个分片),这样就将link所属分片的问题转化为点所属分片的问题。遍历每一条link,将start_node和end_node离散化成represent_node1和represent_node2,并利用上述的映射关系,找出对应的分片数,其值就是link对应的分片值。在上图中,link1/2/4均满足之前的假设,只有link3是横跨的3个分片。

2022-09-30 16:07:22 429

原创 二级模式存储大数据

设计表初期,也需要考虑数据增长的问题,当数据量增长过快时,可以将部分bucket中的映射关系改到新增的表中,然后再对原有的数据进行迁移。本人多年前也遇到过数据量巨大的项目,使用单mysql表读写性能非常的差,后来经过调研,使用了hbase存储加上spark计算的方式,存储效率和计算效率都得以巨大的提升,效果可以说是非常的好的。二是运维成本也较大,hbase底层使用hdfs进行数据存储,spark也是基于内存的并行计算框架,对资源的消耗都是巨大的。那么对于无限增长的数据,有什么简单又可靠的存储方式么?...

2022-08-31 10:05:33 133

原创 双版本数据加载的系统设计

很多服务依赖数据版本迭代。如搜索系统,每天会产生一个全量索引版本。路网系统,每天会加载新版本的路网数据。一个简单的做法是每次更新数据版本时,都停止服务,重新加载最新的数据(通常在流量最低的时间点)。但这种做法显然不够优雅。更常用的方案是加载双版本数据,动态切换,而不需要停止服务。本文介绍这种方案的一种实现方式。...

2022-08-17 15:21:48 208

原创 兜底策略在微服务系统中的应用

微服务的广泛应用,使得模块间功能划分更加清晰,代码可维护性高。但并不是说微服务的运维成本更低了。假设原先是一个单体服务,我们将它进行微服务化的改造,拆成了多个服务,这时一旦下游服务出现问题,整体服务也会受到影响。兜底策略是在整体(微服务)系统出现问题时,仍然尽可能去保障服务的可用性(通常以一定数据精度损失作为代价)。...

2022-08-16 16:22:18 1075

原创 Golang HTTP Fileserver

fileserver是静态文件服务,其主要功能是根据提供文件查询与文件传输的功能。由golang标准库提供。

2022-07-19 16:36:08 1624

原创 微服务上线规范

上线规范的作用时尽可能避免(减少)因线上变动造成的事故。主要分为上线前、上线中和上线后的注意事项。

2022-07-15 16:30:58 497

原创 Cmake常用命令(五)

本文主要介绍CMAKE_BUILD_TYPE及其相关参数或者不同的type对应的编译选项 Type编译选项DebugCMAKE_CXX_FLAGS_DEBUGReleaseCMAKE_CXX_FLAGS_RELEASERelWithDebInfoCMAKE_CXX_FLAGS_RELWITHDEBINFOMinSizeRelCMAKE_CXX_FLAGS_MINSIZEREL注 2、除了CMAKE_CXX_FLAGS变量,还可以使用add_compile_optio

2022-07-14 17:42:38 1788

原创 Cmake常用命令(四)

将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用编译时的路径搜索必须精确指定文件夹,makefile不会递归搜索子文件夹After和before 关键字控制的是添加文件夹到列表的最后还是最前,makefile在搜索头文件时会按照该列表的顺序进行搜索,只要找到便停止搜索。指定目标依赖的头文件路径,功能和include_directories类似。不同的是i

2022-07-11 20:02:59 749

原创 Cmake常用命令(三)

本文介绍IF语句,它有两组语法格式语法condition类型基础条件表达式常量 逻辑值常量值true1、ON、YES、TRUE、Y、非0数字false0、OFF、NO、FALSE、N、IGNORE、NOTFOUNT、空字符串、-NOTFOUND结尾字符串如果常量取值不是以上内容,则按照/条件处理。表示一个变量,变量取值不是上述定义的false常量时其逻辑值为true,否则逻辑值为false。注:表示带引号的字符串。以下...

2022-07-08 10:01:18 1000

原创 Cmake常用命令(二)

本文主要介绍File关键字,它是文件系统相关的操作的入口命令格式解释示例READfile(READ [OFFSET ] [LIMIT ] [HEX])读取文件名为 的文件并将其内容存储到 变量中。可选的参数: 指定起始读取位置, 最多读取字节数,HEX 将数据转为十六进制(处理二进制数据十分有用)STRINGSfile(STRINGS ...

2022-07-06 09:58:47 524

sstable解析

leveldb的底层存储方式,对涉及到的代码也有精彩的讲解。

2013-04-20

空空如也

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

TA关注的人

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