ROS学习笔记(十一) rospy介绍(一)

2023-05-16

rospy介绍(一)

rospy是Python版本的ROS客户端库,提供了Python程序需要的接口(rospy就是一个Python模块),位于/opt/ros/kineetic/lib/python2.7/dist-packages/rospy。

rospy和roscpp

rospy功能与roscpp相似,都有关于node、topic、service、param、time相关操作,也有一些区别:

  1. rospy没有NodeHandle。
  2. 创建publisher、subscriber等操作被直接封装成了rospy中的函数或类,调用简单。
  3. rospy部分接口命名和roscpp不同。
    相较于C++开发,Python写ROS程序的开发效率较高,不用需要再注意显示、类型转换等细节,但执行效率低,同样一个功能用Python运行的耗时高于C++。所以开发SLAM、路径规划、机器视觉等方面算法时,往往优先选择C++。
    ROS中绝大多数基本指令(rostopic、roslaunch等)都是用Python开发的,简单轻巧。

ROS中Python代码的组织方式

Python代码有两种组织方式:单独的Python脚本(适用于简单的程序),Python模块(适用于提体量较大的程序)。

单独的Python脚本:
小体量的ROS程序,一般就是一个Python文件,放在script/路径下

test(包名)/scripts/file_name.py

Python模块
当程序的功能比较复杂时,无法放到一个脚本里,就要把一些功能放到PythonModule中,使用其他的脚本来调用。

ROS建立Python模块的规范:
test/src/test(与package同名)/init.py 可参考http://www.cnblogs.com/Lands-ljk/p/5880483.html
test/src/test(与package同名)/modulefiles.py
test/scripts/your_script.py
test/scripts/setup.py

常用的ROS命令大多数都是Python模块,源码存放在ros_comm仓库的tools路径下:https://github.com/ros/ros_comm/tree/lunar-devel/tools
每一个命令行工具(如rosbag、rosmsg)都是用模块的形式组成核心代码,然后在script/下建立一个脚本来调用。

常用rospy的API

具体查看http://docs.ros.org/api/rospy/html/rospy-module.html

Node相关

返回值方法作用
rospy.init_node(name,argv=None,anonymous=False)注册和初始化node
MasterProxyrospy.get_master()获取master的句柄
boolrospy.is_shoudow()节点是否关闭
rospy.on_shutdown()在节点关闭时调用fn函数
strget_node_uri返回节点的URI
strget_name()返回本节点的全名
strget_namespace()返回本节点的名字空间

Topic相关

函数:

返回值方法作用
[[str,str]]get_published_topics()返回正在被发布的所有topic名称和类型
Messagewait_for_message()等待某个topic的message
spin()触发topic或service的回调/处理函数,会阻塞直到关闭节点

Publisher类:

返回值方法作用
init(self,name,data_class,queue_size=None)构造函数
publish(self,msg)发布消息
strunregister(self)停止发布

Subscriber类:

返回值方法作用
init_(self,name,data_class,call_back=None,queue_size=None)构造函数
unregister(self,msg)停止订阅

Service相关

函数:

返回值方法作用
wait_for_service(service,timeout=None)阻塞直到服务可用

Service类(server):

返回值方法作用
init(self,name,service_class,handler)构造函数,handler为处理函数,service_class为srv类型
shutdown(self)关闭服务的server

ServiceProxy类(client):

返回值方法作用
init(self,name,service_class)构造函数,创建client
call(self,ars,*kwds)发起请求
call(self,args,*kwds)同上
close(self)关闭服务的client

Param相关

函数

返回值方法作用
XmlRpcLegalValueget_param(param_name,default=_unspecified)获取参数的值
[str]get_param_names()获取参数的名称
set_param(param_name,param_value)设置参数的值
delete_param(param_name)删除参数
boolhas_param(param_name)参数是否存在于参数服务器上
strsearch_param()搜索参数

时钟相关

函数:

返回值方法作用
Timeget_rostime()获取当前时刻的Time对象
floatget_time()返回当前时间,单位秒
sleep(duration)执行挂起

Time类

返回值方法作用
init(self,secs=0,nsecs=0)构造函数
Timenow()静态方法 返回当前时刻的Time对象

Duration类:

返回值方法作用
init(self,secs=0,nsecs=0)构造函数

topic in rospy

用Python写一个节点间消息收发的demo,创建一个自定义的gps类型的消息,一个节点发布模拟gps信息,另一个接收和计算原点的距离。

1. 自定义消息的生成

string state
float x
float y

2. CMakeLists.txt和package.xml

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)
add_message_files(
FILES
gps.msg
)
generate_messages(DEPENDENCIES std_msgs)

