ROS 编程入门的介绍

简介: 2.1 创建 ROS 功能包ROS(Robot Operating System)是一种开源的机器人软件框架,广泛用于机器人开发中。通过使用 ROS,开发者可以轻松创建和管理机器人应用程序。在本节中,我们将介绍如何创建一个 ROS 功能包并实现一些基本功能。2.1.1 使用 ROS 主题ROS 主题(Topic)是一种发布/订阅机制,允许节点之间进行通信。每个节点可以发布主题消息或订阅主题消息来获取数据。以下是如何使用 ROS 主题的步骤:创建功能包首先,我们需要创建一个新的 ROS 功能包。在终端中运行以下命令:catkin_create_pkg de_ws my_r

2.1 创建 ROS 功能包

ROS(Robot Operating System)是一种开源的机器人软件框架,广泛用于机器人开发中。通过使用 ROS,开发者可以轻松创建和管理机器人应用程序。在本节中,我们将介绍如何创建一个 ROS 功能包并实现一些基本功能。

2.1.1 使用 ROS 主题

ROS 主题(Topic)是一种发布/订阅机制,允许节点之间进行通信。每个节点可以发布主题消息或订阅主题消息来获取数据。以下是如何使用 ROS 主题的步骤:

创建功能包

首先,我们需要创建一个新的 ROS 功能包。在终端中运行以下命令:

catkin_create_pkg de_ws my_robot rospy roscpp

此命令创建一个名为 my_robot 的功能包,并声明了对 std_msgsrospyroscpp 的依赖。

创建发布者节点

接下来,我们在功能包中创建一个发布者节点。新建一个名为 talker.py 的文件,并添加以下内容:

#!/usr/bin/env python
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

此代码定义了一个发布者节点 talker,它每秒钟发布一条 "hello world" 消息到主题 chatter

2.1.2 创建 ROS 节点

ROS 节点是 ROS 系统中的基本执行单元。每个节点可以执行一个任务,如传感器数据处理、运动控制等。下面我们创建一个订阅者节点来接收 talker 节点发布的消息。

创建订阅者节点

新建一个名为 listener.py 的文件,并添加以下内容:

#!/usr/bin/env python
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()

此代码定义了一个订阅者节点 listener,它接收主题 chatter 上的消息并打印出来。

2.1.3 编译节点

在我们运行节点之前,需要编译功能包。确保在功能包的 CMakeLists.txtpackage.xml 文件中正确配置了依赖项。然后在终端中运行以下命令:

cd ~/catkin_ws
catkin_make

编译完成后,可以运行节点:

roscore
rosrun my_robot talker.py
rosrun my_robot listener.py

此时,你应该可以看到 listener 节点打印出 talker 节点发布的消息。

添加自定义的 .msg 文件和 .srv 文件

在 ROS 中,自定义消息类型和服务类型是很常见的需求。我们可以定义自己的消息和服务文件来满足特定的应用需求。

创建自定义 .msg 文件

首先,在 my_robot 功能包的 msg 目录下创建一个新的消息文件,例如 CustomMessage.msg

string content
int32 number

然后,在 CMakeLists.txt 文件中添加以下内容:

add_message_files(
  FILES
  CustomMessage.msg
)

package.xml 文件中添加依赖:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

最后,重新编译功能包:

catkin_make

创建自定义 .srv 文件

类似地,我们可以在 srv 目录下创建一个新的服务文件,例如 CustomService.srv

string request
---
string response

然后,在 CMakeLists.txt 文件中添加以下内容:

add_service_files(
  FILES
  CustomService.srv
)

package.xml 文件中添加依赖:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

重新编译功能包:

catkin_make

2.3 使用 ROS 服务

ROS 服务是一种请求/响应机制,允许节点之间进行同步通信。

2.3.1 使用 ROS actionlib

actionlib 是 ROS 中用于处理长时间运行任务的库。它提供了一种客户端-服务器架构,允许客户端请求服务器执行某些任务,并在任务完成时收到通知。

创建动作服务器

my_robot 功能包中创建一个新的 Python 文件 action_server.py

#!/usr/bin/env python
import rospy
import actionlib
from my_robot.msg import CustomAction, CustomActionFeedback, CustomActionResult
class CustomActionServer(object):
    _feedback = CustomActionFeedback()
    _result = CustomActionResult()
    def __init__(self):
        self._as = actionlib.SimpleActionServer("custom_action", CustomAction, self.execute_cb, False)
        self._as.start()
    def execute_cb(self, goal):
        rospy.loginfo('Executing goal: %s', goal)
        success = True
        for i in range(1, goal.order):
            if self._as.is_preempt_requested():
                rospy.loginfo('Goal preempted')
                self._as.set_preempted()
                success = False
                break
            self._feedback.sequence = i
            self._as.publish_feedback(self._feedback)
            rospy.sleep(1.0)
        if success:
            self._result.sequence = goal.order
            self._as.set_succeeded(self._result)
if __name__ == '__main__':
    rospy.init_node('custom_action_server')
    server = CustomActionServer()
    rospy.spin()
创建动作客户端
在 my_robot 功能包中创建一个新的 Python 文件 action_client.py:
#!/usr/bin/env python
import rospy
import actionlib
from my_robot.msg import CustomAction, CustomActionGoal
def feedback_cb(feedback):
    rospy.loginfo('Feedback: %s', feedback)
if __name__ == '__main__':
    rospy.init_node('custom_action_client')
    client = actionlib.SimpleActionClient('custom_action', CustomAction)
    client.wait_for_server()
    goal = CustomActionGoal()
    goal.order = 10
    client.send_goal(goal, feedback_cb=feedback_cb)
    client.wait_for_result()
    rospy.loginfo('Result: %s', client.get_result())

2.3.2 编译 ROS 动作服务器和客户端

在编译功能包之前,确保在 CMakeLists.txtpackage.xml 中添加了对 actionlib 和自定义消息的依赖。

然后在终端中运行以下命令:

catkin_make

启动动作服务器和客户端:

rosrun my_robot action_server.py
rosrun my_robot action_client.py

2.4 创建启动文件

启动文件用于同时启动多个 ROS 节点,简化了复杂系统的启动过程。

创建一个新的启动文件 my_robot.launch

<launch>
  <node pkg="my_robot" type="talker.py" name="talker" output="screen"/>
  <node pkg="my_robot" type="listener.py" name="listener" output="screen"/>
</launch>

运行启动文件:

roslaunch my_robot my_robot.launch

2.5 主题、服务和 actionlib 的应用

在实际应用中,主题、服务和 actionlib 可以结合使用,实现复杂的机器人行为。例如,一个机器人可以通过主题获取传感器数据,通过服务进行路径规划,通过 actionlib 执行长时间的导航任务。

以下是一个综合应用示例:

  • 主题用于发布传感器数据。
  • 服务用于路径规划。
  • actionlib 用于执行导航任务。

2.6 总结

本文介绍了如何创建 ROS 功能包,并使用主题、服务和 actionlib 实现机器人功能。通过这些基础知识,您可以构建复杂的机器人应用程序。

2.7 问题

在学习和使用 ROS 的过程中,可能会遇到以下问题:

  • 功能包无法编译:检查依赖是否正确添加。
  • 节点无法通信:确保主题和服务名称一致。
  • 动作服务器和客户端无法连接:检查 actionlib 配置是否正确。
相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
164 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
978 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
735 9