首页 > 其他分享 >ROS(Robot Operating System)

ROS(Robot Operating System)

时间:2024-12-06 18:45:21浏览次数:7  
标签:订阅 pose Robot 话题 Operating 消息 ROS 节点

ROS (Robot Operating System) 是一个开源的机器人中间件框架,提供了多种工具、库和约定,帮助开发者更高效地开发机器人应用程序。虽然名字中有 "操作系统"(Operating System),但 ROS 更像是一个操作系统层的框架,提供了机器人开发所需的基本功能,比如硬件抽象、设备驱动、底层控制、功能包管理、消息传递等。

如果你想快速理解并上手 ROS,可以按照以下步骤:

1. 了解 ROS 的基础概念

首先,需要理解 ROS 的核心组成和基本概念:

  • 节点 (Node): ROS 程序的最小单位,通常对应机器人中的一个功能模块,比如传感器数据处理、运动控制等。
  • 话题 (Topic): 用于不同节点间进行通信的发布/订阅机制。一个节点可以发布消息到某个话题,其他节点可以订阅该话题并接收消息。
  • 服务 (Service): 用于节点之间进行同步的请求-响应式通信。
  • 消息 (Message): ROS 中传递的数据格式。不同的话题和服务使用不同类型的消息。
  • 功能包 (Package): ROS 中用于组织代码的单位,可以包含代码、配置文件、文档等。
  • 参数服务器 (Parameter Server): 用于存储和访问配置参数。
  • 调度器 (Master): 负责协调 ROS 系统中的节点间的通信。

2. 安装 ROS

ROS 支持多种操作系统,最常见的是 Ubuntu Linux。可以根据你所用的操作系统,选择对应版本的 ROS。以安装 ROS Noetic(适用于 Ubuntu 20.04)为例:

  1. 更新并安装依赖

    sudo apt update
    sudo apt upgrade
    sudo apt install curl gnupg2 lsb-release
    
  2. 设置 ROS 软件源

    sudo curl -sSL http://get.ros.org/setup_noetic.sh | sudo bash
    
  3. 安装 ROS

    sudo apt install ros-noetic-desktop-full
    
  4. 初始化 rosdep(依赖管理工具)

    sudo rosdep init
    rosdep update
    
  5. 设置环境变量: 在 ~/.bashrc 文件中添加以下行:

    source /opt/ros/noetic/setup.bash
    

    然后执行:

    source ~/.bashrc
    

3. 创建 ROS 工作空间

ROS 使用工作空间 (workspace) 来组织和管理功能包。创建一个 ROS 工作空间,并开始编写和运行你的节点。

  1. 创建工作空间

    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws/
    catkin_make
    
  2. 配置工作空间环境: 在 ~/.bashrc 文件中添加:

    source ~/catkin_ws/devel/setup.bash
    

    然后执行:

    source ~/.bashrc
    

4. 创建第一个 ROS 节点

  1. 创建功能包

    cd ~/catkin_ws/src
    catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
    
  2. 编写简单的发布节点: 在 beginner_tutorials/src 目录下创建一个 Python 脚本 talker.py

    #!/usr/bin/env python
    import rospy
    from std_msgs.msg import String
    
    def talker():
        rospy.init_node('talker', anonymous=True)
        pub = rospy.Publisher('chatter', String, queue_size=10)
        rate = rospy.Rate(1)  # 1 Hz
        while not rospy.is_shutdown():
            hello_str = "Hello ROS, time is %s" % rospy.get_time()
            rospy.loginfo(hello_str)
            pub.publish(hello_str)
            rate.sleep()
    
    if __name__ == '__main__':
        try:
            talker()
        except rospy.ROSInterruptException:
            pass
    
  3. 给脚本添加执行权限

    chmod +x ~/catkin_ws/src/beginner_tutorials/src/talker.py
    
  4. 编译工作空间

    cd ~/catkin_ws
    catkin_make
    
  5. 运行节点: 启动 ROS 核心:

    roscore
    

    在另一个终端运行 talker 节点:

    rosrun beginner_tutorials talker.py
    

