0%

Calibration库开发笔记(一):前期准备

最近在进行机器人抓取的实验和研究,其中用到了很多与图像处理相关的算法,比如相机内参标定、机器人手眼标定和点云配准等。虽然这些算法在OpenCV、PCL和ROS框架都已经有很方便的实现,而且这些函数的稳健型都很高,但是我还是有把这些操作封装成库的想法,原因有几个:

  1. 这些算法的计算都需要提供不少的输入,而在应用中每次调用都要先写上一大段准备输入的代码,因此打算使用Wrapper把算法和输入封装成直接调用的函数;

  2. 以前没有写过运行库,借此机会学习一下;

  3. 把常用代码封装成库后在现有的几个项目调用都很方便,并且这些项目有的用C++有的用python,不用分别为实现相同功能写多份代码。

因此,我打算把现在常用的几个标定和配准的算法封装成库,并且提供C++和python的接口,使得调用更加方便。在这个系列中会把大部分计划和操作都记录下来,一方面为了备忘和整理思路,另一方面也把学习的经验和走过的弯路记录下来。

制定计划

在动手写代码之前,首先做了以下计划:

  1. 运行库的代码采用C++编写,由于常用的图像处理库OpenCV、线性代数计算库Eigen、点云处理库PCL都使用C++,对接会更加方便,并且为C++函数编写Python接口也很方便;

  2. 尽量为每个库函数都写上单元测试,使用google-test库编写,虽然编写单元测试是一个很枯燥的事情,但是使用单元测试一方面减少调试和找bug的时间成本,另一方面也保证函数是按照我的预期想法运行的,再有就是有效避免边写边更改函数功能和需求;

  3. 运行库的构建采用CMake构建工具,我此前几乎没有用过CMake,借此机会可以边做边学。

运行库打算起名叫Calibration库,在前期只会增加常用的几个标定函数,随着时间的发展应该会加入更多的功能。

项目结构

为了实现这个运行库,我在CLion IDE新建了一个叫robot-calibration-lib的项目,CLion默认采用CMake构建工具,因此我需要仔细规划项目的文件结构,使得项目的结构清晰,并且减少我整理项目的时间浪费。

项目预期包含几个模块:

  1. calibration模块用于存放我的运行库代码和头文件;

  2. test模块用于存放我的单元测试代码和测试文件;

  3. third-party模块用于存放运行库依赖的第三方库项目源码。虽然很多项目源码都可以通过Git拉取直接获得,但由于网络原因,我更倾向于直接使用本地源码进行编译;

  4. cmake模块用于存放CMake工具的一些配置文件;

  5. example模块用于存放一些示例代码。

为了整合几个模块,按照CMake的建议,我在项目根目录下存放的CMakeLists.txt用于追踪子模块的整合情况,每个子模块下的CMakeLists.txt用于管理各个模块的构建。

1
2
3
4
5
6
.
├── calibration
├── cmake
├── example
├── test
└── third-party

编译环境配置

由于代码的主要编写和开发都在我的13寸MacBook上进行,但是在计划中我的运行库预计主要都是在Linux环境运行(一个很大的原因是ROS只支持Linux,日常论文复现和项目都是在ROS上),所以项目的编译环境有两个:

  1. 在macOS平台本地编译,方便我使用笔记本本地调试。macOS的编译器是Xcode工具链上的clang编译器,调试器是LLDB 9.0,CMake版本是3.15.5;

  2. 在Linux平台远程编译。我的实验室座位上的台式机是实验室工作日常的主要工具,上面安装了Ubuntu 16.04和ROS Kinetic环境,编译器是GCC 5.4.0,调试器是GDB 7.11.1,CMake版本是3.15.5。

CLion上编译环境配置很方便,按照计划我配置了本地编译环境和通过SSH连接到台式机的远程编译环境,配置完成后就可以开始代码编写了。

小结

以上就是Calibration库的准备工作。Calibration库应该是我编写的第一个运行库和第一个较大的C++项目,如果可以顺利完成还是挺有成就感的。接下来我会继续规划运行库模块的代码结构,以及开始编写库函数和单元测试。