首页 > 编程语言 >ROS1 入门 —— 编写自定义节点Node

ROS1 入门 —— 编写自定义节点Node

时间:2024-09-01 20:22:13浏览次数:8  
标签:Node catkin beginner 自定义 py listener rospy ROS ROS1

引言

机器人操作系统(Robot Operating System, ROS)是一个开源的元操作系统,用于开发机器人的软件。它并不是一个真正的操作系统,而是一套软件框架和服务,设计用来帮助开发者构建复杂的机器人系统。ROS提供了硬件抽象、设备驱动、库、消息传递和工具包等,使得机器人软件的开发变得更为简单。

本教程将指导你如何在ROS1环境中编写一个简单的自定义节点。我们将从新建工作空间开始,逐步介绍如何创建一个新的ROS包,并在此基础上实现一个基本的节点,该节点能够实现发布和订阅信息的功能。

创建新的ROS工作空间

创建工作空间目录src

我们要在文件系统中创建一个新的目录来作为我们的工作空间。工作空间通常包含三个子目录:src用于存放源代码,build用于存放编译过程中生成的中间文件,devel用于存放编译后的可执行文件和其他产品,build目录和devel目录是在工作空间编译之后自动生成的。下面先新建终端,并创建一个新的工作空间目录:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

然后初始化新的catkin工作空间。这可以通过运行catkin_init_workspace命令完成,在终端输入:

catkin_init_workspace

之后我们可以新建一个ROS功能包,在终端输入以下指令:

catkin_create_pkg beginner_tutorials rospy roscpp std_msgs

beginner_tutorials 是功能包的名称,rospy roscpp std_msgs则是这个功能包的基础依赖。至此我们的工作空间就创建完成了,后面我们可以编写具体节点实现指定功能。

编写自定义节点

  1. 创建发布者节点:在beginner_tutorials包目录下创建一个名为scripts的文件夹,再在该目录下创建一个名为talker.py的Python脚本,在终端输入:
cd ~/catkin_ws/scripts
gedit talker.py
  1. 在打开的文本编辑器里面,输入以下代码:
#!/usr/bin/env python
#encoding=utf-8

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(1)  # 1 Hz
    count = 0
    while not rospy.is_shutdown():
        hello_str = "hello world %d" % count
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()
        count += 1

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass
  1. 为了使这个脚本能够直接运行,我们可以给它添加执行权限,在终端输入以下指令:
chmod +x scripts/talker.py
  1. 对于订阅者节点,我们也是同样的操作。在scripts文件目录下创建一个名为listener.py的Python脚本,在终端输入:
gedit listener.py
  1. 然后在打开的文本编辑器里面添加以下代码:
#!/usr/bin/env python
#encoding=utf-8

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo("I heard %s", data.data)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("chatter", String, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()
  1. 同样的,我们给这个python脚本赋权,在终端输入:
chmod +x scripts/listener.py
  1. 这里提一下,python脚本也可以放在src文件目录下,这个没有固定规定,只是说按照大多数人的习惯,我们将脚本放置在了scripts文件目录下。

编译工作空间并测试

  1. 编译工作空间,在终端输入:
cd ~/catkin_ws
catkin_make
  1. 设置环境变量,在终端输入:
source devel/setup.bash

如果我们想要更加方便的话,可以在主目录下的.bashrc文件里面最后一行添加并保存,这样我们每次想要执行相应的功能文件就不需要先输入上面这行指令了:

source your_devel_setup.bash_path/setup.bash
  1. 运行节点测试,启动发布者终端,在终端输入:
rosrun beginner_tutorials talker.py

新建终端,依次输入,这里注意文件目录需要和第一个终端保持一致,启动订阅者节点:

source devel/setup.bash
rosrun beginner_tutorials listener.py

最后我们在终端可以看到:

I heard hello world X  #其中X是从0开始递增的数字

补充:包管理与配置文件

此外,我们可以看看如何更好地管理ROS包中的文件。在ROS包中,有两个重要的配置文件:package.xml和CMakeLists.txt。这两个文件分别负责描述包的元数据和构建指令。在对原文件做出修改之后,我们需要关注以下这两个文件,当然对于python脚本,保存即生效,只做小的改动,大多时候不需要关注这两个文件,对于用c++编写的功能文件,则需要对这两个文件有更高的关注度。

更新package.xml

package.xml文件用来描述ROS包的基本信息和依赖关系。确保你的package.xml文件包含正确的依赖项:

<?xml version="1.0"?>
<package>
  <name>beginner_tutorials</name>
  <version>0.0.0</version>
  <description>The beginner tutorials package</description>
  <maintainer email="[email protected]">Your Name</maintainer>
  <license>BSD</license>
  <buildtool_depend>catkin</buildtool_depend>
  <depend>rospy</depend>
  <depend>std_msgs</depend>
  <export>
    <build_type>catkin</build_type>
  </export>
</package>
更新CMakeLists.txt

CMakeLists.txt文件用来定义构建过程。确保你的CMakeLists.txt文件正确设置了包的依赖关系,并且指定了要构建的可执行文件:

cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)

# Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS
  rospy
  std_msgs
)

# Specify additional locations of header files
include_directories(
  ${catkin_INCLUDE_DIRS}
)

# Declare a ROS node executable
add_executable(talker src/talker.py)
add_executable(listener src/listener.py)
重新构建并测试

最后,回到工作空间的根目录,重新构建工作空间,然后再次运行发布者和订阅者节点:

cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun beginner_tutorials talker.py & rosrun beginner_tutorials listener.py

小结

在本次ROS1(Robot Operating System 1)入门教程中,我们详细介绍了如何创建一个基本的自定义节点(Node),这对于初学者来说是一个重要的起步阶段。大家对创建和运行简单ROS节点有了基本的了解,在后续的学习过程中,大家可以学着逐步扩展其功能,探索更高级的主题,如服务调用、动作(Action)客户端和服务端的实现等,我也会持续跟进。

标签:Node,catkin,beginner,自定义,py,listener,rospy,ROS,ROS1
From: https://blog.csdn.net/winner0111/article/details/141788364

相关文章

  • 【量化分析】Python、JavaScript(Node.js)、Java、C#和Ruby五种主流语言的实例代码给大
    最近一两年,股票量化分析越来越受欢迎了。想要入行,首先得搞定股票数据。毕竟,所有量化分析都是建立在数据之上的,实时交易、历史交易、财务、基本面,这些数据咱们都得有。咱们的目标就是挖掘这些数据中的价值,来指导咱们的投资策略。​为了找数据,我可是尝试了各种方法,自己动手......
  • 基于nodejs+vue宠物互助领售平台[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快和孤独感的普遍增加,宠物已成为许多人生活中不可或缺的伴侣。然而,宠物市场的信息不对称、领养渠道不畅、宠物医疗知识普及不足等......
  • 基于nodejs+vue宠物户籍管理[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快与城市化进程的推进,宠物已成为许多家庭不可或缺的一员,它们不仅是情感的寄托,更是家庭的重要组成部分。然而,宠物数量的激增也带来......
  • 基于nodejs+vue宠物寄养酒店系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快和人们对宠物情感依赖的日益增强,宠物已成为许多家庭不可或缺的重要成员。然而,在主人因工作、旅行等原因无法直接照顾宠物时,如何......
  • 基于nodejs+vue宠物寄养平台[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快与城市化进程的推进,宠物已成为许多家庭不可或缺的一员,它们不仅带来了陪伴与慰藉,更是家庭成员间情感的纽带。然而,当人们面临出差、旅......
  • spring 自定义属性解析器
    自定义属性解析器org.springframework.context.support.AbstractApplicationContext#prepareBeanFactorybeanFactory.setBeanClassLoader(getClassLoader());//设置EL表达式解析器(${})beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver(beanFactory.g......
  • nodejs起一个http2
    静态页面其实就是复制官网的代码其中证书是我自己申请的可以用证书dingshaohua.comimportfsfrom"fs";importhttp2from"node:http2";constserver=http2.createSecureServer({key:fs.readFileSync("/etc/letsencrypt/live/dingshaohua.com/privkey.pem"),......
  • Vue3中的自定义事件和状态提升案例
    Vue3中的自定义事件和状态提升案例在现代Web开发中,Vue.js作为一个轻量级且灵活的前端框架,越来越受到开发者的青睐。而Vue3引入的组合式API(setup语法糖)更是让状态管理和事件处理变得更加优雅。在这篇博客中,我们将探讨如何在Vue3中利用自定义事件和状态提升,实现组件间的有效......
  • 高并发系统-使用自定义日志埋点快速排查问题
    背景在高并发的系统中,通常不会打印除参数校验失败或捕获异常之外的日志,防止对接口的性能产生影响。那对于请求不符合预期的情况,我们如何快速找到是哪块逻辑影响的至关重要。Pfinder提供的链路监控,更多的是性能层面的监控,无法满足我们上述的诉求。下面我将通过自定义通用上下文,添加......
  • 第七章 项目布局实现(7.4.7)——自定义主题
    7.4.7自定义主题==强烈建议:==在模板中不要配置与颜色有关的样式,否则自定义主题不生效很难排错。明亮模式新建src/styles/element/light.scss//onlyscssvariables$--colors:('primary':('base':green,),);@forward'element-plus/theme-ch......