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;
}