在安装完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-