ROS控制多台机器人实现多机协同

本文介绍了如何使用ROS实现多台机器人的控制,包括两台机器人的跟随和多机器人编队。核心在于利用TF工具进行坐标转换,通过发布和订阅TF来获取和设置机器人之间的位置关系。通过Turtlesim模拟环境,演示了如何在不同命名空间下运行多台Turtlebot。最后给出了双机跟随的Demo代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 实现思路

1.1 两台机器人跟随

首先先来缕一缕思路,如果要实现turtlebot2跟随turtlebot1,则需要知道两台机器人之间的位置和姿态的关系。

具体如何获得机器人各自的 位姿坐标 关系,可以通过SLAM建图、里程计、全局相机、动作捕捉设备等等,获取坐标后可以通过广播的方式发给ROS中的 TF工具。之后通过订阅 TF工具 中两机器人的关系即可。

之后通过两机器人之间的位姿关系可获得两机器人的 距离姿态角差值,通过PID控制分别发布 速度角速度 指令,实现机器人的跟随控制。

1.2 多台机器人编队

1.1 中思路,可分别获取多机器人间的坐标关系,此时可以通过 TF工具 中的 静态坐标关系广播 获取所需队形各自位置的坐标,之后如上节一样,每台机器人去跟随自己所需到达的对应坐标即可。

2 TF工具的使用

2.1 什么是TF

TF是Transformations Frames的缩写。在ROS中,是一个工具,提供了坐标转换等方面的功能。

说白了TF工具就是帮助你完成坐标转换的一个工具,有了它就不用去计算各个坐标系之间的转换了,学过机器人学的应该会对此感受颇深。

2.2 TF的构成

在ROS中,TF工具包包含了三块内容:BroadcasterListenerTF转换工具

ROS中提供的是TF转换工具。转换是通过两个部分来完成的。

  • Broadcaster 负责向TF工具广播 参照物自己的位置 关系
  • Listener 负责向TF工具查看 想要知道的 两个物体间的相对坐标

TF工具底层是通过向量来去实现的。

2.3 向TF工具广播发送自己位置

部分代码

from tf.broadcaster import TransformBroadcaster
from tf.transformations import quaternion_from_euler

broadcaster = TransformBroadcaster()


def pose_callback(msg):
	if not isinstance(msg, Pose):
        return
    # 机器人在参考坐标系的位置msg.x和msg.y,姿态msg.theta
	translation = (msg.x, msg.y, 0)
	rotation = quaternion_from_euler(0, 0, msg.theta)		# 欧拉角 ->  四元素
	
	broadcaster.sendTransform(translation, rotation, rospy.Time().now(), "child", "parent")		# 发广播

其中 quaternion_from_euler 将欧拉角转换为四元素:欧拉角,旋转矩阵。其中欧拉角:roll:x、pitch:y、yaw:z。

sendTransform 中传入的几组数分别为:

  • translation:描述位置
  • rotation:通过四元素来描述姿态
  • Time().now():time,打上时间戳
  • "child":子坐标系(机器人坐标系)
  • "parent":父坐标系(机器人的参考坐标系)

2.4 向TF工具收听获取坐标关系

部分代码

# 获取相对位置信息的listener
listener = TransformListener()

rate = rospy.Rate(10)
while not rospy.is_shutdown():

    try:
        transform = listener.lookupTransform("target_frame", "source_frame", rospy.Time())
    except:
        rate.sleep()
        continue
    
    x, y, z = transform[0] 		# 获取位置
    quat = transform[1]		# 获取姿态 (四元素) -> rpy
    roll, pitch, yaw = euler_from_quaternion(quat)

lookupTransform 中传入的几组数分别为:

  • "target_frame":参考坐标系
  • "source_frame":求解的坐标系
  • rospy.Time():获得最近的相对位置
    返回的数据为:
  • 位置:[x, y, z]
  • 姿态:[roll, pitch, yaw, w]

3 通过turtlesim实现

待补充

4. 如何同时运行多台Turtlebot

4.1 通过命名空间

启动launch时,前面加上ROS_NAMESPACE='xx',这样的话启动的机器人应该就自带一个命名空了,它所接受的信息都要带xx/前缀,这样可以做到多个机器人分别控制,如:

ROS_NAMESPACE=robot1 roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen
ROS_NAMESPACE=robot2 roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen
ROS_NAMESPACE=robot3 roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen

之后再运行rosrun前也加上命名空间即可对应不同的机器人了

ROS_NAMESPACE=robot1 rosrun turtlebot3_teleop turtlebot3_teleop_key
ROS_NAMESPACE=robot2 rosrun turtlebot3_teleop turtlebot3_teleop_key
ROS_NAMESPACE=robot3 rosrun turtlebot3_teleop turtlebot3_teleop_key

5. Demo——双机跟随

这里放上@清晨的光明的demo

### ROS多机器人系统的协同控制实现方案 #### 背景概述 多机器人系统(MRS)因其高效性和鲁棒性成为当前机器人领域的重要研究方向。通过利用ROS的模块化架构和强大通信能力,开发人员可以构建高效的多机器人协作平台[^1]。 #### 时间同步 为了确保多机器人系统中的各个节点能够协调一致地运行,时间同步至关重要。在ROS环境中,可以通过`ros_clock`以及NTP(Network Time Protocol)服务来实现跨设备的时间同步。具体来说,开发者可以在启动文件中配置参数服务器以启用外部时钟源,并设置相应的偏移校正逻辑[^2]。 ```xml <param name="/use_sim_time" value="true"/> ``` 上述XML片段展示了如何在一个launch文件里激活仿真模式下的全局计时器。 #### 数据共享 数据交换是多机器人间合作的基础。ROS提供了Topic发布/订阅制作为主要手段来进行实时信息传递;Service调用则适用于请求响应型交互场景;而Actionlib库更适合处理长时间执行的任务反馈需求。例如,在一个搜救任务中,每台无人会将其拍摄到的画面打包成消息对象并通过特定主题广播出去供其他成员接收分析。 以下是创建自定义消息类型的简单例子: ```bash $ roscd my_package/msg/ $ echo "float64 latitude\nfloat64 longitude\nduration timestamp" > GPSMessage.msg ``` 接着需要重新编译工作空间使新类型生效。 #### 故障恢复策略 考虑到野外作业或者危险环境操作可能面临的突发状况,设计合理的错误检测与修复流程显得尤为重要。一方面要依赖硬件层面的安全防护措施比如急停按钮等物理装置;另一方面软件部分也要具备自我诊断能力和自动重启等功能。当某个子系统报告异常状态时,中央控制器会依据预设规则决定采取何种行动——可能是隔离受影响单元继续前进,也或许是派遣备用资源前往支援。 #### 高级功能扩展 除了基本的功能之外,还可以探索更高级特性进一步提升整体性能表现。例如SLAM(Simultaneous Localization And Mapping)技术可以帮助群组共同建立周围世界的三维地图模型;路径规划算法优化个体运动轨迹从而减少碰撞概率等等。 ---
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arcann

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值