ROS 1 入门介绍

部署运行你感兴趣的模型镜像

一、ROS 1 是什么

ROS(Robot Operating System)即机器人操作系统,它并非传统意义上像 Windows、Linux 那样的操作系统,而是一个用于构建机器人应用程序的灵活的软件框架。ROS 1 作为 ROS 的早期版本,为机器人开发者提供了大量实用的工具、库和约定,极大地简化了机器人系统的开发过程。

可以把 ROS 1 想象成一个庞大的机器人开发 “工具箱”,在这个工具箱里,有各种各样的 “工具” 来帮助开发者完成从底层硬件控制到高层算法实现等一系列复杂的任务。它提供了硬件抽象、设备驱动、函数库、消息传递、服务调用等功能,让开发者能够将精力集中在机器人的具体应用逻辑上,而不必过于关注底层硬件细节以及复杂的系统集成问题。

二、ROS 1 的核心概念

(一)节点(Node)

节点是 ROS 1 中执行具体任务的进程。在一个机器人系统中,可能会有多个不同功能的节点,比如负责读取摄像头图像数据的节点、进行路径规划的节点、控制电机运动的节点等。每个节点都相对独立,它们可以用不同的编程语言(如 C++、Python)编写,并且可以在不同的计算机上运行。节点之间通过 ROS 1 提供的通信机制进行交互,这种松耦合的设计方式使得系统具有很强的可扩展性和灵活性。例如,在一个室内服务机器人系统中,摄像头节点持续采集图像数据,然后将这些数据通过 ROS 1 的通信机制发送给图像识别节点,图像识别节点对图像进行分析处理,识别出房间中的物体和人员等信息,再将这些信息发送给导航节点,导航节点根据这些信息规划出机器人的运动路径,并将路径信息发送给电机控制节点,从而控制机器人在室内移动。

(二)话题(Topic)

话题是 ROS 1 中节点之间进行通信的一种方式,采用发布 / 订阅模型。节点可以发布消息到某个话题上,同时也可以订阅感兴趣的话题来接收消息。不同的节点通过话题进行解耦,发布者和订阅者不需要知道彼此的具体信息,只需要关注话题名称和消息格式。例如,在上述室内服务机器人系统中,摄像头节点可以将采集到的图像数据封装成特定格式的消息,发布到名为 “/camera/image_raw” 的话题上。而图像识别节点则订阅 “/camera/image_raw” 这个话题,当有新的图像数据发布到该话题时,图像识别节点就能接收到这些数据并进行处理。一个话题可以有多个发布者和多个订阅者,这使得不同功能的节点能够方便地进行数据共享和交互。

(三)服务(Service)

服务是另一种节点间的通信方式,与话题的发布 / 订阅模型不同,它采用请求 / 响应模型。一个节点作为服务客户端向另一个节点(服务端)发送服务请求,服务端接收到请求后进行相应的处理,并将处理结果返回给服务客户端。例如,在机器人系统中,如果需要获取某个传感器的校准参数,就可以通过服务来实现。某个节点作为服务客户端向负责传感器校准的节点(服务端)发送获取校准参数的请求,服务端接收到请求后,查询并返回相应的校准参数给服务客户端。服务通常用于实现一些一次性的、有明确请求和响应的交互场景,比如启动或停止某个设备、获取特定的配置信息等。

(四)消息(Message)

消息是节点之间传递数据的载体,它定义了数据的结构和类型。在 ROS 1 中,每个话题或服务都有与之对应的消息类型。消息类型可以是 ROS 1 内置的基本类型(如整数、浮点数、布尔值等),也可以是用户自定义的复杂类型。例如,对于 “/camera/image_raw” 话题,其消息类型可能是 ROS 1 中定义的用于表示图像数据的特定消息类型,该消息类型包含了图像的宽度、高度、像素数据等信息。节点在发布或接收消息时,必须确保使用的消息类型一致,这样才能正确地解析和处理数据。

(五)包(Package)

包是 ROS 1 中组织代码、配置文件、消息定义、服务定义等资源的基本单元。一个包通常包含了实现某个特定功能所需的所有相关文件。例如,一个用于机器人导航的包可能包含导航算法的源代码、配置文件(用于设置导航参数)、消息定义(如表示机器人当前位置和目标位置的消息类型)以及服务定义(如用于设置导航目标的服务)等。通过将相关资源组织成包,方便了代码的管理、复用和分发。在开发 ROS 1 项目时,可以创建多个包,每个包专注于实现一个特定的功能模块,然后通过 ROS 1 的依赖管理机制将这些包组合起来,构建出完整的机器人应用系统。

三、ROS 1 的安装

(一)系统要求

ROS 1 最适合运行在 Linux 系统上,尤其是 Ubuntu 操作系统。建议使用 Ubuntu 的长期支持(LTS)版本,如 Ubuntu 20.04 LTS,这样可以获得更稳定的系统环境和更长期的软件支持。