5. 订阅和查看消息

可以创建一个订阅节点,来接收 talker 节点发布的消息。

  1. 编写订阅节点: 在 beginner_tutorials/src 目录下创建 listener.py

    #!/usr/bin/env python
    import rospy
    from std_msgs.msg import String
    
    def callback(data):
        rospy.loginfo("I heard %s", data.data)
    
    def listener():
        rospy.init_node('listener', anonymous=True)
        rospy.Subscriber("chatter", String, callback)
        rospy.spin()
    
    if __name__ == '__main__':
        listener()
    
  2. 给脚本添加执行权限

    chmod +x ~/catkin_ws/src/beginner_tutorials/src/listener.py
    
  3. 运行订阅节点: 在另一个终端中运行:

    rosrun beginner_tutorials listener.py
    

你应该可以看到 listener 节点输出接收到的 talker 节点发布的消息。

6. 进一步学习

通过这些基础步骤,你可以快速理解 ROS 的基本使用方法。在此基础上,建议深入学习以下内容:

  • ROS 包和库:了解不同的 ROS 包和库,如传感器接口、运动控制、路径规划等。
  • 调试与测试工具:如 rqt_graphrqt_plotrosbag 等,用于可视化和记录 ROS 系统中的数据。
  • 机器人仿真:通过 Gazebo 或 RViz 进行机器人仿真和可视化。
  • ROS 2:如果你希望进入更复杂的机器人系统开发,可以学习 ROS 2(ROS 的新版本),它在通信、实时性、扩展性等方面有所提升。

通过不断实践和学习,你将能够更熟练地使用 ROS 来开发各种机器人应用。

 

 


 

ROS(Robot Operating System)是一个开源的机器人操作系统,它通过模块化设计提供了灵活的工具集和框架来开发机器人应用程序。ROS的核心组成部分之间存在紧密的联系,以下是它们之间的主要关系和相互作用:


1. ROS Master

  • 功能:ROS Master 是 ROS 网络的核心,负责节点之间的注册与发现。
  • 联系
    • 所有 ROS 节点需要向 Master 注册,Master 记录节点的信息(如名称和通信主题)。
    • Master 提供节点间的服务发现功能,使得节点能够通过主题(Topics)、服务(Services)或动作(Actions)进行通信。

2. ROS 节点(Nodes)

  • 功能:节点是 ROS 程序的基本单元,负责执行具体的功能,比如传感器读取、路径规划或运动控制。
  • 联系
    • 节点通过 Master 注册并发现其他节点。
    • 节点通过主题(Topics)、服务(Services)或参数服务器(Parameter Server)进行数据交换。
    • 多个节点构成一个协作网络,完成复杂任务。

3. 主题(Topics)

  • 功能:用于节点之间的异步通信。节点可以通过发布(Publish)和订阅(Subscribe)主题来发送和接收消息。
  • 联系
    • 节点通过 Topics 进行数据共享。例如,传感器节点发布数据,控制节点订阅并进行处理。
    • Master 维护主题与发布者/订阅者的对应关系。

4. 服务(Services)

  • 功能:提供同步通信机制,允许节点通过请求-响应模式进行交互。
  • 联系
    • 服务通常用于需要即时结果的操作,比如查询机器人状态或执行某些动作。
    • 与主题不同,服务通信是点对点的,由 Master 负责服务端和客户端之间的匹配。

5. 参数服务器(Parameter Server)

  • 功能:存储全局参数,用于共享配置数据(如机器人模型、环境信息等)。
  • 联系
    • 节点可以从参数服务器读取或写入参数,通常在启动时加载参数。
    • 参数服务器在整个系统中提供统一的参数访问点,避免重复定义。

