【ROS2】节点的含义及编写(python和C++)

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

注:以下内容为鱼香肉丝ROS2课程的内容整理,详细内容可查看其的课程内容。

一、节点

节点的主要作用是订阅和发布话题、使用服务、配置参数和执行动作等。

其中的话题(topic)、服务(service)、参数(parameter)和动作(action)是ROS2的四大核心通信机制。

二、用Python编写节点

1、直接编写步骤

① 新建文件ros2_python_node.py,并编写如下内容

import rclpy
from rclpy.node import Node

def main():
    rclpy.init()
    node = Node("python_node")
    node.get_logger().info('hello')
    rclpy.spin(node)
    rclpy.shutdown()

if __name__=="__main__":
    main()

上述代码中:

rclpy:ROS2提供的Python版本客户端库

Node:rclpy库的node模块中的类

rclpy.init():为通信分配资源

node = Node("python_node"):实例化Node类

node.get_logger().info('hello'):通过node实例调用get_logger()获取日志记录器,并使用日志记录器的info方法输出“hello”

rclpy.spin(node):启动节点node,然后不断循环检查node是否接收到了新的话题数据等事件

rclpy.shutdown():清理分配的资源,确认节点是否关闭

② 使用Python执行节点

在终端中输入以下指令即可运行。

python3 ros2_python_node.py

然后可以使用以下指令查看目前的节点列表,注意需要新开一个终端。

ros2 node list

关于ros日志函数的解读:

打印日志的函数:node.get_logger().info(‘’)、node.get_logger().warn(‘’)……

可以有不同的配置

其输出是

第一列:表示不同的配置,info、warn之类的

第二列:表示时间戳,表示的是从1970年到现在的时间

第三列:表示节点的名字

第四列:表示打印的内容

日志的格式可以通过修改环境变量RCUTILS_CONSOLE_OUTPUT_FORMAT来修改

2、使用功能包组织Python节点

功能包:ROS2中用于组织和管理节点的工具,可以直接使用ROS2提供的构建指令对节点进行编译和安装。具体步骤为:

① 在终端中创建功能包

ros2 pkg create demo_python_pkg --build-type ament-python --license Apache-2.0

ros2 pkg create:ROS2命令行工具pkg模块下用于创建功能包的命令

demo_python_pkg:功能包的名字

--build-type ament_python:表示指定功能包的构建类型为ament_python

--license Apache-2.0:用于声明功能包的开源协议

② 在功能包中编写代码文件

编写位置:在demo_python_pkg/demo_python_pkg下新建一个python文件python_node.py

在文件中输入以下内容:

import rclpy
from rclpy.node import Node

def main():
    rclpy.init()
    node = Node("python_node")
    node.get_logger().info('hello')
    rclpy.spin(node)
    rclpy.shutdown()

注意上述代码中去除了调用主函数的代码

功能包中调用主函数的方式是:告诉功能包main函数的位置,也就是接下来这步

③ 注册python节点

注册位置:demo_python_pkg/setup.py

此处的setup.py是python中常用的构建配置文件

注册内容:

注意注册时最后的逗号!

④ 添加依赖声明

由于代码中使用了rclpy库,所以需要在ROS2功能包的清单文件“package.xml”下添加依赖信息

添加位置:demo_python_pkg/package.xml

添加内容:<depend>rclpy</depend>

此处的package.xml为元数据清单文件,该文件对软件包的属性、状态及外部依赖关系进行了形式化定义。

⑤ 构建功能包

构建位置:该文件目录下的终端

输入命令:colcon build

Colcon:会在当前目录下扫描功能包,并创建与功能包同级的三个子目录

此时文件夹中会多出三个文件夹:

Build:构建过程中的中间文件

Install:构建结构的文件夹,该文件可以直接复制给别人使用,colcon build命令会在该文件夹中复制一个功能包demo_python_pkg,其中有python_node等可执行文件

Log:日志文件

⑥ 设置环境变量

位置:该文件目录下的终端

输入命令:source install/setup.bash

用来自动修改需要修改的环境变量,此环境变量只对当前终端有效,如果切换终端需要重新设置

⑦ 运行节点

位置:该文件目录下的终端

输入命令:ros2 run demo_python_pkg python_node

注意,此处运行的文件是install目录下的文件

三、CMake工具

在开始使用C++编写节点之前,需要介绍CMake工具。运行C++程序首先需要进行编译,一般可以使用g++的方法进行,但是面对复杂的代码,或者跨平台需求,仅使用g++是完全不够的,所以就需要引入CMake工具。

