C++
文章平均质量分 62
白色小靴
学生
展开
-
onnxruntime (C++/CUDA) 编译安装及部署
前几天使用了LibTorch对模型进行C++转换和测试,发现速度比原始Python的Pytorch模型提升了2倍。现在尝试以下另一种跨平台的模型转换方式——Onnx,可实现跨X86/ARM架构的迁移应用。本文主要介绍C++版本的onnxruntime使用,Python的操作较容易就不再提及了。一、克隆及编译git clone --recursive https://github.com/Microsoft/onnxruntimecd onnxruntime/git checkout v1.8.0原创 2022-03-15 15:50:09 · 23543 阅读 · 18 评论 -
FAISS C++版本安装教程
FAISS的Python版本安装起来是很快乐的,conda就可以轻松安装。但是C++版本需要花费一点功夫。网上关于C++的教程除了官方以外少之有少,官方教程又过于繁琐,特此整理自己的安装流程,希望帮助到大家。对官方教程感兴趣的,关注:https://github.com/facebookresearch/faiss/blob/main/INSTALL.md预编译按照官方github的要求,首先cmake预编译:cmake -DBUILD_TESTING=ON -DFAISS_ENABLE_GPU=原创 2022-03-11 11:54:04 · 6549 阅读 · 7 评论 -
PCL安装报错error: ‘shared_ptr’ does not name a type
将所有报错的位置的shared_ptr均更换为boost::shared_ptr原创 2021-06-30 00:01:28 · 988 阅读 · 1 评论 -
BLAM源码解析(五)—— 回环检测
上一节介绍了BLAM的帧间匹配和帧图匹配,代码简洁明了。本节介绍BLAM的回环检测模块。具体代码块如下: // Check for new loop closures. bool new_keyframe; if (HandleLoopClosures(msg_filtered, &new_keyframe)) { // We found one - regenerate the 3D map. PointCloud::Ptr regenerated_map(new原创 2021-06-28 11:30:37 · 627 阅读 · 3 评论 -
BLAM源码解析(四)—— 基于ICP的位姿更新
第三节我们介绍了定时器的定时回调,实现对激光数据的批量循环处理,在每一个激光数据的循环当中,除了一开始filter_的点云过滤,最重要的其实是下面的基于ICP的位姿更新,即 if (!odometry_.UpdateEstimate(*msg_filtered)) {接下来重点关注UpdateEstimate函数,此函数由第一节介绍的里程计模块实现。bool PointCloudOdometry::UpdateEstimate(const PointCloud& points)原创 2021-06-28 11:01:24 · 628 阅读 · 1 评论 -
BLAM源码解析(三)—— 定时器总揽大局
上一节介绍了激光数据的回调,最终被依次推入到容器之中,存储在pcl_pcld_queue。那么激光数据的使用是怎么实现的,就是这一节要介绍的内容。回想第一节我们介绍的定时器estimate_update_timer_,一秒进行20次的回调,进入回调函数BlamSlam::EstimateTimerCallback,接下来介绍此函数。BlamSlam::EstimateTimerCallback此函数位于src\blam_slam\src\BlamSlam.cc,内容如下:void ..原创 2021-06-28 10:04:37 · 327 阅读 · 0 评论 -
BLAM源码解析(二)—— 从激光回调入手
上一节(https://blog.csdn.net/weixin_44684139/article/details/118279360)我们介绍了系统各个模块的初始化,加载了许多的参数,创建了许多的发布者,构建了因子图、初始八叉树地图等。本节介绍激光数据回调以后的相关内容。激光雷达数据订阅者建立于src\blam_slam\src\BlamSlam.cc的 pcld_sub_ = nl.subscribe("pcld", 100, &BlamSlam::PointCloudCallb原创 2021-06-27 22:41:57 · 379 阅读 · 0 评论 -
BLAM源码解析(一)—— 模块初始化
对BLAM在线部分进行解析。blam_slam.cc文件直接进行初始化: if (!bs.Initialize(n, false /* online processing */)) {其中两个参数,n代表ros句柄,false代表不进行日志记录。让我们跳转到BlamSlam.cc,看一下初始化的作用:首先在句柄n的命名空间blam_slam中,附加命名空间BlamSlam:name_ = ros::names::append(n.getNamespace(), "Blam原创 2021-06-27 22:20:45 · 1252 阅读 · 1 评论 -
pcl::PointXYZRGB 报错 has no member named ‘__getMD5Sum’
报错内容:/opt/ros/melodic/include/ros/message_traits.h: In instantiation of ‘static const char* ros::message_traits::MD5Sum<M>::value(const M&) [with M = pcl::PointCloud<pcl::PointXYZRGB>]’:/opt/ros/melodic/include/ros/message_traits.h:255:10原创 2020-12-18 14:48:58 · 3023 阅读 · 1 评论 -
github上传及修改
github上传参考:https://segmentfault.com/a/1190000018595512github修改参考:https://blog.csdn.net/jojowei/article/details/89008657先克隆下来:git clone https://github.com/BIT-MJY/occupancy_grid_mapping.git再进入克隆下来的文件夹进行修改,比如删除一个文件夹,或更换一个文件然后在命令行进入文件夹:cd occupancy_g原创 2020-11-10 14:42:49 · 366 阅读 · 0 评论 -
C++生成对象的类成员与调用构造函数产生的矛盾
当我们创建一个类A,此类的成员可能会包含另一个类B。# include<B.h>class A{public: ... ... B b;}对于B,他有自己的一套构造函数:class B原创 2020-11-08 22:42:26 · 397 阅读 · 0 评论 -
C++多线程以及互斥锁的简单使用
一、多线程的使用方法#include <thread>#include<iostream>#include<vector>void printNum( std::vector<int>& vec ){ int key = 0; while (key++<2) { std::this_thread::sleep_for(std::chrono::milliseconds(1000));原创 2020-10-31 22:57:04 · 808 阅读 · 0 评论 -
lambda表达式简单介绍
lambda表达式的标准格式[捕获外部变量列表] (函数参数列表) mutable 或 exception 声明 -> 返回值类型 {函数体}各项含义:capture list:捕获外部变量列表 --- params list:形参列表mutable指示符:用来说用是否可以修改捕获的变量exception:异常设定return type:返回类型function body:函数体1. 捕获外部变量Lambda表达式可以使用其可见范围内的外部变量,但必须明确声明(明确声明哪些外部原创 2020-09-21 23:31:07 · 272 阅读 · 0 评论 -
对‘pthread_create’未定义的引用
由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数: gcc -o pthread -lpthread XXX.cpp如果在VScode中,可以直接设置tasks.json中的args参数: "args": ["-g", "${file}", "-std=c++11", "-lpthread", "-o", "${fileBasenameNoExtension}.out"]原创 2020-09-21 22:26:56 · 1172 阅读 · 2 评论 -
计算机图形学——Bresenham画线算法
以下摘录自《计算机图形学》对于特殊情况(非斜率为0~1区间情况)附上栅格地图的画线算法以更新free:std::vector<GridIndex> TraceLine(int x0, int y0, int x1, int y1) // 划线算法{ GridIndex tmpIndex; std::vector<GridIndex> gridIn...原创 2020-04-29 00:47:42 · 2824 阅读 · 1 评论 -
C++读取文件(以读取图像为例)
int main(int argc, char **argv) { vector<cv::Mat> colorImgs, depthImgs; // 彩色图和深度图 vector<Eigen::Isometry3d> poses; // 相机位姿 P63,即4*4的T ifstream fin("/home/mjy/slam...原创 2020-03-30 21:32:52 · 3447 阅读 · 0 评论 -
VS Code构建C++ cmake工程
VSC构建cmake工程1.文件准备1-1在准备用vs code打开的文件夹下:新建文件:CMakeLists.txt内容:cmake_minimum_required(VERSION 2.8)project(useEigen)set(CMAKE_BUILD_TYPE "Release")set(CMAKE_CXX_FLAGS "-O3")# 添加Eigen头文件incl...原创 2020-03-09 02:09:15 · 5131 阅读 · 0 评论 -
冒泡排序和选择排序
DataList::DataList(int len, double data[]):len(len){ d=new double[len]; for(int i=0; i<len; i++) d[i]=(data==NULL ? 0.0 : data[i]);}void DataList::sort(){ //数据表排序//********333********...原创 2020-03-02 11:18:45 · 130 阅读 · 0 评论 -
typedef void(*F)(int)理解
typedef void (*F) (int)定义了一个指向函数的指针F,其指向的函数的返回值为 void 类型,参数是后面的(int).然后我们就可以直接使用 F来定义这种指针变量,比如:F f; // 等价于void f(int);举例:#include <stdio.h>typedef void(*F)(int a);void pr(int a){ ...转载 2020-02-26 15:17:15 · 1515 阅读 · 0 评论 -
C++ string转int
string转int的方法string利用.c_str() 转c风格的字符串 const char *再利用atoi(const char *)转为int原创 2020-02-23 00:22:06 · 379 阅读 · 0 评论 -
C++数据去重操作
一般数据去重可以用容器vector原创 2020-02-22 19:46:41 · 1933 阅读 · 0 评论 -
C++ 继承与纯虚函数(调用子类接口)
首先明确C++中的多态机制纯虚函数是为了能在父类中提供一个各个子类通用的接口。在父类中创建一个纯虚函数:class Base{public: virtual void func() = 0; // 纯虚函数 // 只要有一个纯虚函数,这个类为抽象类 // 无法实例化对象、必须要重写父类中的纯虚函数,否则也属于抽象类};然后在子类中重写以上函数class Son :pub...原创 2020-02-22 18:17:34 · 3573 阅读 · 0 评论 -
C++排序算法模板
// 排序算法函数模板template<class T>void mySort(T arr[], int len) // 通常对数组进行排序别忘记传递数组长度{ for (int i = 0; i < len; i++) { int max = i; // 认定最大值的下标 for (int j = i+1; j<len ; j++) { ...原创 2020-02-17 09:18:20 · 266 阅读 · 0 评论 -
关于堆区内存重复释放问题
#include<iostream>using namespace std;// 赋值运算符重载class Person{public: Person(int age) { m_Age = new int (age); } ~Person() // 手动释放内存 { if (m_Age != NULL) { delete m_Age; ...原创 2020-02-11 22:40:29 · 2297 阅读 · 2 评论 -
C++指向类的指针
#include <iostream> using namespace std;class Box{ public: // 构造函数定义 Box(double l=2.0, double b=2.0, double h=2.0) { cout <<"Constructor called." <<...原创 2020-02-10 15:44:40 · 267 阅读 · 0 评论 -
如何实现C++中类编写的头文件和源文件的拆分
以实现点和圆位置关系的判断为例https://www.bilibili.com/video/av41559729?p=1051. 在头文件中创建.h文件,在源文件中创建.cpp文件2. 在.h文件中写入#pragma once#include<iostream>using namespace std;将类复制于.h文件中,删除所有函数的操作,只保留函数声明,并加上分号。...原创 2020-02-09 17:56:02 · 5933 阅读 · 0 评论 -
对于指针的理解
简而言之指针就是地址!就是内存中间开辟了一块区域存放数据的地址,这个地址就叫做指针指针的定义服从必须的格式:整型数据:int *p = &a;数组:int *p = arr;这样就使得p存放了数据的地址(可以理解为p=0x0000)当涉及到指针与函数的时候指针与函数#include<iostream>using namespace std;vo...原创 2020-02-07 12:01:34 · 245 阅读 · 0 评论 -
关于栈区、堆区的理解
栈区(stack)函数运行时分配,函数结束时释放。由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。如何理解栈区局部变量的地址存于栈区,编译器会做一次保留,第二次调用则被释放#include<ios...原创 2020-02-07 00:34:29 · 1593 阅读 · 1 评论 -
vs2017 C++设置默认代码段
https://jingyan.baidu.com/article/3f16e0032a66ae2590c10341.html注意的一点是不要选择xml语言,而选择visual c++原创 2019-12-12 11:13:53 · 1513 阅读 · 0 评论