1. 理解ROS2中.so库集成的核心概念
在ROS2开发中,我们经常会遇到需要复用已有C++代码的情况。这时候,将代码编译成.so动态链接库就成了一个非常实用的选择。简单来说,.so文件就像是Windows系统中的.dll文件,它包含了编译好的二进制代码,可以在不同的程序之间共享使用。
我自己在实际项目中就经常遇到这种情况:有些核心算法或者工具类需要在多个ROS2节点中使用,如果每次都重新编译这些代码,不仅浪费时间,还容易导致版本不一致的问题。把这些功能封装成.so库,就像是在代码库中建立了一个共享工具箱,随用随取,非常方便。
ROS2提供了两种主要的.so库集成方式:手动复制方式和ament导出方式。手动复制就像是你自己把工具从工具箱里拿出来放到工作台上,简单直接但不够灵活;ament导出方式则像是给工具贴上了标签并登记在册,系统能自动帮你找到和管理这些工具。两种方式各有优劣,适用于不同的场景。
理解这两种方式的区别很重要,因为这直接影响到你的项目结构和维护成本。手动复制方式适合小型项目或者快速原型开发,而ament导出方式更适合中大型项目,特别是需要多人协作或者有复杂依赖关系的场景。
2. 项目环境准备与基础配置
在开始集成.so库之前,我们需要先搭建好开发环境。首先确保你已经安装了ROS2,我使用的是Humble版本,但其他版本的操作也基本类似。创建两个包:mylib用于生成.so库文件,mynode用于调用这个库。
创建包的指令如下:
ros2 pkg create --build-type ament_cmake --dependencies rclcpp rclpy std_msgs --node-name mycpp mynode
ros2 pkg create --build-type ament_cmake --dependencies rclcpp rclpy std_msgs --node-name myclass mylib
这里有几个细节需要注意:--build-type指定为ament_cmake,因为我们要使用CMake来构建C++项目;--dependencies添加了rclcpp、rclpy和std_msgs,这些都是ROS2开发的基础依赖;--node-name参数指定了默认生成的节点文件名。
创建完成后,项目结构应该是这样的:
workspace/
├── mylib/
│ ├── CMakeLists.txt
│ ├── package.xml
│ ├── include/mylib/
│ └── src/
└── mynode/
├── CMakeLists.txt
├── package.xml
├── include/mynode/
└── src/
在mylib包的include目录下,我们创建myclass.hpp头文件,定义需要封装的类和函数:
#ifndef MY_CLASS_HPP
#define MY_CLASS_HPP
#include <iostream>
class MYCLASS {
public:
int a;
in

2872

被折叠的 条评论
为什么被折叠?