package.xml

<build_depend>message_generation</build_depend>
<run_depend>message_runtion</run_depend>

对创建的msg进行catkin_make会在~/catkin_ws(workspace)/devel/lib/python2.7/dist-packages/topic_demo下生成msg模块(module),即可在Python程序中通过from test.msg import gps进行gps类型的消息的操作。

3. 消息发布节点

文件位置:test/scripts/pytalker.py

#!/usr/bin/env python
#coding = utf-8

import rospy
from test.msg import gps

def talker():
	rospy.init_node("pytalker",anonymous=True)
	pub = rospy.Publisher("gps_info",gps,queue_size=10) #Publisher 函数第一个参数是话题名称,第二个参数 数据类型,现在就是我们定义的msg 最后一个是缓冲区的大小
	#queue_size:None 不建议,会设置成为阻塞式同步收发模式
	#queue_size:0 不建议,会设置为无限缓冲区模式,危险
	#queue_size:10 or more  一般情况下设为10,queue_size太大会导致数据延时不同步
	#更新频率是1hz
	rate = rospy.Rate(1)
	x = 1.0
	y = 2.0
	state = "working"
	while not rospy.is_shutdown():
		rospy.loginfo('talker:gps:x=%f,y=%f')
		pub.publish(gps(state,x,y))
		x = 2*x
		y = 2*y
		rate.sleep()
if __name__ = "__main__":
	talker()

与C++代码区别:

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

roscpp 和rospy的接口并不一致,实现原理上两套客户端库也有各自的实现,没有基于一个同意的核心库来开发,要避免混用。
ROS2就解决了这一问题,ROS2中的客户端库有rclcpp(ROS Client Library C++)、rclpy(ROS Client Library Python)和其他语言版本,都是基于一个共同的核心ROS客户端库rcl开发(核心库由C语言实现)。

3. 消息订阅节点

文件位置:test/scripts/pylistener.py:

#!/usr.bin/env python
#coding = utf-8

import rospy
import math
#导入mgs
from test.msg import gps

#回调函数输入的应该是msg
def callback(gps):
	distance = math.sqrt(math.pow(gps.x,2)+math.pow(gps.y,2))
	rospy.loginfo("listener:gps:distance=%f,state=%s",distance,gps.state)

def listener():
	rospy.init_node("pylistener",anonymous=True)
	#Subscriber函数第一个参数是topic的名称,第二个参数是接受的数据类型 第三个参数是回调函数的名称
	rospy.Subscriber("gps_info",gps,callback)
	rospy.spin()

if __name__ = "__main__"
	listener()

在订阅节点中,rospy没有spinOnce(),只有spin()。

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

