ROS 编程入门的介绍

news2025/2/23 6:56:15

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 配置是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

以root用户登陆ubuntu的桌面环境

前言 在学习Linux的时候&#xff0c;经常都需要使用sudo权限来对配置文件进行修改&#xff0c;常用的方法就是用vim编辑器在命令行界面进行修改&#xff0c;比如sudo vim /etc/profile&#xff0c;但我觉得每次都用命令行挺麻烦的&#xff0c;于是&#xff01;&#x1f913;我…

【零散技术】Odoo17通过Controller下载PDF

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo作为一款开源ERP&#xff0c;拥有极佳的拓展性&#xff0c;Odoo的Controller框架也让它具备了作为微信小程序后端的能力&#xff0c;那么就存在 需要通过小程序来下载PDF的业务情况。 目录 1.功能代码 1.1 manifest 设置 …

neo4j 图数据库使用教程

文章目录 neo4j 图数据库使用教程1&#xff09; 下载2&#xff09;安装3&#xff09; 创建数据4&#xff09;查询数据5&#xff09; 更新数据6&#xff09; 建立索引 neo4j 图数据库使用教程 1&#xff09; 下载 neo4j下载地址 http://dist.neo4j.org/neo4j-community-3.5.2…

【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数|2005

本文涉及知识点 C前后缀分解 LeetCode1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!

通过前面几期的学习&#xff0c;同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外&#xff0c;还具有丰富的扩展功能&#xff0c;比如&#xff1a;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期…

【时时三省】(C语言基础)指针进阶 例题8

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 第一个打印2 a6不管它是多大 前面是&#xff1d;s 都得变成两个字节 所以打印2 第二个打印5 sizeof里面的表达式是不参与运算的 所以打印5 上面所有例题总结…

从边缘设备到云端平台,合宙DTURTU打造无缝物联网解决方案

如今&#xff0c;物联网&#xff08;IoT&#xff09;技术飞速发展&#xff0c;万物互联的时代已然到来&#xff0c;那么&#xff0c;高效、稳定地连接边缘设备与云端平台&#xff0c;实现数据的实时采集、传输与处理&#xff0c;就成为了推动物联网应用落地的关键。 DTU&#…

硬件工程师笔试面试——无线通讯模块

目录 15、无线通讯模块 15.1 基础 无线通讯模块实物图 15.1.1 概念 15.1.2 常见的无线通讯模块及其特点 15.1.3 无线通讯模块参数 15.1.4 无线通讯模块工作原理 15.2 相关问题 15.2.1 如何根据项目需求选择合适的无线通讯模块? 15.2.2 无线通讯模块的安全性如何,如…

合宙Air201模组LuatOS:点点鼠标就搞定的FOTA远程升级,你知道吗?

你是不是也经常遇到小伙伴吐槽&#xff1a;开发是个苦差事&#xff01;做项目倒还好&#xff0c;就怕遇到项目升级&#xff0c;那简直让人头大。。。 如果你也有这种困惑&#xff0c;就多了解一下合宙的开发工具&#xff0c;简单实用又高效&#xff0c;甚至只需点点鼠标&#…

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、ChangeStar模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113&#xff0c;onnxruntime-gpu1.12.0 likyoo变化检测源码&#xff1a;https://github.c…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题四

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

动手学深度学习(四)卷积神经网络-下

全连接层存在的问题&#xff1a;参数过大&#xff0c;计算成本过高。 一、网络中的网络&#xff08;NiN&#xff09; 1、NiN块 ①NiN块的结构 NiN串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。这种由卷积层和“全连接”层构成的小网络就是NiN块。 &#…

线程池夺命十四问

目录 一&#xff1a;什么是线程池 二&#xff1a;线程池有什么好处 三&#xff1a;如何创建一个线程池 Executors ThreadPoolExecutors 四&#xff1a;创建一个线程池为什么不推荐使用Executors 五&#xff1a;如何设置线程池的大小 六&#xff1a;线程池有哪些参数 …

(CS231n课程笔记)深度学习之损失函数详解(SVM loss,Softmax,熵,交叉熵,KL散度)

学完了线性分类&#xff0c;我们要开始对预测结果进行评估&#xff0c;进而优化权重w&#xff0c;提高预测精度&#xff0c;这就要用到损失函数。 损失函数&#xff08;Loss Function&#xff09;是机器学习模型中的一个关键概念&#xff0c;用于衡量模型的预测结果与真实标签…

【数据结构篇】~链表算法题3(环形链表)

链表算法题3&#xff08;环形链表&#xff09; 环形链表的证明1. 环形链表I​1) 思路2&#xff09;代码实现 2. 环形链表II​1) 思路11) 思路22&#xff09;代码实现 环形链表的证明 1. 环形链表I​ https://leetcode.cn/problems/linked-list-cycle/description/ 1) 思路 判断…

拥控算法BBR入门1

拥塞控制算法只与本地有关 一个TCP会话使用的拥塞控制算法只与本地有关。 两个TCP系统可以在TCP会话的两端使用不同的拥塞控制算法 Bottleneck Bandwidth and Round-trip time Bottleneck 瓶颈 BBR models the network to send as fast as the available bandwidth and is 2…

Qt容器类控件——QGroupBox和QTabWidget

文章目录 QGroupBox又来点餐QTabWidget使用演示 QGroupBox 容器类控件即里面可以容纳其他的控件 QGroupBox叫做分组框&#xff0c;可以把其他控件放在里面作为一组 QGroupBox的存在&#xff0c;只是为了让界面更好看一点&#xff0c;并不实现实质性的功能。 当界面较复杂的时候…