节点概念
https://zhuanlan.zhihu.com/p/430678606 推荐看看小鱼老师的专栏。
书上第二章直接就是编写你的第一个节点
也可以去看下小鱼老师翻译的ros2的中文文档理解节点 — ROS 2 Documentation: Humble 文档
ROS2中的节点也是如此,每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)
节点的交互:
那节点与节点之间就必须要通信了,那他们之间该如何通信呢?ROS2早已为你准备好了一共四种通信方式:
- 话题-topics
- 服务-services
- 动作-Action
- 参数-parameters
节点交互在后面章节。
1 编写第一个节点
2.1 python
新建文件夹2,下面新建ros2_python_node.py
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
node.get_logger().info('hello python node')
rclpy.spin(node)
rclpy.shutdown()
if __name__== "__main__":
main()
init() 初始化,spin方法启动节点,会不断循环检查被其运行的节点是否收到新的话题数据。最后的shutdown() 清理分配的资源并确认节点是否被关闭。
执行:
bohu@bohu-TM1701:~/2$ python3 ros2_python_node.py
[INFO] [1735880175.786577754] [python_node]: hello python node
日志格式不友好:调整下
bohu@bohu-TM1701:~/2$ export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}
bohu@bohu-TM1701:~/2$ python3 ros2_python_node.py
[main:7]:hello python node
新开终端:执行 ,看到第一个ros2节点启动成功了。
bohu@bohu-TM1701:~$ ros2 node list
/python_node
2.2 C++ 示例
新建一个ros2_cpp_node.cpp 文件
会提示include 引不到头文件,根据提示,选择c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/${ROS_DISTRO}/include/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
增加一行头文件引用目录。保存。
这时候就不提示找不到头文件了。
这个逻辑根python的类似。也是需要编译。配置下CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
project (ros2_cpp)
add_executable(ros2_cpp_node ros2_cpp_node.cpp)
# 查找rclcpp头文件和库文件的路径
find_package(rclcpp REQUIRED)
# 给可执行文件包含头文件
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})
# 给可执行文件链接库文件
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES})
注意根上一节加了3行,头文件库文件的引用
也是经历了cmake .
make 命令后,生成了可执行文件ros2_cpp_node。执行./ros2_cpp_node
新终端开启:ros2 node list 查看
2 使用功能包组织python节点
之前小海龟的demo,启动命令
ros2 run 包名字 可执行文件名字
工作空间是包含若干个功能包的目录,一个工作空间下可以有多个功能包,一个功能包可以有多个节点存在。
功能包可以理解为存放节点的地方,ROS2中功能包根据编译方式的不同分为三种类型。
- ament_python,适用于python程序
- cmake,适用于C++
- ament_cmake,适用于C++程序,是cmake的增强版
1 创建功能包
执行:ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg
ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg
going to create a new package
package name: demo_python_pkg
destination directory: /home/bohu/2
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['bohu <bohu@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_python
dependencies: []
creating folder ./demo_python_pkg
creating ./demo_python_pkg/package.xml
creating source folder
creating folder ./demo_python_pkg/demo_python_pkg
creating ./demo_python_pkg/setup.py
creating ./demo_python_pkg/setup.cfg
creating folder ./demo_python_pkg/resource
creating ./demo_python_pkg/resource/demo_python_pkg
creating ./demo_python_pkg/demo_python_pkg/__init__.py
creating folder ./demo_python_pkg/test
creating ./demo_python_pkg/test/test_copyright.py
creating ./demo_python_pkg/test/test_flake8.py
creating ./demo_python_pkg/test/test_pep257.py
2 创建节点
在demo_python_pkg下面创建节点,python_node.py
内容就跟之前一样
3 注册
在setup.py,entry_points增加刚才节点main函数入口配置
4 添加依赖声明
package,xml增加依赖rclpy声明。
5 构建
执行colcon build
bohu@bohu-TM1701:~/2$ colcon build
Starting >>> demo_python_pkg
Finished <<< demo_python_pkg [1.50s]
在install下生成了可执行节点
直接执行python_node会报错。需要先配置路径
printenv |grep PYTHON
ROS_PYTHON_VERSION=3
PYTHONPATH=/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages
bohu@bohu-TM1701:~/2$ source install/setup.bash
bohu@bohu-TM1701:~/2$ printenv |grep PYTHON
ROS_PYTHON_VERSION=3
PYTHONPATH=/home/bohu/2/install/demo_python_pkg/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages
bohu@bohu-TM1701:~/2$
6 执行
bohu@bohu-TM1701:~/2$ ros2 run demo_python_pkg python_node
[INFO] [1735887534.740786581] [python_node]: hello python node
注意:实际执行的代码在install包下面的,不是原来的代码。