在使用ros2开发的时候难免会需要引入第三方的厂家提供的.so文件库。注意这里说的并不是自己写的cpp文件转成.so然后再自己的工程项目中使用。例如经常使用的ICANCmd.h头文件和libCanCmd.so库还有onnx推理的时候onnxruntime_c_api.h头文件和libonnxruntime.so库文件。ros1中使用如下代码添加:
target_link_libraries(${PROJECT_NAME}_node
${CMAKE_CURRENT_SOURCE_DIR}/lib/libonnxruntime.so # 微软公司的runntime库
)
但在ROS2中直接使用这种方式添加的话会报找不到 xx.so文件库。这是因为ROS2的.so需要将库引入到指定的文件路径下才能使用。
下面以电机CAN包为例一步步实现电机的.so库调用
mkdir can_test_ws # 创建can_test_ws工作空间
cd can_test_ws # 进入到can_test_ws
mkdir src # 创建src文件
cd src
创建一个test_can包依赖rclcpp 节点名称为can_node
ros2 pkg create test_can --build-type ament_cmake --dependencies rclcpp --node-name can_node
使用tree查看下文件结构
└── src
└── test_can
├── CMakeLists.txt
├── include
│ └── test_can
├── package.xml
└── src
└── can_node.cpp5 directories, 3 files
添加一个lib文件 拷贝libCanCmd.so文件并且在include/test_can文件中添加一个ICANCmd.h头文件(和libCanCmd.so配套由厂家提供)和一个motorControl.h使用文件和一个motorControl.cpp实现,添加完以后如下: (这里并没有按照hpp头文件cpp源文件的C++创建方式,而是沿用了ICANCmd.h的C语言写法。)
└── src
└── test_can
├── CMakeLists.txt
├── include
│ └── test_can
│ ├── ICANCmd.h
│ └── motorControl.h
├── lib
│ └── libCanCmd.so
├── package.xml
└── src
├── can_node.cpp
└── motorControl.cpp6 di