ROS 2机器人操作系统与Gazebo机器人仿真
在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 -1
msg.angular.z = random.uniform(1.0 , 2 * 1.0 ) * sign
msg.linear.x = 0.0
self.walk.cancel()
self.walk = self.create_timer(random.uniform(0, 2.0), self.random_speed)
else:
msg.angular.z = 0.0
msg.linear.x = 1.0
self.walk.cancel()
bu = random.uniform(2.5, 4.5)
self.walk = self.create_timer(bu, self.random_speed)
self.turn = not self.turn
self.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()*11
y=random.random()*11
cmd=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所示,在仿真环境中生成多个小海龟,并使小海龟们进行随机游走。

本书全面地介绍了ROS 2机器人操作系统与Gazebo机器人仿真技术,内容涵盖了机器人技术的基础知识、ROS 2的运行原理、基本操作与编程方法,以及新一代Gazebo仿真工具的使用,通过详细的操作步骤解析和丰富的实践案例,帮助读者快速掌握机器人开发与仿真的关键技能。
书共9章,第1章介绍了机器人技术基础知识,对机器人领域进行了全面概述;第2~4章重点介绍了ROS 2的安装、编程和仿真案例,以便读者熟练掌握ROS 2;第5章和第6章介绍了Gazebo的安装、仿真环境和机器人建模方法,第7章介绍ROS 2和Gazebo进行联合仿真的方法,第8章以移动机器人的自主建图和导航仿真介绍导航框架Nav2的使用方法,第9章介绍六足、四足、双足机器人、多旋翼无人机、海面船舶和水平潜艇等6种机器人仿真方法和流程。
本书内容丰富,理论与实践相结合,适合机器人技术初学者、高校计算机与机器人相关专业高年级本科生和研究生、科研院所的研究人员及从事机器人开发的工程师阅读和参考。随书附赠,本书中的所有仿真模型、全书源码、授课PPT和授课视频。
浙公网安备 33010602011771号