我现在需要用CMake工具自动编译以下代码:

#include "iostream"
int main()
{
    std::cout<<"Hello World"<<std::endl;
    return 0;
}

具体步骤为:

① 在当前目录中建立CmakeLists.txt文件,并输入以下内容:

cmake_minimum_required(VERSION 3.8)
project(HelloWorld)
add_executable(learn_cmake hello_world.cpp)

cmake_minimum_required(VERSION 3.8):用于构建当前文件最低的CMake版本。

project(HelloWorld):用于声明工程的名字。

add_executable(learn_cmake hello_world.cpp):用于添加可执行文件。第一个参数为生成文件的名字,第二个参数为源文件列表。

② 将CMakeLists.txt转换为Makefile

在终端中输入以下指令:

cmake .

③ 完成编译

接着在上述终端中输入以下命令完成编译。

make

make命令会调用编译器将代码转换为可执行文件。

四、用C++编写节点

1、直接编写步骤

① 新建ros2_cpp_node.cpp文件,并写入如下代码:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc,argv);
    auto node = std::make_shared<rclcpp::Node>("cpp_node")
    RCLCPP_INFO(node->get_logger(),"Hello CPP");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

② 使用CMake进行编译

由于此处代码包含了rclcpp.hpp头文件,而且该头文件不属于系统默认头文件目录,所以需要添加依赖。

新建CMakeLists.txt文件并写入如下内容:

cmake_minimum_required(VERSION 3.8)
project(ros2_cpp)
add_executable(ros2_cpp_node ros2_cpp_node.cpp)

find_package(rclcpp REQUIRED)
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES})

其中除了之前已经说明的,剩下代码的含义为:
find_package(rclcpp REQUIRED):查找rclcpp头文件和库文件的路径
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}):给可执行文件包含头文件
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES}):给可执行文件链接库文件

③ 运行

2、使用功能包组织C++节点

① 创建功能包

在目录下的终端中输入以下命令:

ros2 pkg create demo_cpp_pkg --build-type ament_cmake --license Apache-2.0

ros2 pkg create:用于创建功能包。

demo_cpp_pkg:功能包的名字。

--build-type ament_cmake:指定功能包的创建类型为ament_cmake。

--license Apache-2.0:用于声明功能包的开源协议。

以上代码完成后会在目录中生成如下文件和文件夹:

include:存放c++的头文件。

src:代码资源目录,放置节点或其他相关代码,下一步的代码编写也是在此文件夹下进行编写。

CMakeLists.txt:c++功能包编译也是通过cmake构建的,该文件为C/C++构建系统CMake的配置文件。

LICENSE:功能包的许可证,此处为Apache-2.0的协议内容。

package.xml:功能包的清单文件。

② 编写C++节点代码

在src目录下新建文件cpp_node.cpp,并输入如下内容:

#include "rclcpp/rclcpp.hpp"

int main(int argc,char** argv)
{
    rclcpp::init(argc,argv);
    auto node = std::make_shared<rclcpp::Node>("cpp_node");
    RCLCPP_INFO(node->get_logger(),"Hello");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

③ 对节点进行注册并添加依赖

位置:demo_cpp_pkg/CMakeLists.txt

首先CmakeLists.txt文件是这样的(此处项目名字为demo是因为这是我新建的用来对比的功能包):

然后依次执行以下操作:

A. 查找rclcpp头文件和库:find package(rclcpp REQUIRED)

B. 添加可执行文件 cpp_node:add_executable(cpp_node src/cpp_node.cpp)

C. 为cpp_node添加依赖:ament_target_dependencies(cpp_node rclcpp)

D. 将cpp_node拷贝到install目录下:

Install(TARGETS

cpp_node

DESTINATION lib/${PROJECT_NAME}

)

注意上述代码中有其他文件,只需要添加自己需要的文件的名字即可。

④ 对依赖进行声明

位置:demo_cpp_pkg/package.xml

在该文件中添加声明:<depend>rclcpp</depend>

⑤ 构建功能包

位置:demo_cpp_pkg同级目录下的终端

输入命令:

colcon build

该命令会创建可执行文件cpp_node,然后执行此文件即可。

⑥ 运行

位置:接上面demo_cpp_pkg同级目录下的终端

输入命令:

source install/setup.bash
ros2 run demo_cpp_pkg cpp_nod

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值