项目基础,cmake, make, catkin_make、指针引用、git、json、C++代码

ros

catkin_make 常用参数:

catkin_make常用参数
 catkin_make -DCATKIN_WHITELIST_PACKAGES设置白名单
 catkin_make -DCATKIN_BLACKLIST_PACKAGES
 catkin_make install
 catkin_make -DCMAKE_BUILD_TYPE=Release
 catkin_make --pkg package_name 编译工作空间下特定的功能包
 catkin_make -j4 编译时,设置使用CPU 核数,防止系统卡顿
 catkin_make run_tests -j4 编译时自动测试
 catkin_init_workspace 创建并初始化工作区(workspace)
 catkin_make 编译工作区
 编译release版本
1. catkin_make -DCATKIN_WHITELIST_PACKAGES设置白名单
仅编译白名单指定包,以加快编译速度。

如果编译,ros没有执行,查看是否有黑名单

catkin_make -DCATKIN_WHITELIST_PACKAGES="lanelet2_io"
将白名单设置为空,表示编译全部。
   catkin_make -DCATKIN_WHITELIST_PACKAGES=""
   catkin_make -DCATKIN_BLACKLIST_PACKAGES 设置黑名单
 跳过黑名单指定包。
也可以把黑名单设置为空,表示没有需要跳过的包。
catkin_make -DCATKIN_BLACKLIST_PACKAGES=""

一、cuda

CMake编译找不到math_functions.hpp
/usr/local/include/eigen3/Eigen/Core:42:34: fatal error: math_functions.hpp: No such file or directory
     #include <math_functions.hpp>                             ^
compilation terminated.
# --error 0x1 --
CMake Error at kinectFusion_generated_voxelGrid.cu.o.Release.cmake:220 (message):
  Error generating

开始以为是eigen3的原因,其实不是。后来发现是因为CUDA 10.0, math_functions.hpp 在cuda/include/crt/math_functions.hpp,
而不是在原来的位置 cuda/include/math_functions.hpp 然后就报错了,只要重新建立软链接即可,执行命令

sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp

二、 freetype

https://download.savannah.gnu.org/releases/freetype/
解压:tar xjf freetype-2.4.10.tar.bz2 
进入freetype目录:cd freetype
./configure
make
sudo make install

三、& *

指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。
引用:引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
举例:
int a=10;
int* p=&a;
//指针,定义了一个整型变量a和指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
int& b=a;
//引用,一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
C++ 引用与指针的比较

引用是 C++ 中的概念,初学者容易把引用和指针混淆一起。

一下程序中,n 是m的一个引用(reference),m 是被引用物(referent)。

int m;
int &n = m;
n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作。

所以 n 既不是m的拷贝,也不是指向 m 的指针,其实n就是 m 它自己。

引用的规则:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
以下示例程序中,k 被初始化为i的引用。

语句 k = j 并不能将 k 修改成为j的引用,只是把k的值改变成为 6。

由于 k 是 i 的引用,所以i的值也变成了 6。

int i = 5; 
int j = 6; 
int &k = i; 
k = j; // k 和 i 的值都变成了 6;

引用的主要功能是传递函数的参数和返回值。

C++ 语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

"值传递"的示例程序。

由于 Func1 函数体内的 x 是外部变量 n 的一份拷贝,改变 x 的值不会影响 n, 所以 n 的值仍然是 0。

