注:以下内容为鱼香肉丝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
&spm=1001.2101.3001.5002&articleId=157439519&d=1&t=3&u=692c7ac14c8a4ca49366663d477ee6a9)
5924

被折叠的 条评论
为什么被折叠?



