鱼香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的配置文件,这个配置文件,下一个项目的时候你可以直接复制过去,就不需要手动配地址了。

相关推荐
程序喵大人3 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by209994 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
余额瞒着我当琳7 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂7 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan8 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘8 小时前
C++继承
c++·继承
汉克老师9 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
jimy111 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
潼心1412o12 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i12 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2