ROS学习笔记(十一) rospy介绍(一) 的相关文章

  • C语言中常见的两个比较字符串是否相等的函数strcmp和strncmp

    函数 xff1a strcmp和strncmp strcmp 使用格式 xff1a include lt string h gt int strcmp const char s1 const char s2 设这两个字符串为str1 xff
  • sprintf和printf 用法的区别

    printf 的作用是标准化输出 xff0c 默认的对象是标准输出缓冲区 xff0c 要有一定的条件才能把缓冲区里面的数据输出 sprintf 作用是格式化输出函数 xff0c 保存字符串到缓冲区中 xff0c 起到拼接字符串的作用 功能
  • select函数实现TCP双向通信

    服务器通信实现代码 include 34 myhead h 34 tcp双向通信 服务器的代码 多路复用使用思路 xff1a 1 思考要监测什么文件描述符 新的套接字 接收 键盘 发生 2 监测新套接字的读就绪 监测键盘的读就绪 int m
  • C++调用构造函数,后面用冒号添加变量的作用

    C 43 43 调用构造函数和成员函数后 xff0c 在函数的后面添加一个冒号的含义 首先知道初始化机制中 xff0c 有两种赋值机制 xff0c 有赋值运算符赋值和括号赋值 xff1a 传统赋值 xff1a int a 61 10 int
  • 第六篇,STM32脉冲宽度调制(PWM)编程

    1 PWM概念 PWM叫脉冲宽度调制 Pulse Width Modulation xff0c 通过编程控制输出方波的频率和占空比 高低电平的比例 xff0c 广泛应用在测量 xff0c 通信 xff0c 功率控制等领域 呼吸灯 xff0c
  • ovn 配置逻辑路由器实现三层转发

    本文使用ovn搭建一个三层转发的环境 xff0c 拓扑图如下 image png 两个虚拟交换机ls1和ls2 xff0c 端口ip网段分别为 10 10 10 0 24和 10 10 20 0 24 虚拟交换机上分别连接两个vm 使用na
  • 第十篇,STM32串口蓝牙编程

    1 串口蓝牙概念 串口蓝牙是一个蓝牙模块 xff0c 内部有蓝牙模块和程序 xff0c 可以进行蓝牙通信 xff0c 同时提供一个串口接口 xff0c 通过串口可以配置蓝牙模块进行数据传输 2 使用串口3连接蓝牙模块 3 手机上安装蓝牙调试
  • 第十四篇,STM32的CAN总线通信

    1 CAN总线的概念 CAN指的是控制器局域网网络 Controller Area Network xff0c 由德国博世汽车电子厂商开发出来 CAN使用差分信号 xff0c 具有较强的抗干扰能力和传输稳定性 CAN属于多主通信 xff0c
  • OpenCV图像处理学习十九,像素重映射cv::remap

    一 像素重映射概念 重映射就是把输入图像中各个像素按照制定的规则顺序映射到另外一张图像的对应位置上去 xff0c 形成一张新的图像 二 像素映射API函数接口 cv remap xff08 InputArray src 输入图像 Outpu
  • OpenCV图像处理学习二十一,直方图比较方法

    一 直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2 xff0c 归一化到相同的尺度空间 xff0c 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度 xff08 每张图像都有唯一的直方图与之对应 xff0
  • 嵌入式FreeRTOS学习八,xTaskCreate创建任务的细节以及恢复中断任务实现

    一 创建任务函数xTaskCreate 任务也不是很复杂的东西 xff0c 任务也就是一个函数xTaskCreate 简单得说 xff0c 创建一个任务 xff0c 你得提供它的执行函数 xff0c 你得提供它的栈的大小 xff0c 函数的
  • 嵌入式FreeRTOS学习一,FreeRTOS概述和代码结构

    一 FreeRTOS是什么 FreeRTOS 是由 Real Time Engineers Ltd 出品 xff0c 是一款市场领先的 RTOS 现在已经支持几十种 处理器架构 Free即免费的 xff0c RTOS全称是 Real Tim
  • 嵌入式FreeRTOS学习二,FreeRTOS任务的创建和删除

    一 任务的创建和删除 1 1 函数xTaskCreate 此函数用来创建一个任务 xff0c 任务需要RAM来保存与任务有关的状态信息 任务控制块 xff0c 任务也需要一定的RAM 来作为任务堆栈 如果使用函数xTaskCreate 来创
  • 嵌入式FreeRTOS学习五,FreeRTOS任务调度器

    四 调度器 FreeRTOS 操作系统支持三种调度方式 xff1a 抢占式调度 xff0c 时间片调度和合作式调度 实际应用主要是抢占式调度和时间片调度 xff0c 合作式调度用到的很少 启动调度器的API函数vTaskStartSched
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • 嵌入式FreeRTOS学习十,任务调度和任务就绪链表任务调度过程

    一 main函数里面的栈是哪里分配的 main函数里面用到的栈 xff0c 假设为msp 是汇编代码里面设定的 xff0c 对于STM32F103 在汇编代码里的向量表设置了一个栈 initial sp 那这个栈是给谁用的呢 xff1f 可
  • ovn 通过网关虚拟路由器连接外部网络

    本文实验如何通过ovn的网关逻辑路由器将ovn网络连接到外部网络 前面讲过ovn的逻辑路由器是分布式的 xff0c 这意味着它没有绑定到某个节点上 xff0c 而是存在于所有节点上的 xff0c 同时它是通过每个节点的openflow流表来
  • 嵌入式FreeRTOS学习十一,深入理解任务调度机制

    一 任务调度机制 可抢占 xff1a 高优先级的任务先运行时间片轮转 xff1a 同优先级的任务轮流执行空闲任务礼让 xff1a 如果有同是优先级为0的其他就绪任务 xff0c 空闲任务主动放弃一次运行机会函数调用vTaskDelay xD
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x

