鱼香ros2(五)用C++编写节点

一、为什么用C++

Python是解释性语言,其运行效率比较慢,在实际的开发中并不占优势,所以我们要使用C++。

插件安装:

二、用C++编写文件ros2_cpp

#include "rclcpp/rclcpp.hpp" (include 导入,以下每一行意义可以参考"鱼香ros2(四)......有相关介绍")

int main(int argc,char **argv) (int argc,char **argv是程序的入口参数)

{

rclcpp::init(argc,argv); ("::"这个是域名解析符,init()初始化,argc还有argv后续在对节点信息进行操作时可以使用,比如修改节点名字等)

auto node=std::make_shared<rclcpp::Node>("cpp_node"); (auto:自动类型推导,node:变量名,可以随便取一个,创建rclcpp下的Node的共享指针,cpp_node:节点名称,自定义)

RCLCPP_INFO(node->get_logger(),"你好 C++节点!"); (打印日志,node:上一步定义的变量名,","逗号后面跟打印内容)

rclcpp:spin(node);

rclcpp::shutdown();

return 0;

}

main函数里的参数argc及argv

报错问题: #include "rclcpp/rclcpp.hpp" 找不到库,但是iostream却能找到。因为iostream是系统默认库,可以找到,但是rclcpp不是系统库里的,所以要将crlcpp库导入到我们的整个工程中来,使用CMakeLists来处理。

三、使用CMakeLists.txt来编译ros2_cpp

1、CMakeLists.txt文件编写

cmake_minimum_required(VERSION3.8)

project(ros2_cpp)

add_executable(ros2_cpp_node ros2_cpp_node.cpp)

注意,关于make后报错问题(找不到文件,rclcpp/rclcpp.hpp)

1) #查找rclcpp头文件和库文件的路径,"REQUIRED"依赖是必须的

find_package(rclcpp REQUIRED)

#测试打印使用:打印状态,以下message()函数可以不加在txt文件里,只是为了方便自己找信息使用的。"rclcpp_LIBRARIES"库文件及rclcpp依赖的库文件,"rclcpp_INCULUDE_DIRS"头文件及rclcpp依赖的头文件,如果 find_package(rclcpp REQUIRED) 不加,则无法找到对应文件,这也是为什么要使用find_package(rclcpp REQUIRED)的原因,我们用的是rclcpp则需要去加载对应的头文件及库文件才能使用。

message(STATUS ${rclcpp_INCLUDE_DIRS})

message(STATUS ${rclcpp_LIBRARIES})

2)#给可执行文件包包含头文件,上一步找到对应文件后,要将文件的路径给到我们的.cpp文件,这样对应ros2_cpp_node.cpp文件才能使用rclcpp。

"ros2_cpp_node":可执行文件名,与你在上面编写的 add_executable(ros2_cpp_node ros2_cpp_node.cpp)第一个参数名一致。

"${rclcpp_INCLUDE_DIRS}":头文件的路径。

"PUBLIC":语法要求。

target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})

(这一句加了后,我们的可执行文件ros2_cpp_node.cpp就添加了这个rclcpp_INCLUDE_DIRS头文件的依赖)

3)#给可执行文件链接库文件,链接库依赖也需要给到我们可执行文件。

"ros2_app_node":可执行文件名。

${rclcpp_LIBRARIES}:链接库。

target_link_libraries(ros2_app_node ${rclcpp_LIBRARIES})

2、终端执行命令

cmake .

make

有对应可执行文件了,直接使用执行

使用./ my_cpp_node (你自己取的什么名字就用什么名字)

四、查看节点信息(同上一节)

#查看节点列表(当前执行的节点)

ros2 node list

#查看某个节点信息

ros2 node info /cpp_node

五、其他注意事项

1、必须修改CMakeLists.txt文件名

为什么修改?因为CMakeLists.txt文件会被接下来要学习的ros2构建工具搜索和误用,为了接下来学习能够顺利进行,需要将CMakeLists.txt文件删除或者换个名字。

2、安装C++插件

插件安装后,.cpp文件报错问题,先点波浪线旁边黄色小灯泡,按下图做选择:

在跳转页面找到"包含路径"框→输入(安装ros2的目录) /opt/ros/humble/include/**

配置好了,就不会报错了,而且还会生成一个.json的配置文件,这个配置文件,下一个项目的时候你可以直接复制过去,就不需要手动配地址了。

相关推荐
syagain_zsx9 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官9 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月9 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理
闻缺陷则喜何志丹10 小时前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
会编程的小孩10 小时前
C++ 内存分区、堆与栈、static、union 完整修正版文档
c++
多弗朗皮卡丘11 小时前
C++的类型转换
开发语言·c++
火22511 小时前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
C++ 老炮儿的技术栈12 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai100712 小时前
STL深度剖析2
java·c++·算法
幻智星科技12 小时前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构