ROS学习笔记—— rospy

2023-05-16

所有资料均来自于 https://www.icourse163.org/learn/ISCAS-1002580008#/learn/announce  和

https://github.com/DroidAITech/ROS-Academy-for-Beginners  和 

https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/

rospy具体接口:https://docs.ros.org/api/rospy/html/

ROS Wiki rospy介绍:https://wiki.ros.org/rospy 

 

rospy中和 Node Topic Service Param Time 相关的函数

rospy_Node 相关

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

初始化node

import rospy
rospy.init_node('my_node')

rospy_Topic 相关

函数:

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

注:rospy里没有 spinOnce() 函数 

Publisher类:

返回值方法作用
 __init__(self, name, data_class, queue_size=None)构造函数
 publish(self, msg)发布消息
strunregister(self)停止发布
pub = rospy.Publisher('topic_name',msg_type,queue_size = None) #若queue_size是 None 则为同步通信方式,若为整数则为异步通信方式
pub.publish(msg)    #发布消息
pub.unregister()    #停止发布

 

Subscriber类:

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

 rospy-Service相关

函数:

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

Service类(server):

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

关于回调函数handle,在rospy中传入参数是request 返回参数是response:

def handler(req):
....
return res

而在roscpp中传入参数是request和response,返回参数是一个布尔值:

bool handler(req,res)
{    
    ...
    return bool;
}

 

ServiceProxy类(client):

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

 

 rospy-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()搜索参数

rospy-Time相关

函数:

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

Time类:(时刻)

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

Duration类:(一段时间)

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

 注:Time+Time=Duration     Time+Duration=Time     Duration+Duration=Duration     Duration-Duration=Duration      Time+Time无意义  

Rate类:

返回值方法作用
 __init__(self,frequency)构造函数
 sleep(self)挂起 考虑上一次的rate.sleep()的时间
Timeremaining(self)成员函数 剩余sleep时间

 

Topic_demo 

https://github.com/DroidAITech/ROS-Academy-for-Beginners/tree/master/topic_demo

功能描述和步骤和roscpp的Topic_demo相同

gps.msg文件在经过catkin_make后,会在以下路径生成py文件

~/catkin_ws/devel/lib/python2.7/dis-pacakges/topic_demo/msg/__init__.py

引用格式如下:

from topic_demo.msg import gps

pylistener.py

#!/usr/bin/env python
#coding=utf-8
import rospy
import math
#导入mgs
from topic_demo.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()

pytalker.py

#!/usr/bin/env python
#coding=utf-8
import rospy
#导入自定义的数据类型
from topic_demo.msg import gps

def talker():
    #Publisher 函数第一个参数是话题名称,第二个参数 数据类型,现在就是我们定义的msg 最后一个是缓冲区的大小
    #queue_size: None(不建议)  #这将设置为阻塞式同步收发模式!
    #queue_size: 0(不建议)#这将设置为无限缓冲区模式,很危险!
    #queue_size: 10 or more  #一般情况下,设为10 。queue_size太大了会导致数据延迟不同步。
    pub = rospy.Publisher('gps_info', gps , queue_size=10)
    rospy.init_node('pytalker', anonymous=True)
    #更新频率是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',x,y)
        pub.publish(gps(state,x,y))
        x=1.03*x
        y=1.01*y
        rate.sleep()

if __name__ == '__main__':
    talker()

CMakeList.txt 和 package.xml 同前

 

service_demo