随机推荐

  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • 001_初识_飞航科技光标飞控

    这两天老潘给我一块飞控 xff0c 让我练手 xff0c 为电赛做准备 xff0c 拿到控挺开心的 xff0c 毕竟省了一笔RMB 本来想着买块正点原子的飞控 资料 xff1a 说起资料简单看了一下发现还蛮全的 xff0c 但是这个资料我居
  • 写出C语言的第一个程序“Hello World”

    这里写自定义目录标题 写出C语言的第一个程序 Hello World 写出C语言的第一个程序 Hello World 下面展示一些 内联代码片 span class token comment A code block span span
  • Eigen库的安装攻略

    Eigen库的安装攻略 转载 xff1a Eigen库安装 xff08 两种方式 xff09 转载 xff1a Eigen库安装 xff08 两种方式 xff09 链接 link
  • 【ROS2基础学习】

    入门篇 前言一 创建一个功能包二 编译三 source总结 前言 提示 xff1a 这里是记录的大概内容 xff1a 随着机器人技术的不断发展 xff0c ROS也越来越重要 xff0c 很多人都开启了学习ROS xff0c 本文就介绍了R
  • Arduino 外部中断重置内部定时器

    Arduino 外部中断重置内部定时器 文章目录 Arduino 外部中断重置内部定时器前言一 准备工作二 代码三 实验效果1 设置1Hz的方波 xff08 外部中断触发 xff09 xff1a 2 观察示波器各个波形 xff1a 3 延迟
  • ALUBI LPMS-IG1 RS232 IMU ROS2驱动安装

    文章目录 前言一 下载官方系列文档二 windows上的上位机程序安装2 Ubuntu上的ROS2驱动安装Offset Mode 2 总结 前言 IMU在自动驾驶领域广泛应用 xff0c 本文主要记录了在ROS2中使用ALUBI LPMS
  • ovn-northd 源码分析

    ovn northd是ovn中的核心后台进程 xff0c 主要负责将ovn的高层配置转换成供ovn controller后台进程使用的逻辑配置 xff0c 更详细的说就是它将ovn northbound数据库中传统意义上的逻辑网络配置转换成
  • 镭神CH128x1系列激光雷达使用记录

    镭神CH128x1系列激光雷达使用记录 文章目录 镭神CH128x1系列激光雷达使用记录前言一 操作步骤1 PC连接雷达 二 实验1 雷达控制器上的接口 xff1a 2 接口定义3 Rviz中显示效果 总结致谢 前言 本条博客的需求来源于自
  • c语言中char数组的结束位

    因为是半路出家学习cpp的 xff0c 所以经常会对c语言里面的字符数组感到困惑 xff0c 这次一次性做个总结 首先 xff0c 结束位 0 只针对字符数组 xff0c 不针对整型或者其他数组 其次 xff0c 字符数组的大小只针对里面的
  • SUMO 使用netconvert报错解决办法

    SUMO 使用netconvert报错 问题描述正确解决方法不适用的解决方法 问题描述 刚开始学习使用sumo xff0c 版本是sumo1 8 0 第一次使用netconvert转换地图时出现报错 xff0c 提示没有PROJ Libra
  • IoTDB基础 初识IoTDB 安装及基本使用(个人学习记录)

    官方文档 http iotdb incubator apache org zh UserGuide V0 13 x API Programming Java Native API html 参考博客 时序数据库IoTDB安装及基本使用htt
  • 树莓派+ L298N 控制二相四线步进电机

    树莓派 43 L298N 控制二相四线步进电机 1 步进电机 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机 在非超载的情况下 xff0c 电机的转速 停止的位置只取决于脉冲信号的频率和脉冲数 xff0c 而不受负载变化的影响
  • VTK移动立方体法处理CT图像建立三维模型

    span class token comment 移动立方体 span span class token macro property span class token directive keyword include span span
  • 使用tcp工具调试socket服务端通信

    背景介绍 xff1a 客户端是用tcp连接调试 xff0c 工具链接 https pan baidu com s 1kfjv1jdS8KJgb7YVSu9Wtw 提取码 z34a 服务端是Java代码写的逻辑 xff0c 用byte 流接收
  • Fast Planner 轨迹规划

    文章目录 0 概览1 关键问题2 相关工作3 F a s t P
  • C++继承和多态学习心得

    继承 定义 xff1a 在已有类的基础上创建新类的过程 一个 B 类继承A类 xff0c 或称从类 A 派生类 B 类 A 称为基类 xff08 父类 xff09 xff0c 类 B 称为派生类 xff08 子类 xff09 语法形式 xf
  • Python学习笔记(六):isalpha()函数的用法

    isalpha 方法 xff1a 判断字符串是否只由字母组成 xff0c 如果字符串中所有字符都是字母则返回True xff0c 否则返回False str1 61 34 python 34 print str1 isalpha True
  • ovn-controller源码分析

    ovn controller是运行在chassis hypervisor上的后台进程 xff0c 向上通过OVSDB协议连接到OVN sourthbound数据库 xff0c 向下通过OVSDB协议连接到ovs数据库 xff0c 并通过op
  • ROS学习笔记(十一) rospy介绍(一)

    rospy介绍 xff08 一 xff09 rospy是Python版本的ROS客户端库 xff0c 提供了Python程序需要的接口 xff08 rospy就是一个Python模块 xff09 xff0c 位于 opt ros kinee