首页 > 编程语言 >ROS 编程入门的介绍

ROS 编程入门的介绍

时间:2024-09-23 14:53:50浏览次数:12  
标签:__ 入门 编程 robot rospy ROS my 节点


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

ROS 编程入门的介绍_算法

此命令创建一个名为 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 的文件,并添加以下内容:

ROS 编程入门的介绍_客户端_02

#!/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 节点发布的消息。

ROS 编程入门的介绍_算法_03

添加自定义的 .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

ROS 编程入门的介绍_客户端_04

ROS 编程入门的介绍_服务器_05

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

标签:__,入门,编程,robot,rospy,ROS,my,节点
From: https://blog.51cto.com/u_15641375/12089381

相关文章

  • 【Linux】Shell 编程规范及检查工具推荐
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker |Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......
  • kettle从入门到精通 第八十六课 ETL之kettle kettle调用https接口忽略SSL校验
     1、在使用kettle调用接口的时候不可避免要调用http或者https接口,调用http接口kettle可以正常工作,但是遇到https接口的时候kettle就会提示证书有误,无法正常调用接口,今天咱们一起通过自研插件的方式来解决这个问题。自研插件需要有一定的java基础,git上有比较多的例子,本次不讲解如......
  • IDEA的使用,手把手带你快速入门IDEA
    ??新建包及类的方式1.在src内右键选择Package2.在包内右键选择javaClass运行java类的方式创建模块Eclipse和Idea的对比?IDEA的常用配置设置鼠标滚轮修改字体大小修改类头的文档注释信息内容如下:修改字符集?设置自动编译??设置快捷键?首次使用方法======创......
  • 【Kubernetes基础】Helm工具入门与使用
    前言Helm是Kubernetes包管理工具,类似CentOS的yum包管理工具学习Kubernetes,了解如何通过Helm安装跟管理Kubernetes应用很有必要,下面就来介绍Helm的入门使用。一、Helm基本管理1.1检查Helm版本helmversionhelmversion二、配置Helm仓库Helm可以通过添加仓库源来使......
  • 带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信
    此为QT编程的第十七谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:此次实战主要是模拟一个http协议进行网络通信的一......
  • 带你0到1之QT编程:十八、最简单之TCP协议工作原理及实战编程
    此为QT编程的第十八谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:此次实战主要是实现一个客户端,一个服务端,来了解TC......
  • AI大模型教程 Prompt提示词工程 AI原生应用开发零基础入门到实战【2024超细超全,建议收
    在AGI(通用人工智能)时代,那些既精通AI技术、又具备编程能力和业务洞察力的复合型人才将成为最宝贵的资源。为此,我们提出了‘AI全栈工程师’这一概念,旨在更精准地描述这一复合型人才群体,而非过分夸大其词。学习目标:这门课的目标,就是培养「AI全栈」人才。通过这门课程的学习,我们......
  • Python 类型提示全解析:从入门到精通的必备技巧(如何让Python代码更清晰、错误更少)
    文章目录......
  • Microsoft Edge 五个好用的插件
    ......
  • Spring Boot入门
    SpringBoot是一个用于简化Spring应用程序开发的框架,它提供了快速构建、开箱即用的特性,使得开发人员可以更快速地搭建和部署应用程序。SpringBoot的核心理念是“约定优于配置”,它通过自动化配置和预定义的依赖项,减少了开发人员在项目配置上的工作量。入门SpringBoot的......