(二)安装步骤

  1. 配置软件源:打开终端,编辑软件源列表文件 “/etc/apt/sources.list”,添加 ROS 1 的软件源。例如,对于 Ubuntu 20.04 系统,添加以下源:
 

deb http://packages.ros.org/ros/ubuntu focal main

  1. 设置密钥:运行以下命令添加 ROS 1 的软件源密钥:
 

sudo apt install curl # 如果未安装curl工具,先安装

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

  1. 更新软件包列表:执行以下命令更新系统的软件包列表,以便获取 ROS 1 的安装信息:
 

sudo apt update

  1. 安装 ROS 1:ROS 1 有多个版本和不同的安装套餐,对于初学者,建议安装完整的桌面版,包含 ROS 1 的核心功能、常用工具以及可视化界面等。运行以下命令进行安装:
 

sudo apt install ros-noetic-desktop-full

这里 “noetic” 是 ROS 1 的一个发行版本代号,在安装时请根据实际情况选择合适的版本代号。安装过程可能需要一些时间,期间会提示输入用户密码并确认安装一些依赖软件包。

5. 初始化 rosdep:rosdep 是 ROS 1 中用于管理软件包依赖的工具。安装完成 ROS 1 后,需要初始化 rosdep。运行以下命令:

 

sudo rosdep init

rosdep update

  1. 配置环境变量:为了在终端中方便地使用 ROS 1 的命令,需要将 ROS 1 的环境变量添加到用户的 bash 配置文件中。打开 “~/.bashrc” 文件,在文件末尾添加以下行:
 

source /opt/ros/noetic/setup.bash

然后执行以下命令使配置生效:

 

source ~/.bashrc

至此,ROS 1 已经成功安装在系统中,可以开始使用 ROS 1 进行机器人项目开发了。

四、ROS 1 开发示例

(一)创建工作空间和包

  1. 创建工作空间:工作空间是 ROS 1 项目开发的基础,用于存放多个包以及编译生成的文件。在终端中执行以下命令创建一个名为 “catkin_ws” 的工作空间:
 

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws

catkin_make

其中,“mkdir -p” 命令用于创建多层目录结构,“catkin_make” 命令用于初始化工作空间并编译其中的包(此时工作空间中的包为空)。

2. 创建包:在工作空间的 “src” 目录下创建一个新的包,包名为 “beginner_tutorials”,该包依赖于 “rospy”(ROS 1 的 Python 客户端库)和 “std_msgs”(ROS 1 的标准消息库)。执行以下命令:

 

cd ~/catkin_ws/src

catkin_create_pkg beginner_tutorials rospy std_msgs

(二)编写发布者节点

  1. 创建脚本文件:进入 “beginner_tutorials” 包的 “scripts” 目录(如果该目录不存在,手动创建),创建一个名为 “talker.py” 的 Python 脚本文件,用于实现发布者节点功能。
 

cd ~/catkin_ws/src/beginner_tutorials

mkdir scripts

cd scripts

touch talker.py

chmod +x talker.py # 添加可执行权限

  1. 编写脚本内容:使用文本编辑器打开 “talker.py” 文件,编写以下代码:
 

#!/usr/bin/env python3

import rospy

from std_msgs.msg import String

def talker():

pub = rospy.Publisher('chatter', String, queue_size=10)

rospy.init_node('talker', anonymous=True)

rate = rospy.Rate(10) # 10Hz

while not rospy.is_shutdown():

hello_str = "hello world %s" % rospy.get_time()

rospy.loginfo(hello_str)

pub.publish(hello_str)

rate.sleep()

if __name__ == '__main__':

try:

talker()

except rospy.ROSInterruptException:

pass

代码解释:

  • 首先导入必要的 ROS 1 Python 库 “rospy” 和标准消息类型 “String”。
  • 创建一个发布者对象 “pub”,它将消息发布到名为 “chatter” 的话题上,消息类型为 “String”,队列大小为 10(表示如果发布速度过快,最多缓存 10 条消息)。
  • 使用 “rospy.init_node” 初始化节点,节点名为 “talker”,“anonymous=True” 表示为节点生成一个唯一的名称,以避免节点名称冲突。
  • 设置发布频率为 10Hz,即每秒发布 10 次消息。
  • 在循环中,构造要发布的消息内容(包含当前时间),使用 “rospy.loginfo” 记录日志信息,并通过 “pub.publish” 发布消息,最后使用 “rate.sleep” 使程序按照设定的频率休眠。

(三)编写订阅者节点

  1. 创建脚本文件:在 “scripts” 目录下创建一个名为 “listener.py” 的 Python 脚本文件,用于实现订阅者节点功能。
 

touch listener.py

chmod +x listener.py # 添加可执行权限

  1. 编写脚本内容:使用文本编辑器打开 “listener.py” 文件,编写以下代码:
 

#!/usr/bin/env python3

import rospy

from std_msgs.msg import String

def callback(data):

rospy.loginfo(rospy.get_caller_id() + " I heard %s", data.data)

def listener():

rospy.init_node('listener', anonymous=True)

