前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ROS 编程入门的介绍

ROS 编程入门的介绍

作者头像
芯动大师
发布于 2024-09-18 00:09:44
发布于 2024-09-18 00:09:44
22300
代码可运行
举报
文章被收录于专栏:防止网络攻击防止网络攻击
运行总次数:0
代码可运行

2.1 创建 ROS 功能包

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

2.1.1 使用 ROS 主题

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

创建功能包

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catkin_create_pkg de_ws my_robot rospy roscpp

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

创建发布者节点

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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 的文件,并添加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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 文件中正确配置了依赖项。然后在终端中运行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/catkin_ws
catkin_make

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
roscore
rosrun my_robot talker.py
rosrun my_robot listener.py

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

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

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

创建自定义 .msg 文件

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string content
int32 number

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_message_files(
  FILES
  CustomMessage.msg
)

package.xml 文件中添加依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

最后,重新编译功能包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catkin_make
创建自定义 .srv 文件

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string request
---
string response

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_service_files(
  FILES
  CustomService.srv
)

package.xml 文件中添加依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

重新编译功能包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catkin_make

2.3 使用 ROS 服务

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

2.3.1 使用 ROS actionlib

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

创建动作服务器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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 和自定义消息的依赖。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catkin_make

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rosrun my_robot action_server.py
rosrun my_robot action_client.py

2.4 创建启动文件

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<launch>
  <node pkg="my_robot" type="talker.py" name="talker" output="screen"/>
  <node pkg="my_robot" type="listener.py" name="listener" output="screen"/>
</launch>

运行启动文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
roslaunch my_robot my_robot.launch

2.5 主题、服务和 actionlib 的应用

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

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

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

2.6 总结

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

2.7 问题

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

  • 功能包无法编译:检查依赖是否正确添加。
  • 节点无法通信:确保主题和服务名称一致。
  • 动作服务器和客户端无法连接:检查 actionlib 配置是否正确。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2.ROS基础-ROS通信编程
