ros学习(2-2):ros节点创建(python)

2023-05-16

参考

Python创建简单的ROS节点:

  • 用Python实现ROS节点(这里也说明了用Python写ROS功能包也是需要CMakelists.txt的)
    https://blog.csdn.net/sinat_16643223/article/details/114057998

Python创建ROS节点(使用自定义消息):

  • ROS学习笔记(十一) roscpp介绍(一)
    https://blog.csdn.net/weixin_44682965/article/details/107748350

Python创建ROS服务(使用自定义消息):

  • ROS学习笔记(十二) roscpp介绍(二)
    https://blog.csdn.net/weixin_44682965/article/details/107767240
     


说明

与C++代码区别:

  • rospy没有NodeHandle。
    rospy创建和初始化一个node,不再需要NodeHandle(rospy没有设计NodeHandle这个句柄)
  • 创建publisher、subscriber等操作被直接封装成了rospy中的函数或类,调用简单。
    创建topic、service等操作都直接用rospy里对应的方法即可。
  • rospy节点的初始化不一定必须放在开头,在Publisher建立后再初始化也可以。
  • 消息的创建更加简单。自定义类型的消息可以用类似于构造函数的方式创建。
    例如:自定义gps类型的消息可以直接用类似与构造函数的方式gps(state,x,y)创建。
  • 日志的输出方式不同,C++是ROS_INFO(),Python中为rospy.loginfo()。
    判断节点是否关闭的函数不同,C++为ros::ok(),Python为rospy.is_shutdown()。

roscpprospy的接口并不一致,实现原理上两套客户端库也有各自的实现,没有基于一个同意的核心库来开发,要避免混用。

ROS2就解决了这一问题,ROS2中的客户端库有rclcpp(ROS Client Library C++)、rclpy(ROS Client Library Python)和其他语言版本,都是基于一个共同的核心ROS客户端库rcl开发(核心库由C语言实现)。


编写的python文件在执行前需要修改为可运行的节点

sudo chmod +x (文件名.py)

01 创建节点

在编写程序前,需要创建工作空间,然后在工作空间的src文件夹下创建功能包

功能包的创建可以使用如下指令:(我的功能包名称为is_a_test,后面的是相关的依赖项)

catkin_create_pkg is_a_test std_msgs rospy roscpp

python程序在功能包的scripts目录下创建

然后catkin_make。如果是新创建的工作空间,需要添加一下路径。

1.1 发布话题

在scripts目录下新建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

 
说明:

  • pub = rospy.Publisher 发布话题
  • rospy.init_node 初始化节点
  • rospy.loginfo 调式输出
  • pub.publish 发布话题内容
  • 关于python的输出格式,可以参考 https://www.runoob.com/python3/python3-inputoutput.html

1.2 订阅话题

在scripts目录下新建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():
 
    # In ROS, nodes are uniquely named. If two nodes with the same node are launched, the previous one is kicked off. 
    # The anonymous=True flag means that rospy will choose a unique name for our 'listener' node so that multiple listeners can run simultaneously.
    rospy.init_node('listener', anonymous=True)
 
    rospy.Subscriber("chatter", String, callback)
 
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
 
if __name__ == '__main__':
    listener()

 
说明:

  • rospy.Subscriber 订阅话题

1.3 编译

修改Cmakelist.txt为如下

cmake_minimum_required(VERSION 2.8.3)
project(is_a_test)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)
 