rospy.Subscriber("chatter", String, callback)

rospy.spin()

if __name__ == '__main__':

listener()

代码解释:

  • 同样导入 “rospy” 和 “String” 消息类型。
  • 定义一个回调函数 “callback”,当订阅到 “chatter” 话题上有新消息时,该函数被调用,它将接收到的消息内容打印出来。
  • 使用 “rospy.init_node” 初始化节点,节点名为 “listener”。
  • 创建一个订阅者对象,订阅名为 “chatter” 的话题,消息类型为 “String”,当有新消息到达时,调用 “callback” 函数进行处理。
  • 使用 “rospy.spin ()” 使节点保持运行状态,等待消息的到来。

(四)编译和运行

  1. 编译包:回到工作空间目录 “~/catkin_ws”,执行以下命令编译 “beginner_tutorials” 包:
 

catkin_make

  1. 运行节点
 

roscore

 

cd ~/catkin_ws

source devel/setup.bash

rosrun beginner_tutorials talker.py

 

cd ~/catkin_ws

source devel/setup.bash

rosrun beginner_tutorials listener.py

    • 打开一个新的终端,启动 ROS 1 的核心服务 “roscore”:
    • 再打开一个新终端,进入工作空间并设置环境变量,然后运行发布者节点:
    • 接着打开第三个新终端,同样进入工作空间设置环境变量,运行订阅者节点:

此时,你可以在订阅者节点的终端中看到接收到的发布者节点发送的消息,例如 “hello world 1677777777.777777”(时间戳会根据实际情况变化)。

通过这个简单的示例,你已经初步了解了如何在 ROS 1 中创建工作空间和包、编写发布者和订阅者节点以及编译和运行这些节点,从而实现节点之间的通信。

五、常用工具介绍

(一)rostopic

rostopic 是 ROS 1 中用于查看和操作话题的命令行工具。例如:

  • 查看话题列表:使用 “rostopic list” 命令可以列出当前 ROS 1 系统中所有正在发布的话题。
  • 查看话题消息:使用 “rostopic echo <topic_name>” 命令可以查看指定话题上发布的消息内容,例如 “rostopic echo /chatter” 可以实时显示 “/chatter” 话题上的消息。
  • 发布消息到话题:使用 “rostopic pub <topic_name> <message_type> <message_content>” 命令可以向指定话题发布消息,例如 “rostopic pub /chatter std_msgs/String "hello from rostopic"” 可以向 “/chatter” 话题发布一条字符串消息 “hello from rostopic”。

(二)rosservice

rosservice 用于调用 ROS 1 中的服务。例如:

  • 查看服务列表:使用 “rosservice list” 命令可以列出当前系统中所有可用的服务。
  • 查看服务信息:使用 “rosservice info <service_name>” 命令可以查看指定服务的详细信息,包括服务的请求和响应消息类型等。
  • 调用服务:使用 “rosservice call <service_name> <request_content>” 命令可以调用指定服务,并传入请求内容,例如 “rosservice call /service_name std_srvs/Trigger” 可以调用名为 “/service_name” 的服务,服务类型为 “std_srvs/Trigger”(这是一个简单的触发类型服务)。

(三)rqt

rqt 是 ROS 1 的一个图形用户界面工具集,包含了多个实用的工具,用于可视化和监控 ROS 1 系统。例如:

  • rqt_graph:可以通过 “rosrun rqt_graph rqt_graph” 命令运行,它能够以图形化的方式展示 ROS 1 系统中节点之间的通信关系,通过节点和连线清晰地显示话题发布和订阅、服务调用等连接情况,帮助开发者直观地理解系统架构。
  • rqt_plot:使用 “rosrun rqt_plot rqt_plot” 命令启动,它可以实时绘制话题上数据的变化曲线,比如可以绘制机器人某个传感器数据随时间的变化曲线,方便观察数据趋势和进行调试。

六、总结与展望

通过本文的介绍,你已经对 ROS 1 有了一个初步的了解,包括 ROS 1 的基本概念、安装方法、核心组件以及简单的开发示例和常用工具。ROS 1 为机器人开发者提供了一个强大而灵活的开发平台,能够大大加速机器人项目的开发进程。

在后续的学习中,你可以进一步深入研究 ROS 1 的各种功能和应用场景,例如学习如何编写更复杂的节点逻辑、使用 ROS 1 的参数服务器来管理配置参数、利用 ROS 1 的导航功能包实现机器人自主导航等。同时,积极参与 ROS 1 的社区,与其他开发者交流经验、分享代码,从开源项目中学习优秀的实践经验,不断提升自己在机器人开发领域的技能。随着技术的不断发展,ROS 2 也逐渐成为热门,在掌握 ROS 1 的基础上,了解 ROS 2 的新特性和优势,并探索如何在实际项目中结合使用 ROS 1 和 ROS 2,将为你的机器人开发之路带来更多的可能性。

希望本文能成为你踏入 ROS 1 世界的一把钥匙,开启你在机器人开发领域的精彩旅程。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值