(https://github.com/DroidAITech/ROS-Academy-for-Beginners/tree/master/service_demo)

功能描述和步骤同前。

Greeting.srv文件在经过catkin_make后,会在以下路径生成py文件

~/catkin_ws/devel/lib/python2.7/dis-pacakges/service_demo/srv/__init__.py

引用格式如下:

from service_demo.srv import *  #import的有 Greeting GreetingResponse GreetingRequest

server_demo.py

#!/usr/bin/env python
#coding=utf-8
import rospy
from service_demo.srv import *

def server_srv():
    # 初始化节点,命名为 "greetings_server"
    rospy.init_node("greetings_server")
    # 定义service的server端,service名称为"greetings", service类型为Greeting
    # 收到的request请求信息将作为参数传递给handle_function进行处理
    s = rospy.Service("greetings", Greeting, handle_function)
    rospy.loginfo("Ready to handle the request:")
    # 阻塞程序结束
    rospy.spin()

def handle_function(req):
    # 注意我们是如何调用request请求内容的,是将其认为是一个对象的属性,在我们定义
    # 的Service_demo类型的service中,request部分的内容包含两个变量,一个是字符串类型的name,另外一个是整数类型的age
    rospy.loginfo( 'Request from %s with age %d', req.name, req.age)
    # 返回一个Service_demo.Response实例化对象,其实就是返回一个response的对象,其包含的内容为我们在Service_demo.srv中定义的
    # response部分的内容,我们定义了一个string类型的变量feedback,因此,此处实例化时传入字符串即可
    return GreetingResponse("Hi %s. I' server!"%req.name)

# 如果单独运行此文件,则将上面定义的server_srv作为主函数运行
if __name__=="__main__":
    server_srv()

 client_demo.py

#!/usr/bin/env python
# coding:utf-8
import rospy
from service_demo.srv import *

def client_srv():
    rospy.init_node('greetings_client')
    # 等待有可用的服务 "greetings"
    rospy.wait_for_service("greetings")
    try:
        # 定义service客户端,service名称为“greetings”,service类型为Greeting
        greetings_client = rospy.ServiceProxy("greetings",Greeting)

        # 向server端发送请求,发送的request内容为name和age,其值分别为"HAN", 20
        # 此处发送的request内容与srv文件中定义的request部分的属性是一致的
        #resp = greetings_client("HAN",20)
        resp = greetings_client.call("HAN",20)
        rospy.loginfo("Message From server:%s"%resp.feedback)
    except rospy.ServiceException, e:
        rospy.logwarn("Service call failed: %s"%e)

# 如果单独运行此文件,则将上面函数client_srv()作为主函数运行
if __name__=="__main__":
    client_srv()

 

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

ROS学习笔记—— rospy 的相关文章

  • tcp 三次握手和四次挥手报文分析

    1 xff0c tcp 三次握手 报文抓取如下 xff1a 三段报文分析 xff1a 第一次 xff1a 26 gt 96报文交互 Seq num 61 567391014 ACK NUM 61 0 flags 61 SYN 第二次 xff
  • bootp引导程序协议

    bootp又称为引导程序协议 我们来简单了解一下这个协议以及他的用法 1 xff0c BOOTP 请求和应答均被封装在 U D P 数据报中 xff1b 2 xff0c B O O T P 使用 U D P xff0c 且通常需与 T F
  • http请求学习

    GET xff1a 向Web服务器请求一个文件 POST xff1a 向Web服务器发送数据让Web服务器进行处理 PUT xff1a 向Web服务器发送数据并存储在Web服务器内部 HEAD xff1a 检查一个对象是否存在 DELETE
  • linux c语言全面学习json解析函数

    1 json结构的定义 typedef struct cJSON cJSON结构体 struct cJSON next prev 遍历数组或对象链的前向或后向链表指针 struct cJSON child 数组或对象的孩子节点 int ty
  • matlab的图片滤波处理

    椒盐噪声 高斯噪声 MATLAB自带函数 均值滤波 中值滤波 自编模版 读取图片并转换为灰度图片 I 61 imread 39 1 jpg 39 imshow I I1 61 rgb2gray I imshow I1 椒盐噪声 I2 61
  • Linux 动态库的编译和执行

    静态库生成及测试 编码myccso脚本 gcc c Wall I inc src myadd c o myadd o ar rcs libmyadd a myadd o rm o mv libmyadd a lib gcc Wall g I
  • matlab中函数的定义和使用

    在matlab的选择框中的的新建中选择新建函数 xff0c 一般是以 m的文本文件 xff0c 新建后我们可以在里面写入我们的实现函数 xff0c 现在我们给出两个实例看一下 xff0c 分别是简单的求和和Fibonacci sequenc
  • matlab简单绘图plot,subplot

    a1 二维绘图plot的实现 subplot n m x 建立一个m n的绘图区域 xff0c 然后分别在其x 61 1 xff0c 2 xff0c 3 xff0c 4 区域绘制图像 function 61 plot1 x 61 0 0 3
  • python 函数的定义和应用

    1 xff0c 函数定义和使用 xff1a def substract sub a sub b sub res 61 sub a sub b return sub res sub test 61 substract 10 20 print
  • Linux shell中的-d,-f,-e,-n的作用

    1 xff0c d gt dirtionnary 判断目录是否存在 例 xff1a d tmp 返回为真便是 tmp是文件夹目录 2 xff0c e gt exist 判断是否存在 例 xff1a e filename 返回为真表示file
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • Linux下用nginx和naxsi搭建web防火墙

    Linux下用nginx和naxsi搭建web防火墙 Naxsi Naxsi是一个开源 xff0c 高性能 xff0c 地位会规则 xff0c nginx的web应用程序防火墙模块 xff0c 著名的web服务器和反向代理 xff0c 它的
  • 【语义分割】类别不平衡损失函数合集

    在语义分割领域 xff0c 我们会常常遇到类别不平衡的问题 比如要分割的目标 xff08 前景 xff09 可能只占图像的一小部分 xff0c 因此负样本的比重很大 xff0c 导致网络倾向于将所有样本判断为负样本 本文介绍了在数据不平衡时
  • 小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

    重点关注虚拟内存的切换 xff0c pgd xff0c mm struct start code xff1b 理清楚这三个概念 pgd不是在这里设置的遵循COW xff0c 是在写时缺页中断填充的 start code只是一个段开始的标记
  • linux软中断和系统调用深入研究

    arm软中断模式 arm7种模式 有中断模式 xff0c 但是并没有软中断模式 那么arm的软中断是什么呢 xff1f arm的软中断是arm从用户模式切换到特权模式 xff0c 也就是linux中从用户态切换到内核态的过程 swi命令触发
  • 进程proc文件介绍

    进程proc文件 proc pid 下是每个进程的proc信息 xff0c proc self比较特殊 xff0c 哪个进程打开 xff0c 对应链接到哪个进程 1 xff09 内存相关 status xff1a 进程使用虚拟内存和物理内存
  • Win10系统下安装CAA二次开发程序,VS界面上不出现CAA菜单栏或菜单栏为灰色的

    问题描述 xff1a Win10系统下安装了CATIA CAA V5R19和V4R24两个版本 xff0c 其中V5R19版本安装完成后VS2005中没有出现CAA菜单栏 xff0c V5R24安装完成后VS2008中出现部分集成菜单且为灰
  • 基于Stm32的4G模块实现内网透传通信(代码后附)

    基于Stm32的4G模块实现内网透传通信 一 内网透传即内网映射 xff0c 内网IP端口映射外网连接访问过程的实现 内网透传通信实现过程又有以下几种区别 xff1a 1 xff09 路由器映射 适合自己本地路由有公网IP网络环境 xff0
  • RoboCup智能机器人足球教程(二)

    RoboCup智能机器人足球教程 xff08 二 xff09 运行方式 RoboCup2D仿真平台通过一个服务端 xff0c 若干客户端联系而成 xff0c 同时通过监视器进行画面播放 当启动服务端后 xff0c 客户端通过改写程序内部的c
  • RoboCup智能机器人足球教程(三)

    RoboCup智能机器人足球教程 xff08 三 xff09 实现守门员代码 守门员逻辑实现比较容易 xff0c 但是最好开始的时候画好流程图 xff0c 理顺逻辑 xff0c 守门员一直盯着球 xff0c 当球距离守门员够近的时候 xff

随机推荐

  • 嵌入式工作一年总结

    其实这是去年2017年11月份写的 xff0c 现在想把这个发出来 xff0c 为后来的同学或者迷茫的一些同学的一些建议吧 xff01 刚入行回忆 刚开始进入公司的能力很差 xff0c 可以说什么都不会吧 xff0c wifi拼成wife
  • CVPR 2019 | 旷视研究院提出新型损失函数:改善边界框模糊问题

    全球计算机视觉三大顶会之一 CVPR 2019 xff08 IEEE Conference on Computer Visionand Pattern Recognition xff09 将于 6 月 16 20 在美国洛杉矶如期而至 届时
  • ros中使用opencv处理图像

    cv bridge toCvCopy xff1a ROS下的sensor msgs ImageConstPtr xff0c 和图像压缩类型 xff08 例如 xff1a sensor msgs image encodings RGB8 xf
  • PX4飞行日志分析与.ulg文件格式转换

    文章目录 一 FlightPlot安装及使用二 ulg文件格式转换 xff08 windows环境 xff09 一 FlightPlot安装及使用 span class token number 1 span xff09 下载FlightP
  • 【深入理解Java虚拟机 笔记】Java的类加载过程

    类加载的过程如下图所示 xff1a 一 加载阶段 注意 xff1a 这里的 加载 阶段是整个 类加载 过程的一个阶段 xff0c 两个词的含义是不一样的 这个阶段主要做3件事 xff1a 1 通过类的全限定名获取二进制字节流 xff1b 2
  • 【深入理解Java虚拟机 笔记】垃圾回收算法

    前言 当前垃圾回收集器大多都是遵循分代收集理论进行设计的 xff0c 先聊聊什么是分代收集 xff1a xff08 1 xff09 弱分代假说 xff1a 绝大多数对象都是朝生夕灭的 xff1b xff08 2 xff09 强分代假说 xf
  • 【日记 2021-05-01】 leetcode练习&& Linux修改文件权限

    题目 xff1a 1335 工作计划的最低难度 题目内容 xff1a 你需要制定一份 d 天的工作计划表 工作之间存在依赖 xff0c 要想执行第 i 项工作 xff0c 你必须完成全部 j 项工作 xff08 0 lt 61 j lt i
  • 【Leetcode 刷题笔记】16. 3Sum Closest

    题目 方案一 xff1a 穷举法 o n 3 span class token keyword class span span class token class name Solution span span class token pu
  • 【Debugging】SpringSecurity iframe 页面不显示

    问题描述 如下图所示 xff0c 配置了SpringSecurity后 xff0c 网页就加载不出来了 xff0c 多次检查代码都没有问题 xff0c 折腾了好久 xff01 xff01 xff01 解决方案 在SpringSecurity
  • 【日记 2021-05-14】树莓派获取环境亮度(光照度)

    什么是亮度 xff1f 光照度指被照射物体单位面积上所接受可见光的光通量 xff0c 单位是勒克斯 Lux 或流明每平方米 lm m2 xff0c 是用来描述光的亮度的 我们平时最关心的我家灯到底够不够亮 xff0c 具体数值可以用照度计测
  • 【Java】语法糖

    什么是语法糖 xff1f 语法糖就是指 java 编译器把 java 源码编译为 class 字节码的过程中 xff0c 自动生成和转换的一些代码 有哪些语法糖 xff1f 默认构造函数 xff1a 当一个类没有显式的提供构造函数时 xff
  • 【Java多线程】FutureTask的使用示例

    炎热的夏天 xff0c 一位少侠到客栈吃杯茶 xff0c 客栈准备茶水有如下两种方式 xff1a 单线程 先擦桌子 xff0c 花费3秒 xff1b 再准备茶水 xff0c 花费3秒 xff1b 共花费6秒 xff01 多线程 擦桌子和准备
  • 旷视研究院博士图鉴|Be that challenger

    图为旷视研究院日常工作一景 旷视研究院有这样一批挑战者 他们是 PhD xff0c 更是 Researcher 他们 深入探索科技发展的前沿阵地 笃信自己的科研价值 渴望见证一行行代码的快速落地 期待与同样优秀的人碰撞思维 做自己所爱的事
  • 【Java多线程】CompletableFuture的使用示例

    刘备 关羽和张飞三兄弟在家吧喝酒 xff0c 突然发现忘带钱了 xff0c 于是差下人回去取钱 为了不影响三兄弟喝酒的气氛 xff0c 刘备吩咐下人钱取来后交给旁边侍候的赵云即可 span class token keyword publi
  • 【Java基础】Arrays.sort()使用示例

    狗有名字 体重和年龄3个属性 xff1a span class token keyword public span span class token keyword class span span class token class nam
  • 【Spring】aop的使用示例

    场景 去饭店吃饭的时候 xff0c 在进入饭店时门卫会为你开门 xff0c 并问候说 欢迎光临 xff0c 当你吃完离开时 xff0c 门卫会说 请慢走 xff0c 欢迎下次光临 此场景下涉及如下两个角色 xff1a 顾客 xff08 cu
  • 关于从Github上下载历史版本

    第一步 打开一个仓库 xff0c 可以看到此时在主分支下 xff0c 点击1位置查看历史版本 第二步 现在可以查看到所有的版本 xff08 提交 xff09 信息 xff0c 单击2位置进入该版本 第三步 单击3位置浏览并打开该版本 第四步
  • 数据结构——结构体

    结构体是一种复合数据类型 xff0c 定义了一组变量列表 xff0c 这些变量将放在一个内存块中的名称下 它允许通过使用指向结构的一个指针来访问不同的变量 struct structure name data type member1 da
  • python 归并排序

    归并排序 xff08 Merge Sort xff09 是一种典型的递归法排序 它把复杂的 排序过程分解成一个简单的合并子序列的过程 至于怎么得到这个子 序列 xff0c 就得自己调用自己了 归并排序首先要做的就是将数列分成左右两部分 xf
  • ROS学习笔记—— rospy

    所有资料均来自于 https www icourse163 org learn ISCAS 1002580008 learn announce 和 https github com DroidAITech ROS Academy for B