catkin_package()

 
说明:

  • 如果是使用catkin_create_pkg创建的功能包,并且在创建时已经安装了全部依赖,那么这里就不需要再更改了
  • 对于python文件,cmakelist基本就是把头文件里需要的ros依赖放到find_package(catkin REQUIRED COMPONENTS)里。而对于c++文件则复杂一些
  • project(beginner_tutorials)里写明功能包的名字
  • 编译前需要将python设置为可执行文件(sudo chmod +x [文件名.py]
  • 然后在工作空间catkin_make因为说c++需要编译,python不需要编译,所以不太明白对于python需不需要catkin_make

1.4 运行

在三个终端,分别运行以下三条命令(is_a_test是功能包的名字)

roscore

rosrun is_a_test talker.py

rosrun is_a_test listener.py

 
说明:

  • python的程序执行前,要先设置为可执行文件(sudo chmod +x [文件名.py]
  • 更重要的一点,在.py文件的第一行要有#!/usr/bin/env python,不然会报错。
    参考:https://blog.csdn.net/weixin_40900419/article/details/101620485

报错:

guyue@guyue:~$ rosrun control_robot talker.py
import-im6.q16: not authorized `rospy' @ error/constitute.c/WriteImage/1037.
from: can't read /var/mail/std_msgs.msg
/home/guyue/ur_ws/src/control_robot/scripts/talker.py: 行 5: 未预期的符号 `(' 附近有语法错误
/home/guyue/ur_ws/src/control_robot/scripts/talker.py: 行 5: `def talker():'

解决:

在文件头加上:

#!/usr/bin/env python

#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
当系统看到这一行的时候,首先会到env设置(环境变量)里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros学习(2-2):ros节点创建(python) 的相关文章

  • 最近的 AWS 区域的客户端 IP 地址

    Question 我想从客户端设备将一些数据上传到 AWS 但我想上传到最近的 AWS 区域的 S3 存储桶 同样 我希望能够从最近的区域下载 当然 我会在每个区域设置一个存储桶 我可以使用一个系统 它可以获取客户端的 IP 地址 然后确定
  • Conda 无法在 Powershell 中激活

    我已经在我的 Windows 10 笔记本电脑上安装了 anaconda 我正在尝试激活名为的Python环境pyenv 首先 我检查conda env list在我的笔记本电脑中 这是 powershell 上的输出 PS C Users
  • 如何在 Python 中获得两个变量的逻辑异或?

    你如何获得逻辑异或 http en wikipedia org wiki Exclusive orPython 中的两个变量 例如 我有两个希望是字符串的变量 我想测试其中只有一个包含 True 值 不是 None 或空字符串 str1 r
  • 在 Chaquopy 中转换数组和张量

    我该怎么做呢 我看到你的帖子说你可以将 java 对象传递给 Python 方法 但这不适用于 numpy 数组和 TensorFlow 张量 以下以及其各种变体是我尝试过的 但没有成功 double anchors new double
  • Pandas 过滤 - 非索引列上的 Between_time

    我需要过滤掉特定时间的数据 DataFrame 函数 Between time 似乎是执行此操作的正确方法 但是 它仅适用于数据帧的索引列 但我需要原始格式的数据 例如 数据透视表期望日期时间列具有正确的名称 而不是索引 这意味着每个过滤器
  • Python 包?

    好吧 我认为无论我做错了什么 它可能都是显而易见的 但我无法弄清楚 我已经阅读并重新阅读了有关包的教程部分 我唯一能想到的是这不起作用 因为我直接执行它 这是目录设置 eulerproject init py euler1 py euler
  • 将这个使用 lambda 解包的元组从 Python 2 移植到 Python 3 的最 Pythonic 方法

    我有以下 Python 2 代码 它在 lambda 中解压元组 该 lambda 包含在 for 循环内 for lab lab pred length in zip labels labels pred sequence lengths
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的
  • Python Pandas groupby、排名,然后根据自定义排名分配值

    问题设置 大熊猫数据框 df pd DataFrame Group A A A A A A A A A Subgroup Group 1 Group 1 Group 1 Group 1 Group 1 Group 1 Group 2 Gro
  • 显示多索引 pandas 数据帧的前 10 行

    我有一个多级索引 pandasDataFrame第一级在哪里year第二级是username 我只有一列已经按降序排序 我想显示每个索引级别 0 的前 2 行 我拥有的 count year username 2010 b 677 a 50
  • 使用 Python gdata 和 oAuth 2 对日历进行身份验证

    我正在将一个 Python 应用程序从 oAuth 1 迁移到 oAuth 2 该应用程序读取用户的 Google 日历提要 使用 oAuth 1 如果用户可以使用他的 GMail 进行身份验证 我的应用程序将打开浏览器 帐户并授权访问 我
  • 使用每日频率格式化 x 轴

    我正在尝试获取每日数据图 我有 3 个月的数据 每天都很难指出 如何格式化 x 轴 以便我可以获得每个日期 可以使用以下命令更改主要刻度的频率set major locator mdates DayLocator interval 5 如下
  • 在Python中使用Counter()来构建直方图?

    我在另一个问题上看到我可以使用Counter 计算一组字符串中出现的次数 所以如果我有 A B A C A A I get Counter A 3 B 1 C 1 但现在 我如何使用该信息来构建直方图 对于您的数据 最好使用条形图而不是直方
  • 我的 R 平方分数为负,但使用 k 倍交叉验证的准确度分数约为 92%

    对于下面的代码 我的 r 平方分数为负 但使用 k 折交叉验证的准确度分数为 92 这怎么可能 我使用随机森林回归算法来预测一些数据 数据集的链接在下面的链接中给出 https www kaggle com ludobenistant hr
  • 在 Mac OS x 10.7.5 中运行 Scrapy 所需的文件,使用 Python 2.7.3 IEPD_free(32 位)

    我是第一次测试 scrapy 使用命令安装后 sudo easy install U scrapy 一切似乎都运行正常 但是 当我运行时 scrapy startproject tutorial 我得到以下信息 luismacbookpro
  • 使用 PyQt5 拖放 QLabels

    我正在尝试使用 PyQt5 将 Qlabel 拖放到另一个 Qlabel 上 from PyQt5 QtWidgets import QApplication QWidget QToolTip QPushButton QMessageBox
  • 按工作日分组的熊猫 (M/T/W/T/F/S/S)

    我有一个 pandas 数据框 其中包含 YYYY MM DD arrival date 形式的时间序列 作为索引 我想按每个工作日 周一到周日 进行分组 以便计算其他日期列是平均值 中位数 标准差等 我最终应该只有七行 到目前为止我只知道
  • 如何在 Windows 上为“flask run”设置环境变量?

    我刚刚开始学习 Flask 我一直停留在设置 Flask 环境变量上 我不知道如何设置环境变量 每当我使用flask run命令 我遇到以下错误 错误消息 无法找到 Flask 应用程序 您没有提供 FLASK APP 环境变量 并且在当前
  • Python:ConfigParser.NoSectionError:没有部分:“TestInformation”

    我使用上面的代码收到 ConfigParser NoSectionError No section TestInformation 错误 def LoadTestInformation self config ConfigParser Co
  • Pandas:根据是否为 ​​NaN 来移动列

    我有一个像这样的数据框 phone number 1 clean phone number 2 clean phone number 3 clean NaN NaN 8546987 8316589 8751369 NaN 4569874 N

随机推荐

  • ROS实验笔记之——FAST-LIVO

    最近IROS22的FAST LVIO源码开源了 xff0c 笔者赶紧测试一下 源码链接 xff1a GitHub hku mars FAST LIVO A Fast and Tightly coupled Sparse Direct LiD
  • 算法学习笔记

    最近无意中看到一个算法的网站 xff0c 看着感觉介绍得挺系统的 xff0c 虽然做算法以及指导学生开发各种算法这么些年了 xff0c 却没有真正系统的学习过 xff08 几年前啃过算法导论 xff0c 但是苦于那蹩脚的中文翻译 xff0c
  • 2023年可见光通信(LiFi)研究新进展

    可见光无线通信Light Fidelity xff08 LiFi xff09 又称 光保真技术 xff0c 是一种利用可见光进行数据传输的全新无线传输技术 LiFi是一种以半导体光源作为信号发射源 xff0c 利用无需授权的自由光谱实现无线
  • 论文阅读笔记之——《Toward Convolutional Blind Denoising of Real Photographs》及基于pytorch的CBDNet的复现

    本文是CBDNet xff08 convolutional blind denoising network xff09 的阅读笔记 本博文分为两块 xff0c 一块是阅读笔记 xff0c 一块是本人对CBDNet的实验记录 论文链接 xff
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • 程序员提升之排查bug的能力

    不知不觉工作已经快一年了 xff0c 从开始工作以后 xff0c 跟着大神们学习了很多 xff0c 从一个小白慢慢的成长起来 xff0c 从我目前的经验来看 xff0c 我要感谢bug xff0c 这里的bug并不单单是指bug xff0c
  • CMakeList编译报错ninja: error: missing and no known rule to make it解决方法

    Android NDK开发引用第三方库CMakeList txt编译报错 xff1a ninja error 39 XXX NDKApplication app src main cpp src main cpp armeabi v7a l
  • 关于Java学习的心得体会

    大一的第二学期 xff0c 满心欢喜的期待着自己的专业课 xff0c 上个学期C语言老师和我们说C语言只是入门 xff0c 我们还学得如此吃力 心中已经能够想到本学期的心酸了 xff0c 果不其然 xff0c 老师说本学期不学C 43 43
  • 项目管理第十三章项目相关方管理

    项目管理第十三章项目相关方管理 项目相关方管理 xff1a 包括识别能够影响项目或会受项目影响的人员 团体或组织 xff0c 分析相关方对项目的期望和影响 xff0c 制定合适的管理策略来有效调动相关方参与项目决策和执行 其过程包括 xff
  • Git3.创建版本库(Git仓库)&提交更新到仓库

    创建版本库 Git仓库 什么是版本库呢 xff1f 版本库又名仓库 xff0c 英文名repository xff0c 你可以简单理解成一个目录 xff0c 这个目录里面的所有文件都可以被Git管理起来 xff0c 每个文件的修改 删除 x
  • ssh 登录时常出现的几种错误以及解决方法(Linux)

    前言 ssh是Linux系统中常用的远程登陆的命令 xff0c 有的时候我们通过xshell等远程连接软件使用ssh去登陆远程的服务器的时候 xff0c 会遇到一些问题 下面是关于ssh 远程登陆的问题解决方法的总结 xff08 更新中 x
  • vins-mono(4)重定位以及全局优化

    vins的重定位模块主要包含回环检测 回环候选帧之间的特征匹配 紧耦合重定位三个部分 a 回环检测 采用BRIEF描述子的DBOW2词袋进行闭环检测 对新来的关键帧重新检测500个角点进行闭环检测同时对所有角点进行BRIEF描述 然后计算当
  • STM32CubeMX的下载以及安装

    第一步 xff1a 安装应用软件 下载STM32CubeMX软件并安装 xff1b 第二步 xff1a 安装MCU固件包 在线安装用户所选的STM32微控制器对应的MCU固件包 具体操作步骤如下 xff1a 软件的下载地址 xff1a ht
  • MDK-ARM软件的下载以及资源分享

    1 软件的基本特点 xff1a 支持源代码的编辑 编译 程序的下载和调试等多种功能 编译器和器件支持包分离 xff0c 可根据需求安装 xff0c 减少软件的大小 提供多种中间件 xff0c 如RTOS和GUI等 xff0c 提高开发效率
  • 关于Win10家庭版修改用户名的问题

    之前电脑注册的时候命名为中文 xff0c 但在装很多软件时就会出现很多奇奇怪怪的问题 xff0c 查了之后发现可能是因为系统的中文名造成的 xff0c 因此在之后可能就需要修改 之前在网上找到比较常见的两种方法都不适用于Win10家庭版 方
  • ROS 开源智能小车 TurtleBot3 Waffle pi 深度视觉版简介 (可实现地图搭建、自主导航、自主避障、深度视觉算法研究)

    ROS机器人操作系统为什么现在火爆全球 xff1f ROS xff08 Robot Operating System xff0c 机器人操作系统 xff09 是目前世界上更主流更多人使用的机器人开源操作系统 它可以提供操作系统应有的服务 x
  • c/c++输出保留指定位小数(输出精度控制)

    c 43 43 C 43 43 的精度控制需要头文件 span class token macro property span class token directive keyword include span span class to
  • 以连接mysql为例:六种流行的语言比较——C、C++、python、Java、php、C#

    本文是六种语言连接mysql数据库的代码展示 xff0c 在LZ尝试的过程中 xff0c 无论是语言环境搭建 mysql依赖库的导入还是代码的风格 xff0c 各种语言都各有千秋 接下来 xff0c 我们就让这些语言一一登场吧 Java x
  • 熊迈摄像头SDK二次开发:登录、截屏、录像等功能

    对雄迈摄像头二次开发 xff0c 因为雄迈给的资料比较混乱 xff0c 没有找到可用的sdk手册 xff0c 所以一开始想用OpenCV 43 qt 但是在Windows环境下 xff0c opencv摄像头读取卡顿严重 xff0c 而且o
  • ros学习(2-2):ros节点创建(python)

    参考 Python创建简单的ROS节点 xff1a 用Python实现ROS节点 xff08 这里也说明了用Python写ROS功能包也是需要CMakelists txt的 xff09 https blog csdn net sinat 1