在ROS 2系统中,驱动多台机器人涉及多个关键组件和概念,这些组件协同工作以实现多机器人系统的有效控制和协调。多机器人系统通常涉及协同工作和任务分配。ROS 2通过服务、参数服务器和自定义消息等功能,实现任务分配和协同工作的有效管理,例如,一个中心节点可以分配任务给多台机器人,并收集和汇总任务执行的结果。以下通过两个群机器人的控制案例,介绍利用ROS 2实现多机器人控制的方法。
4.3.1 案例:随机游走
利用ROS 2的通信机制,在TurtleSim在仿真环境中创建多个小海龟,并使这些小海龟在仿真环境中随机游走,效果如图4-6所示。
图4-6 随机游走
实现多个小海龟的随机游走,需要先创建多个小海龟,然后需要向创建的各个小海龟发布控制速度的话题。创建小海龟可通过在Launch文件里调用/spwan服务实现,根据命名空间创建控制各个小海龟运动的节点。具体的实现步骤如下:
1.编写控制节点
创建控制一个小海龟随机游走的random_walk.py节点,代码如下:
ros2_ws4/src/turtle_exercise/turtle_exercise/random_walk.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
import random
class RandomWalk(Node):
def init(self):
super().init('random_walk')
self.turn = False if random.random() < 0.5 else True
self.current_msg = Twist()
self.walk = self.create_timer(3, self.random_speed)
self.cmd_publisher = self.create_publisher(Twist, 'cmd_vel', 10)
def random_speed(self):msg = Twist()if self.turn:sign = 1 if random.random() < 0.5 else -1msg.angular.z = random.uniform(1.0 , 2 * 1.0 ) * sign msg.linear.x = 0.0self.walk.cancel()self.walk = self.create_timer(random.uniform(0, 2.0), self.random_speed)else:msg.angular.z = 0.0msg.linear.x = 1.0self.walk.cancel()bu = random.uniform(2.5, 4.5)self.walk = self.create_timer(bu, self.random_speed)self.turn = not self.turnself.cmd_publisher.publish(msg)
def main(args=None):
rclpy.init(args=args)
node = RandomWalk()
try:
rclpy.spin(node)
except Exception:
rclpy.shutdown()
exit(0)
rclpy.shutdown()
if name == 'main':
main()
以上代码定义了一个继承自Node的RandomWalk类,主要功能是:
(1)在类初始化方法方法__init__()。定义变量self.turn表示机器人是否转向,并初始化为随机的布尔值。定义变量self.current_msg,并初始化为一个空的Twist消息对象,用于存储当前的运动指令。创建一个定时器self.walk,每隔3s触发一次self.random_speed()回调函数,实现机器人的随机移动。创建了一个话题发布者self.cmd_publisher,发布Twist消息到'cmd_vel'话题,控制小海龟的运动。
(2)定时器回调函数random_speed()。如果变量self.turn为True,则表示当前要转向,随机选择一个方向(正向或反向),设置线速度设置为0,生成一个随机的角速度;如果self.turn为False,则表示当前直行,设置角速度为0,线速度设置为1。self.walk.cancel()取消当前的定时器,根据不同情况重新创建一个定时器,以实现不同的定时运动间隔。最后,使用self.cmd_publisher.publish(msg)发布生成的Twist消息,控制机器人的运动。
2.编写Launch文件
编写Launch文件启动所需的节点,完成多个小海龟的生成多并使其随机游走。创建random_walk_launch.py文件,代码如下:
ros2_ws4/src/turtle_exercise/launch/random_walk_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
import random
def generate_launch_description():
turtle_num = 10
ld = LaunchDescription()
sim = Node(package='turtlesim',executable='turtlesim_node',name='sim')
ld.add_action(sim)for i in range (turtle_num):name = 'turtle' + str(i+1)turtle = Node(package='turtle_exercise',executable='random_walk',namespace=name)ld.add_action(turtle)x=random.random()*11y=random.random()*11cmd=f'x: {x}, y: {y}, name: {name}'ep=ExecuteProcess(cmd=[['ros2 service call ','/spawn ' ,'turtlesim/srv/Spawn ','"{' + cmd + '}"',]], shell=True)ld.add_action(ep)return ld
在以上代码中,利用Python语言中的循环创建了控制小海龟的节点和生成小海龟的服务调用,并通过对控制节点命名空间的设置使控制节点与特定的小海龟建立联系,对小海龟实现控制。
3.运行仿真
编译和安装功能包后,运行Launch文件,命令如下:
ros2 launch turtle_exercise random_walk_launch.py
上述命令的运行效果如图4-6所示,在仿真环境中生成多个小海龟,并使小海龟们进行随机游走。