6. 消息(Messages)

  • 功能:定义节点之间通信的数据格式。
  • 联系
    • Topics 和 Services 都依赖消息进行数据传递。
    • 消息类型定义了具体的数据结构(如传感器数据、位姿等)。

7. 动作(Actions)

  • 功能:扩展了服务机制,允许异步操作,尤其适用于需要长时间运行的任务。
  • 联系
    • 动作由三个主要组件(目标、反馈、结果)组成,允许实时监控任务进度。
    • 动作的实现涉及服务与主题的组合,提供灵活的交互机制。

8. 包(Packages)

  • 功能:ROS 应用的组织单元,包含节点、消息定义、配置文件和工具。
  • 联系
    • 不同包之间可以通过消息、服务或参数进行交互。
    • 包管理依赖 roslaunch 启动文件来协调多个节点和配置参数。

总结:核心组成的联系图

+--------------------+
|   ROS Master       |
+--------------------+
      ↑      ↑
      |      |
+-----+------+-----+
|                  |
|     Nodes        |
|                  |
+--+------------+--+
   |            |
+--+--+      +--+--+
|Topics|      |Services|
+------+      +--------+
   ↑               ↑
   |               |
+--+--+        +---+---+
|Messages|      |Parameter|
+--------+      +---------+

通过这样的设计,ROS 实现了模块化和松耦合,使得机器人系统具有高度的灵活性和可扩展性。

 


 

 

TopicService 之间的主要区别之一就是它们的通信方式:Topic 是异步的,Service 是同步的。这两种通信方式的设计分别适用于不同的应用场景。下面是对它们的详细解释以及为什么要这样设计的原因:

 

1. Topic: 异步通信

解释:

  • Topic 基于 发布/订阅模式,是一种异步的通信方式。
  • 节点(通常是发布者)将消息发送到某个主题(Topic),而 其他节点(订阅者)在订阅这个主题时,可以异步地接收消息。
  • 发布者和订阅者之间没有直接的同步联系,即发布者在发送消息后不等待响应,也不关心是否有订阅者。
  • 消息的传递是非阻塞的,发布者不需要等待或依赖订阅者的行为。

适用场景:

  • 传感器数据:传感器(如摄像头、激光雷达、IMU等)通常以高频率持续发送数据,且不需要等待或确认接收者的响应。这些数据应该异步地广播给所有订阅者。
  • 状态更新:机器人状态(如位置、速度等)可以定期发布给多个组件(例如导航模块、显示模块),而不需要等待任何一个模块的反馈。

为什么使用异步?

  • 实时性:异步通信使得发布者可以持续地发出数据,而不必等待响应,这对于需要快速和高频数据更新的系统(如传感器数据流)非常重要。
  • 低耦合:发布者和订阅者之间的关系松散。发布者不需要知道订阅者是谁,也不需要等待响应,极大地降低了系统的耦合度。
  • 可扩展性:多个订阅者可以同时接收消息,而发布者并不会因为增加订阅者数量而受到性能影响。

 

2. Service: 同步通信

解释:

  • Service 基于 请求/响应模式,是一种同步的通信方式。
  • 客户端节点发送请求,并等待服务端的响应。整个过程是同步的,客户端会被阻塞,直到接收到服务端的响应。
  • 服务端处理完请求后,返回结果给客户端,客户端才继续执行后续操作。

适用场景:

  • 命令控制:当一个节点请求另一个节点执行某个操作(如移动机器人、启动某个动作等),需要等待操作完成并返回结果。例如,移动控制节点向路径规划节点请求“开始导航”,并等待路径规划结果。
  • 查询操作:某些操作需要立刻得到响应,例如查询机器人的电池状态、获取当前位置等。

为什么使用同步?

  • 准确性和确定性:同步通信允许请求方在操作完成后直接得到响应,这对于需要确认任务完成的情况非常重要。例如,启动一个复杂的计算任务时,客户端需要确认操作是否成功才能继续下一步。
  • 请求/响应的简洁性:同步通信使得请求和响应的流程非常清晰,易于理解和实现,尤其是在需要明确处理结果的情况下。
  • 避免竞争条件:同步通信通过等待响应的方式确保了任务的顺序性,有助于防止多个节点同时对某一资源进行操作,减少竞争条件(race condition)和冲突。

