ros2笔记-2.1 从第一个节点开始

发布于:2025-02-11 ⋅ 阅读:(43) ⋅ 点赞:(0)

节点概念

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包下面的,不是原来的代码。

 


网站公告

今日签到

点亮在社区的每一天
去签到