void Func1(int x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func1(n); 
cout << "n = " << n << endl; // n = 0 
"指针传递"的示例程序。

由于 Func2 函数体内的 x 是指向外部变量 n 的指针,改变该指针的内容将导致 n 的值改变,所以 n 的值成为 10。

void Func2(int *x) 
{ 
    (* x) = (* x) + 10; 
} 
... 
int n = 0; 
Func2(&n); 
cout << "n = " << n << endl; // n = 10 
"引用传递"的示例程序。

由于 Func3 函数体内的 x 是外部变量 n 的引用,x 和 n 是同一个东西,改变 x 等于改变 n,所以 n 的值成为 10。

void Func3(int &x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func3(n); 
cout << "n = " << n << endl; // n = 10

四、git

git fetch origin
git stash
git rebase origin/master
git stash pop
git add *
git commit -m "start"
//git rebase  ...continue

五、Json

JsonCPP安装
安装http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download

tar -zvxf scons-2.1.0.tar.gz

进入到解压目录scons-2.1.0,执行命令:

sudo python setup.py install

安装 JsonCPP

下载地址:
http://sourceforge.net/projects/jsoncpp/
解压:

tar -zvxf jsoncpp-src-0.5.0.tar.gz

进入到jsoncpp解压目录下,执行命令:

sudo scons platform=linux-gcc

还要以下两步操作:
会生成你对应的linux-gcc版本
将/jsoncpp-src-0.5.0/include/目录下的json文件夹拷贝到 /usr/local/include/下
将jsoncpp-src-0.5.0/libs/linux-gcc-4.9.1/目录下的libjson_linux-gcc-4.9.1_libmt.a拷贝到 /usr/local/lib/ 下,并为了方便使用,将其重命名为libjsoncpp.a

到此,配置已经完成,只需要在代码中添加头文件:#include <json/json.h>即可。
程序测试

注意:在编译里指定动态链接库的地址:-ljsoncpp


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ljsoncpp")




find_package(jsoncpp CONFIG REQUIRED)
include_directories(${JSON_INC_PATH})
target_link_libraries(${PROJECT_NAME}
    jsoncpp libjsoncpp.a)

测试程序

int main()
{
    string jsonStr = "{\"userName\":\"123456\",\"userPassword\":\"111111\"}";
    Json::Reader reader;
    Json::Value value;
    reader.parse(jsonStr,value);
    Json::Value::Members member = value.getMemberNames();
    for(Json::Value::Members::iterator iter = member.begin();iter != member.end(); ++iter)
    {
        cout<<(*iter)<<endl;    //获得key
        cout<<value[*iter].asString()<<endl;    //获得value
    }
    return 0;
}


六、获取时间

 //time
  struct tm * timenow;
  time_t  second=time(0);
  timenow=localtime(&second);
  char timechar[256]={0};
  sprintf(timechar,"%d-%d-%d %d:%d:%d",timenow->tm_year+1900,timenow->tm_mon+1,timenow->tm_mday,timenow->tm_hour,timenow->tm_min,timenow->tm_sec);
  printf("%s",timechar);
  // save_calibration_params.param_timechar = timechar;
  // write yml
  cv::FileStorage fs(calibration_result_path, cv::FileStorage::WRITE);
  if (fs.isOpened()) {
    fs << "time" << timechar;
    } 
  }
%YAML:1.0
---
time: "2022-8-31 11:5:54"

七、C++代码

类对象

class Measure {
 public:
  virtual void Init(MeasureParams& measure_params_) = 0;
  virtual void Process(
      double timestamp, std::vector<BoxAttributes> single_box,
      pcl::PointCloud<pcl::PointXYZI>::Ptr& laser_cloud_in) = 0;
 public:
  MeasureResult measure_re
};

  std::shared_ptr<Measure> s_measure;

多种方案复用Process函数,则可用虚函数

class HighPrecisionPenetrate : public Measure {
 public:
  virtual void Init(MeasureParams& measure_params_);

  virtual void Process(double timestamp, std::vector<BoxAttributes> single_box,
                       pcl::PointCloud<pcl::PointXYZI>::Ptr& laser_cloud_in);
}class PenetrateMeasure : public Measure {
 public:
  virtual void Init(MeasureParams& measure_params_);

  virtual void Process(double timestamp, std::vector<BoxAttributes> single_box,
                       pcl::PointCloud<pcl::PointXYZI>::Ptr& laser_cloud_in);
}

使用方法:

  if (measure_params.sensor_type == 1) {
    penatrate_measure = std::make_shared<PenetrateMeasure>();
  } else if (measure_params.sensor_type == 2) {
    penatrate_measure = std::make_shared<HighPrecisionPenetrate>();
  } else {
    measure_error("control init failed!");
    return;
  }

// 如下
  penatrate_measure->Process(timestamp, single_box, laser_cloud_in);


虚函数(virtual)

虚函数的作用:允许通过基类的指针或引用来访问基类和派生类的同名函数。

上面提到动态多态主要通过虚函数机制实现,这里介绍以下虚函数。和普通的函数声明方式相同,只要在函数的返回值前加上virtual关键字,该函数就为虚函数,即virtual 函数类型 函数名(形式参数)

#include <iostream>
using namespace std;
class Teacher
{
public:
	virtual void work()
	{
		cout << "上课" << endl;
	}
};
 
class MathTeacher :public Teacher
{
public:
	virtual void work()
	{
		cout << "数学课" << endl;
	}
};
 
class ChinsesTeachar :public Teacher
{
public:
	virtual void work()
	{
		cout << "语文课" << endl;
	}
};
 
class EnglishTeachar :public Teacher
{
public:
	virtual void work()
	{
		cout << "英语课" << endl;
	}
};
 
int main()
{
	cout << "上课啦!!!" << endl;
	MathTeacher tea;
	tea.Teacher::work();
	tea.MathTeacher::work();//没有虚函数只能这样调用基类的函数
	//定义一个指针数组
	Teacher** teacher = new Teacher*[3]();
	MathTeacher math;
	EnglishTeachar english;
	teacher[0] = new MathTeacher();
	teacher[1] = new ChinsesTeachar();
	teacher[2] = new EnglishTeachar();
	
	for (int i = 0; i < 3; ++i)
	{
		teacher[i]->work();
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值