程序逻辑: 1.头文件 2.ROS节点初始化,前两个参数和main()函数参数一致,最后一个参数定义节点名称。 3.创建节点句柄 比较方便的去管理节点的资源,比如发布者、订阅者、一些话题之类的 4.创建发布者,代码中1000为队列长度 5.设置循环频率,例如10hz,循环100ms 6.开始循环
小飞侠xp
2019/03/15
1.5K0
2.ROS基础-ROS通信编程
【机器人】ROS1工程案例:服务和动作
碎碎念:Hello米娜桑,这里是英国留学中的杨丝儿。我的博客技术点集中在机器人、人工智能可解释性、数学、物理等等,感兴趣地点个关注吧,持续高质量输出中。
杨丝儿
2022/02/28
2830
【机器人】ROS1工程案例:服务和动作
ROS入门篇
ROS是一个松耦合的分布式软件框架。上图中有很多的Node(节点),每个节点是在机器人系统中完成一个具体功能的进程,比方说有的Node是完成图像识别,有的Node是完成一个图像的驱动,它们之间会有一系列图像的传输。节点与节点之间位置也不是固定的,比如上图中有两台电脑,一个A,一个B,有些节点可以在A当中,有些节点可以在B当中,它们之间可以通过一系列的传输方式来完成通讯。每个节点的编程语言也不是固定的,可以使用Python,也可以使用C++。
算法之名
2023/10/16
2.3K0
ROS入门篇
ROS Beginner(长文预警!
参考网站:http://wiki.ros.org/cn/ROS/Tutorials
From Zero
2021/12/07
9680
ROS暑期学校分享-2023
网络编程和单机编程是两种不同的编程方式,它们的主要区别在于其应用场景和实现技术上。
zhangrelay
2023/08/02
2860
ROS暑期学校分享-2023
【C++】ROS:ROS1环境配置与基础示例
官网:https://www.ros.org/ 中文wiki:http://wiki.ros.org/cn ubuntu安装ros:http://wiki.ros.org/cn/melodic/Installation/Ubuntu
DevFrank
2024/07/24
1.1K0
【C++】ROS:ROS1环境配置与基础示例
ROS学习记录⑥:动态配置参数
动态配置参数 1. 新建功能包 2. 创建cfg文件 3. 节点文件 4. 启动配置 1. 新建功能包 cd catkin_ws/src catkin_create_pkg pid roscpp rospy rosmsg std_msgs dynamic_reconfigure 2. 创建cfg文件 新建一个cfg文件夹,在里面新建一个.cfg文件 mkdir cfg cd cfg touch PID.cfg 动态调参的核心API: gen.add(name,type, level,description
小黑鸭
2020/11/24
1.1K0
ROS专题----actionlib简明笔记
除了下面列出的教程之外,还为actionlib包创建了两套教程。您可以通过浏览这些教程roscd -ing到actionlib_tutorials或turtle_actionlib包,即
zhangrelay
2019/01/23
1.9K0
(二)ROS系统架构及概念 ROS Architecture and Concepts 以Kinetic为主更新 附课件PPT
第2章 ROS系统架构及概念 ROS Architecture and Concepts
zhangrelay
2019/01/23
1.4K0
使用RealSense D455的空间识别操作myCobot
先进技术部门正在研究多模态强化学习,包括相机图像和触觉传感器。除其他外,要实现所谓的Sim2Real,其中模拟器中的强化学习结果也在实际机器上运行,必须协作操作真实机器的机械臂和相机。因此,在这种情况下,我们使用ROS测试了链接的6轴机械臂myCobot(由大象机器人制造)和深度摄像头RealSense D455(由英特尔制造),流程和结果将在下面详细描述。
大象机器人
2023/04/12
2.3K0
使用RealSense D455的空间识别操作myCobot
在Ubuntu 18.04 LTS入门ROS Melodic版机器人操作系统
在ROS Melodic中推荐使用catkin_tool:
zhangrelay
2019/01/23
7360
Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子
创建完成以后,在目录my_node_demo下多出两个文件(package.xml ,CMakeLists.txt)和两个文件夹(src, include)。
Autooooooo
2020/11/09
1K0
Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子
ROS Topic
创建工作空间、功能包 创建工作空接,详见我的另一篇文章 CmakeList.txt CmakeList.txt 定义一个包的编译指令 cmake不会找package.xml文件,依据cmakelists.txt文件编译需要清晰指出头文件和库文件的指向。 catkin_package(CATKIN_DEPENDS roscpp)声明依赖本包同时需要的其他ros包 find_package(catkin REQUIRED COMPONENTS)声明编译本包所需要其他ros包 add_executable声明编
小飞侠xp
2019/09/30
3.4K0
ROS Topic
ROS通信架构(下)
队长与爱人相互七十年不能共舞,蚁人与女儿分隔五年未能相见,钢铁侠邂逅父亲期盼新生,雷神遇见母亲不忍分别。时间会给爱情设置衰老的考验,给生命带来变化的乐趣,会让未尽千言凝成一个拥抱,让遗憾万般聚成一场话别。天神拥有肉身,超能沦为凡胎,你是一千四百万分之一的胜利,是三千遍仍未尽的爱。——《复仇者联盟4》
小飞侠xp
2019/05/14
1.2K0
ROS通信架构(下)
【机器人】ROS1工程案例:自定义消息类型
作者:杨丝儿 座右铭:始于兴趣,源于热爱,成于投入。 介绍:爱丁堡大学 人工智能专业。技术兴趣点集中在机器人、人工智能可解释性、数学、物理等等。 个人博客:discover304.top
杨丝儿
2022/03/01
3880
【机器人】ROS1工程案例:自定义消息类型
机器人操作系统二(ROS2)- 修行 Taoism
ROS 2项目的目标是继承ROS 1的优点并改进不合适的部分。The goal of the ROS 2 project is to leverage what is great about ROS 1 and improve what isn’t.
zhangrelay
2019/08/29
3.8K0
机器人操作系统二(ROS2)- 修行 Taoism
ROS1云课→31欢乐卷假期
何时使用SMACH? 当希望机器人执行一些复杂的计划时,SMACH非常有用,其中可以明确描述所有可能的状态和状态转换。这基本上消除了将不同模块集成在一起的黑客行为,使移动机器人操作器等系统做一些有趣的事情。 快速原型:基于Python的简单SMACH语法使快速原型化状态机和开始运行状态机变得容易。 复杂状态机:SMACH允许设计、维护和调试大型、复杂的分层状态机。可以在这里找到一个复杂的分层状态机示例。 内省:SMACH在状态机、状态转换、数据流等方面为您提供了全面的内省。有关更多详细信息,请参阅SMACH_viewer。
zhangrelay
2022/10/04
1.3K0
ROS1云课→31欢乐卷假期
美美的圣诞树画出来-CoCube
2022年圣诞节到来啦,很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意,展现你与众不同的精彩!参与本次投稿即可获得【话题达人】勋章+【圣诞快乐】定制勋章(1年1次,错过要等下一年喔)! 你可以从以下几个方面着手(不强制),或者根据自己对话题主题的理解创作,参考如下:
zhangrelay
2023/01/01
5220
美美的圣诞树画出来-CoCube
ROS 发布消息和订阅消息 for Python
创建名字为 mypackage 的程序包,并且依赖 std_msgs rospy roscpp 三个库
Autooooooo
2020/11/09
1.1K0
ROS 发布消息和订阅消息 for Python
【ROS】cv_bridge使用与图像转换示例
cv_bridge是一个用于在ROS(Robot Operating System)和OpenCV之间进行图像转换的库。它提供了方便的接口和功能,用于在ROS中将ROS图像消息(sensor_msgs/Image)与OpenCV图像格式之间进行相互转换。
DevFrank
2024/07/24
8280
相关推荐
2.ROS基础-ROS通信编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验