2. Service: 同步通信

解释:

  • Service 基于 请求/响应模式,是一种同步的通信方式。
  • 客户端节点发送请求,并等待服务端的响应。整个过程是同步的,客户端会被阻塞,直到接收到服务端的响应。
  • 服务端处理完请求后,返回结果给客户端,客户端才继续执行后续操作。

适用场景:

  • 命令控制:当一个节点请求另一个节点执行某个操作(如移动机器人、启动某个动作等),需要等待操作完成并返回结果。例如,移动控制节点向路径规划节点请求“开始导航”,并等待路径规划结果。
  • 查询操作:某些操作需要立刻得到响应,例如查询机器人的电池状态、获取当前位置等。

为什么使用同步?

  • 准确性和确定性:同步通信允许请求方在操作完成后直接得到响应,这对于需要确认任务完成的情况非常重要。例如,启动一个复杂的计算任务时,客户端需要确认操作是否成功才能继续下一步。
  • 请求/响应的简洁性:同步通信使得请求和响应的流程非常清晰,易于理解和实现,尤其是在需要明确处理结果的情况下。
  • 避免竞争条件:同步通信通过等待响应的方式确保了任务的顺序性,有助于防止多个节点同时对某一资源进行操作,减少竞争条件(race condition)和冲突。

总结为什么要这样设计:

  • 异步通信(Topic):适合实时性强、高频更新、低耦合、数据广播的场景。它允许节点独立运作,互不依赖,可以提高系统的效率和灵活性。例如,传感器持续发布数据,而不会因某个订阅者的延迟而影响整个系统的运行。

  • 同步通信(Service):适合需要明确响应、确保任务顺序执行的场景。它提供了一种严格的请求-响应机制,适用于需要获取精确结果或控制流程的操作。例如,在需要确认一个命令是否成功执行(如启动某个设备、查询状态)时,同步方式能够确保操作的准确性。

两种通信机制的结合,使得 ROS 系统能够在不同场景下高效地进行数据交换和任务调度,同时避免了不必要的阻塞和依赖。

 

消息传递机制

在 ROS 中,消息的传递是通过 发布(Publish)订阅(Subscribe) 的机制完成的。节点之间并不直接“传递”数据,而是通过特定的话题(topic)进行消息的发布与订阅。不同的节点可以发布消息到某个话题,也可以订阅某个话题以接收来自其他节点发布的消息。

1. 发布消息 (Publisher)

一个节点创建了一个 发布者 (Publisher),并将消息发布到一个特定的话题(topic)。例如,在控制机械臂运动时,可能会创建一个发布者,将目标位姿(Pose)消息发布到 "/robot/target_pose" 话题。

# 创建一个Publisher,发布目标位姿
pub = rospy.Publisher('/robot/target_pose', Pose, queue_size=10)

这里,pub 是发布者,它会将消息发布到 /robot/target_pose 这个话题。其他节点可以订阅这个话题,并接收这个消息。

2. 订阅消息 (Subscriber)

其他节点可以通过 订阅者 (Subscriber) 来订阅某个话题,从而接收该话题发布的消息。例如,某个节点可能需要订阅 "/robot/target_pose" 话题,获取机器人目标位姿的信息。

def target_pose_callback(msg):
    rospy.loginfo(f"Received target pose: {msg.position.x}, {msg.position.y}")

# 创建一个订阅者,监听目标位姿话题
pose_sub = rospy.Subscriber('/robot/target_pose', Pose, target_pose_callback)

这里,pose_sub 是订阅者,它订阅了 /robot/target_pose 话题,并将收到的消息传递给 target_pose_callback 函数进行处理。

