ROS2:创建一个包和节点
准备
在ROS2中什么是包,什么是节点?
- 包(Package) 是 ROS 2 的基本构建单元,包含了代码、资源、配置和依赖,组织着机器人的各个功能模块。
- 节点(Node) 是 ROS 2 中执行的具体单元,它是一个程序,可以完成传感器读取、控制计算、数据处理等任务,并通过话题、服务或动作与其他节点进行通信。
一个包中可以有多个节点,节点与包是包含的关系。
安装前面的文章安装好ROS2的开发环境。
安装colcon编译工具、rosdep工具。
sudo apt install python3-colcon-ros
创建一个工作空间
mkdir -p ~/dev_ws/src
创建一个功能包的命令
ros2 pkg create --build-type <build-type> <packge_name>
- pkg:调用功能包相关功能的子命令。
- create:创建功能包的子命令。
- build-type:表示新创建的功能包是C++还是Python,如果使用C++或者C,这里是”ament_cmake”;如果使用python,这里就是”ament_python”。
- packege_name:新建功能包的名字。
示例
cd ~/dev_ws/src
ros2 pkg create --build-type ament_cmake learning_pkg_cpp
ros2 pkg create --build-type ament_python learning_pkg_python
注意执行上面命令时,就会在当前目录下进行创建包,因此为了工程目录的结构,要切换到指定的目录进行创建。
python的方式
创建一个包
cd ~/dev_ws/src/
ros2 pkg create --build-type ament_cmake learning_pkg_python
创建完成后,会产生如下文件
.
├── learning_pkg_python
│ ├── learning_pkg_python
│ │ └── __init__.py
│ ├── package.xml
│ ├── resource
│ │ └── learning_pkg_python
│ ├── setup.cfg
│ ├── setup.py
│ └── test
│ ├── test_copyright.py
│ ├── test_flake8.py
│ └── test_pep257.py
创建节点程序
在~/dev_ws/src/learning_pkg_python/learning_pkg_python目录下创建一个node_helloworld_class.py文件,实现代码如下:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rclpy
from rclpy.node import Node
import time
class HelloworldNode(Node):
def __init__(self, name):
super().__init__(name)
while rclpy.ok():
self.get_logger().info("Hello World")
time.sleep(0.5)
def main(args=None):
rclpy.init(args=args)
node = HelloworldNode("node_helloworld_class")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
注意node_helloworld_class.py文件要和默认的init.py在一个目录下,保持同级。
设置程序入口
entry_points={
'console_scripts': [
'node_helloworld_class = learning_pkg_python.node_helloworld_class:main',
],
},
设置python的程序入口,让ROS2系统知道python程序的入口。
编译
cd ~/dev_ws/
colcon build
编译的时候,要切换到工程的根目录下进行编译。因为编译会在当前的根目录下生成build、install、log,而工程下会有很多包,因此建议都切换到工程的根目录下进行编译。
执行
ros2 run learning_pkg_python node_helloworld_class
CPP方式
创建一个包
执行创建包的命令
ros2 pkg create --build-type ament_cmake learning_pkg_cpp
下面是生成的包的目录结构
.
├── learning_pkg_cpp
│ ├── CMakeLists.txt
│ ├── include
│ │ └── learning_pkg_cpp
│ ├── package.xml
│ └── src
创建节点程序
在learning_pkg_cpp/src目录下创建一个node_helloworld_class.cpp文件,编写代码。
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class HelloWorldClass : public rclcpp::Node
{
public:
HelloWorldClass():Node("hello_world_class")
{
while(rclcpp::ok()) {
RCLCPP_INFO(this->get_logger(), "Hello World");
sleep(1);
}
}
};
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<HelloWorldClass>());
rclcpp::shutdown();
return 0;
}
设置编译选项
python是不用编译的,但是C++程序需要编译因此需要更新CmakeLists.txt。在文件中添加一下内容。
find_package(rclcpp REQUIRED)
# 查找依赖的功能包rclcpp,提供ROS2 C++的基础接口
add_executable(node_helloworld_class src/node_helloworld_class.cpp)
# 添加一个可执行文件名称为node_helloworld_class,源码路径为src/node_helloworld_class.cpp
ament_target_dependencies(node_helloworld_class rclcpp)
#编译时链接rclcpp的依赖库
install(TARGETS
node_helloworld_class
DESTINATION lib/${PROJECT_NAME}
)
#将可执行文件拷贝到install目录下。
编译执行
# 编译
cd ~/dev_ws/
colcon build
# 运行
source install/setup.bash
#先执行一下环境变量,可以补全新的命令。