1. 前言
上一课我们介绍了ROS2的版本信息,了解到Humble是过去几年和当前的主流版本,存量项目比较大,同时也了解到Jazzy是官方当前主推的版本,在实际应用中,行业里的新项目已采用Jazzy版本。可以预见Jazzy是今后几年主流的版本,基于此,后面的课程我们以Jazzy为基础进行讲解。
2. ROS2五大核心概念
ROS2系统由多个节点组成,节点之间通过不同通信方式交换数据。2.1准备工作:配置环境
2.1.1执行Source命令,目的是加载ROS2系统级别的环境变量
source/opt/ros/jazzy/setup.bash2.1.2将source命令加到shell启动脚本,可省去每次执行上面的SOURCE操作
echo"source /opt/ros/jazzy/setup.bash">>~/.bashrc2.1.3检查环境变量
printenv|grep-iROS2.2Node 节点
ROS 中的每个节点都应负责单一的模块化功能,例如:控制车轮电机或发布来自激光测距仪的传感器数据。一个节点本质上就是一个进程。每个节点都可以通过主题、服务、动作或参数与其他节点发送和接收数据。
打个比方:整个 ROS2 机器人系统像一个公司,每个节点就是一个员工,员工各司其职,通过消息互相沟通,而不是所有人挤在一个工位干活。
上图中展示了3个节点之间发送和接收数据的方式,通过Service和Topic进行通信。
一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中,一个可执行文件(C++ 程序、Python 程序等)可以包含一个或多个节点。
2.2.1Node 相关命令
- ros2 run
语法:
ros2 run<package_name><executable_name>[--ros-args 节点参数]我们以官方小海龟为例,启动turtlesim 节点
ros2 run turtlesim turtlesim_node这里,软件包名称是turtlesim,可执行文件名是turtlesim_node
- ros2 node list
新打开一个终端,查看节点列表
ros2nodelist
这里turtlesim就是节点名称
- 查看节点信息:
语法:
ros2nodeinfo<node_name>ros2nodeinfo /turtlesim
ros2 node info返回订阅者、发布者、服务和操作的列表,即与该节点交互的 ROS 图连接。
- 节点重映射:–ros-args --remap __node:=new_node_name
重映射 = 运行时 “改名字、改地址”,不改源代码。相当于再“复制”一个具有相同属性的节点,只是名字或所属空间不同,而不用改源码。
ros2 run turtlesim turtlesim_node --ros-args--remap__node:=my_turtle
–remap可以简写为:-r,即:–remap==-r
-r __node:=xxx 用来修改节点名称,即上面的:–remap __node:=my_turtle
还可以修改所属命令空间:-r __ns:=/xxx
再次查看节点列表,新打开一个终端:
重映射的用途:
如果不做重映射,想要改节点名、改话题名,你只能打开 cpp/python 代码、修改字符串、重新 colcon 编译;
remap 是启动时动态修改,运行一次可以换一套名字。
应用场景 1:同一台机器,同时启动多个相同节点
比如:机器人上有两个一模一样的雷达驱动节点,驱动两个同型号激光雷达。驱动包是同一个 pkg、同一个可执行文件,代码里节点名默认叫lidar_driver。直接启动第二个会报错:节点重名。
解决方案:remap 修改节点名,同时重映射话题:# 雷达1ros2 run lidar_driver pkg_node --ros-args-r__node:=lidar_left-r/scan:=/scan_left# 雷达2ros2 run lidar_driver pkg_node --ros-args-r__node:=lidar_right-r/scan:=/scan_right应用场景 2:多机器人集群(多机、多车)
两台机器人 robot1、robot2,硬件、软件包完全一样,底盘驱动、IMU、导航包都是同一套。
如果话题都是/cmd_vel、/odom,两台机器人的消息会混在一起,robot1 的速度指令会发给 robot2。
解决方案:使用命名空间重映射隔离:# robot1底盘节点ros2 run chassis_driver driver_node --ros-args-r__ns:=/robot1# robot2底盘节点ros2 run chassis_driver driver_node --ros-args-r__ns:=/robot23.小结:
上面我们介绍了ROS2中节点的概念、基础命令行和一些应用场景,这些是节点的最基础的知识点,关于怎样创建节点我们在后面的课程中介绍。欢迎在欢迎在留言区发表意见。