3. 节点间消息的传递

  • 发布者:节点 A(比如运动控制节点)创建一个发布者 pub,将目标位姿(或其他信息)发布到话题 /robot/target_pose

  • 订阅者:节点 B(例如传感器节点或其他控制节点)创建一个订阅者 pose_sub,它订阅了 /robot/target_pose 话题,接收发布者发送的目标位姿消息。

  • 当节点 A 发布消息时,ROS Master 会将该消息转发给所有订阅了该话题的节点。ROS Master 是 ROS 网络中的中心协调节点,它负责跟踪所有节点和话题的关系。

因此,消息的传递过程可以总结为:

  1. 节点 A 发布消息到某个话题。
  2. ROS Master 将消息路由到所有订阅了这个话题的节点。
  3. 节点 B 接收到该消息,并通过回调函数进行处理。

4. 发布-订阅机制的流程图

        +--------------------+
        |   Publisher Node   |  --> 发布消息
        |    (节点 A)         |
        +--------------------+
                 |
                 |  发布消息到话题 "/robot/target_pose"
                 v
        +--------------------+         +--------------------+
        |    ROS Master      | <-->    |   Subscriber Node  |
        | (消息路由中心)      |         |    (节点 B)         |
        +--------------------+         +--------------------+

ROS 的 发布-订阅机制 实现了节点之间的松耦合,节点 A 和节点 B 通过 ROS Master 协调进行通信,而无需直接相互联系。节点 A 不需要知道哪个节点 B 会订阅它发布的消息,只要它把消息发布到对应的话题即可,ROS Master 会自动将消息传递给所有订阅该话题的节点。

5. 节点间的消息流动

  • 节点 A(Publisher):在运行时,节点 A 会生成一个消息并将其发布到话题(如 /robot/target_pose)。这个消息可以是目标位置、路径规划请求等。

  • 节点 B(Subscriber):节点 B 订阅了话题 /robot/target_pose,所以当节点 A 发布消息时,节点 B 会通过订阅机制接收到这个消息。

  • 回调函数:节点 B 在接收到消息后,会调用预定义的回调函数(如 target_pose_callback),在回调函数中处理消息。

6. 更多消息传递的场景

在实际应用中,ROS 还支持多种消息传递的方式,除了基本的发布-订阅机制外,还包括:

  • 服务(Service):通过请求-响应机制进行同步通信,节点通过服务请求其他节点提供某些服务,并等待响应。比如,在路径规划中,节点可能请求一个路径规划服务,并等待结果。

  • 动作(Action):用于处理长时间运行的任务,节点可以通过动作反馈(如目标状态、进度等)获取任务的执行情况。例如,机械臂的运动过程可以通过动作来执行,并实时反馈执行进度。

7. ROS消息的内容

当你发布一个消息时,你会通过 ROS 消息类型来定义消息的内容。这些消息类型由 ROS 中的标准消息包或自定义消息包提供。例如:

  • geometry_msgs/Pose:表示一个三维空间中的位置和朝向。
  • std_msgs/String:表示一个字符串消息。
  • moveit_commander/MoveGroupAction:MoveIt! 的动作消息类型,通常用于控制机械臂的路径规划和执行。

总结

  • 在 ROS 中,节点通过 发布者 发布消息到特定的话题,其他节点通过 订阅者 订阅该话题并接收消息。
  • ROS Master 是一个中心协调器,它将发布的消息转发给所有订阅该话题的节点。
  • 节点之间并不直接传递消息,而是通过话题的发布和订阅来间接实现通信。

 

标签:订阅,pose,Robot,话题,Operating,消息,ROS,节点
From: https://www.cnblogs.com/zhoushusheng/p/18574916

