ROS2学习(二、写一个简单的C++例子)

本文介绍了如何在ROS2环境中创建一个C++节点,使用rclcpp库创建定时器,周期性地发布“HelloWorld”消息。首先通过ros2pkg命令创建包,然后编写继承rclcpp::Node的类以实现节点功能,最后编译并运行程序,展示如何通过ros2topic命令查看发布的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在安装完ROS2后,就开始接触ros2的很多概念,东西很多,包括编译,中间件,节点等与ros1都有一些区别。如果没有ROS1的基础,直接接触这些概念,可能更难理解。
最简单的开始,就是先写一个简单的程序熟悉一下,把所有东西用一下,然后在理解所使用的每一个点的概念,这样更容易理解。就如同所有语言学习前先写一个“hello, world”一样。ROS2 也从“hello,world”开始。
本文就实现了一个定时器,通过定时器,触发固定频率的发出“hello world”.

1.创建一个ros2的工程包

所有的ros2的工程都是以包的形式存在的。包里面包括package.xml和CMakeList.txt,而且可以通过ros2 pkg命令可以很容易的创建出一个包所需要的基本的文件,而且可以指定依赖库,在创建的时候一并添加到包里。
如下语句就是创建一个ament_cmake类型的包,节点名字是timer_sample, 包名也是timer_sample ,指定的依赖是rclcpp.

ros2 pkg create --build-type ament_cmake --node-name timer_sample timer_sample --dependencies rclcpp std_msgs
crabe@crabe-virtual-machine:~/Desktop/sample/timer_sample/src$ ros2 pkg create --build-type ament_cmake --node-name timer_sample timer_sample --dependencies rclcpp
going to create a new package
package name: timer_sample
destination directory: /home/crabe/Desktop/sample/timer_sample/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['crabe <crabe@todo.todo>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: ['rclcpp']
node_name: timer_sample
creating folder ./timer_sample
creating ./timer_sample/package.xml
creating source and include folder
creating folder ./timer_sample/src
creating folder ./timer_sample/include/timer_sample
creating ./timer_sample/CMakeLists.txt
creating ./timer_sample/src/timer_sample.cpp

  • <build_type> 指定构建类型,可以是ament_cmake,ament_python等。
  • <dependencies> 指定软件包所依赖的其他软件包,可以是一个或多个依赖软件包的名称,以空格分隔。
  • <package_name> 是要创建的软件包的名称

为什么添加的依赖是rclcpp? 这个是因为在ros2中如果要使用C++实现,包括节点的实现都在rclcpp包中。
在ROS2中,节点是发布和订阅消息、执行计算和与其他节点进行通信的基本单元。节点需要与ROS2系统进行交互,包括创建订阅者和发布者,处理接收到的消息,发送消息等。为了实现这些功能,节点需要使用ROS2提供的一些基本功能和工具。
在C++中,通过继承rclcpp::Node类,节点可以获得ROS2提供的各种功能和工具。rclcpp::Node是ROS2提供的一个C++类,封装了ROS2的节点相关功能,使开发人员能够轻松地创建、配置和管理节点。

继承rclcpp::Node类的节点可以使用其提供的函数来完成以下任务:

创建发布者和订阅者,用于与其他节点进行通信;
发布消息给特定的话题;
处理接收到的消息;
定时执行周期性的任务;
获取参数值和设置参数;
与ROS2的服务进行通信;
获取当前节点的名称和命名空间等。
继承rclcpp::Node类的节点还可以轻松地使用ROS2的消息类型和执行上下文,而无需自己实现这些功能。
总之,继承rclcpp::Node类使节点能够方便地与ROS2系统进行交互,利用ROS2提供的丰富功能和工具来开发功能强大和可靠的ROS2节点。
如果有ROS1经验的人可能感觉这个比较难适应。因为ROS1完全是通过roscpp库实现的这些。没有这种可以提供继承的rclcpp::Node类.不过用习惯了,还是可以接受的,毕竟ROS2的rclcpp::Node类的引入是为了提供更强大灵活的开发体验,开发和管理节点更方便。
通过上面的方式ros2的包已经创建出来了。看一下目录结构


crabe@crabe-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值