近期代码经验

1.将雷达点云保存为pcd文件

#include 
#include 

using namespace std;

int main(int argc, char** argv)
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    //加载点云
	pcl::io::loadPCDFile(argv[1],*cloud);
    //保存点云
	pcl::io::savePCDFile("rst.pcd",*cloud);
	
	system("pause");
	return 0;
}

主要为下面这句:

pcl::io::savePCDFile("rst.pcd",*cloud);

可视化pcd包

pcl_viewer rst.pcd 

2.三维雷达转pcl格式,来自dear陈

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
// ros消息接受点云并压缩保存文件
void pointCloudCallback(const sensor_msgs::PointCloud2ConstPtr &msg)
{
    //声明PCL点云
    pcl::PointCloud::Ptr pointCloud(new pcl::PointCloud);
    //转换
    pcl::fromROSMsg(*msg, *pointCloud);
    //创造一个显示窗口
    static pcl::visualization::CloudViewer viewer("123"); 
    //窗口显示点云
    viewer.showCloud(pointCloud);                         
    viewer.wasStopped();
    
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "rs2pcl");
    ros::NodeHandle nh;
    ros::Subscriber rs_sub = nh.subscribe("/rslidar_points", 1, pointCloudCallback);
    ros::spin();
    return 0;
}

注:动态更新主要是下面这行static!!!若没有,则不断生成新窗口.

    //创造一个显示窗口
    static pcl::visualization::CloudViewer viewer("123"); 

注:其他点云格式转换

sensor_msgs::LaserScan                      // ROS激光雷达信息
sensor_msgs::PointCloud                  // ROS点云信息
sensor_msgs::PointCloud2                  // ROS点云信息
pcl::PointCloud         // PCL点云信息


//sensor_msgs::LaserScan 与sensor_msgs::PointCloud之间的转换
 sensor_msgs::LaserScan::ConstPtr& scan_msg;
 laser_geometry::LaserProjection projector_;
 sensor_msgs::PointCloud laser_point_cloud;
 // LaserScan转换到pointcloud2 类型
 projector_.projectLaser(*scan_msg,laser_point_cloud);


 //sensor_msgs::PointCloud2与 pcl::PointCloud之间的转换
 sensor_msgs::PointCloud2 laser_point_cloud;
 pcl::PointCloud pclCloud;
 pcl::fromROSMsg(laser_point_cloud,pclCloud); // ROS转pcl
 pcl::toROSMsg(pclCloud,laser_point_cloud);   // pcl转ROS

3.写过欧式聚类,区域生长,直通滤波.

4.静态全局变量也就是static修饰的,在整个.c文件中都可以用

   全局变量,也就是没用static修饰的但是写在函数体外,就会存在于整个工程个,其他.c文件通过extern就能调用.

//示例1
#include 
using namespace std;
void fn();  //声明函数
static int n;  //声明静态全局变量
int main()
{
    n = 20;  //为n赋初值
    cout<

5.从pcd读取三维点云坐标 /home/goocc/test_pcl/1 reading pcd

6.基于opencv,检测按键,依次保存.pcd和.png文件(很坑,需要基于图片).

7.将旋转矩阵,和平移向量,内参,畸变系数保存为.txt

8.pcd转bin(二进制)/home/goocc/test_pcl/pcd2bin

9.检测鼠标,返回图像二维坐标及灰度值

10.LSD提取直线

11.解决跑orb不保存轨迹问题.

查看数据集,确实运行到了最后一帧图像,最终找到问题出在了结束进程的SLAM.Shutdown();函数,具体是在在System.cc中的这两行代码上

if (mpViewer)
        pangolin::BindToContext("ORB-SLAM2: Map Viewer");

将这两行代码注释掉之后顺利运行,保存了关键帧路径的txt文件。

你可能感兴趣的:(c++,开发语言)