相关文章

  • Microsoft.Extensions.AI的试用笔记
    Microsoft.Extensions.AI是微软出的一个用来集成调研各种大模型的中间平台,说是为了方便开发人员的开发。但是这个平台貌似都只支持国外的一些大模型平台,国内的都不支持。OpenAI注册了一下,但是可能没有资费,调用不成功。想测试一下能不能接入科大讯飞和阿里的千问,貌似也没有成功......
  • ROS中的VSCode和Terminator的使用
    VisualStudioCode进行ROS程序开发设置workspace在VisualStudioCode中创建一个新的workspace(工作空间),例如rosworkspace。这将作为你的ROS程序开发环境。在workspace配置文件(.vscode/settings.json)中添加以下内容:{"folders":[{"p......
  • kerberos(票据认证)
    kerberos(票据认证)参考链接:详解kerberos认证原理|Hero参考链接:详细讲解kerberos认证全过程、黄金、白银票据-FreeBuf网络安全行业门户Kerberos中有以下一些概念需要了解:kerberos认证有三个角色:客户端(client),服务端(server),DC(域控),DC中有一个密钥分发中心的组件即KDC,它负责处理......
  • ROS2 服务实例:探索与实践
    文章目录一、ROS2服务的基本概念二、创建ROS2服务实例1.定义服务接口2.实现服务服务器3.实现服务客户端三、运行实例ROS2服务实例:探索与实践一、ROS2服务的基本概念ROS2中的服务允许一个节点(服务服务器)接收来自另一个节点(服务客户端)的请求,并返回相应的响应。......
  • ROS2 节点
    文章目录一、ROS2节点概述二、ROS2节点的特性ROS2节点一、ROS2节点概述ROS2节点是ROS2系统中的基本通信单元,它负责执行特定的任务,并与其他节点进行信息交换。每个节点都可以看作是一个独立的进程,拥有自己的生命周期和资源管理。通过节点的协作,ROS2系统能够完成复......
  • 琼脂糖偶联甘露糖的凝胶|Agarose-mannose gel
    琼脂糖偶联甘露糖的凝胶(Agarose-mannosegel)是一种常用于生物化学和分子生物学实验中的凝胶剂。以下是对该凝胶的详细介绍:一、组成与制备琼脂糖偶联甘露糖的凝胶是由琼脂糖(Agarose)与甘露糖(Mannose)混合制备而成的。琼脂糖是一种从红藻或海藻中提取的天然多糖,它具有良好的凝胶......
  • MikroTik RouterOS 系统使用 Container 安装 nginx
    先决条件:安装了RouterOSv7.4beta或更高版本并安装了Container包的RouterOS设备物理访问设备以启用容器模式用于存储的附加硬盘或USB驱动器-格式化为ext3/ext4安装命令启用容器模式/system/device-mode/updatecontainer=yes如果在X86上使用容器,则需要按下重......
  • 人形机器人 —— IsaacROS
    标题建议,例如:英伟达IsaacROS产品体验运行的商品名称产品名称:IsaacROS版本信息及相关配置:运行的过程记录【GPU加速仿真】请描述您在使用IsaacROS进行GPU加速不同任务的具体操作步骤和过程,如之前有使用ROS/ROS2框架的经验,可以做一个对比记录。【AI功能集成】您......
  • 1.1 Beginner Level学习之“了解 ROS 服务和参数”(第七节)
    学习大纲:1.ROS服务ROS服务是一种节点之间的通信方式,允许一个节点发送请求并接收响应。它采用的是同步机制,即一个节点会发送请求,等待另一个节点处理并返回结果。这个机制适合需要及时反馈的情况。rosservice是ROS提供的一个工具,专门用来与服务进行交互。它可以列出、查......
  • 【Thinkphp6】使用框架内置中间件AllowCrossDomain允许跨域请求,当请求header中携带自
    【问题描述】使用框架内置中间件AllowCrossDomain允许跨域请求,当请求header中携带自定义参数时,跨域请求报错,不携带自定义参数时,可正常访问【解决方案】方案一:修改框架内置中间件修改框架内置中间件 AllowCrossDomain,将$header属性的 Access-Control-Allow-Headers ......