11.用python写一个简单消息发布器和订阅器

11.1写一个发布器节点

“节点”是ROS网络中的可执行文件,现在我们创建一个不断广播一条信息的发布器(命名为talker)的节点

首先进入之前创建的beginner_tutorials程序包

roscd beginner_tutorials

创建一个python脚本文件目录

mkdir scripts

进入刚创建的目录

cd scripts

下载发布器例子脚本(talker.py)

wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/talker.py

wget是一个从网络上自动下载文件的自由工具。

使下载的文件可执行

chmod +x talker.py

chmod是用于修改linux系统下文件或目录的访问权限。

+表示增加,-表示减少

x表示可执行权限

talker.py的文件大致如下

~~

11.1.1代码解析

第1行是python惯用宣言,用于确保该文件作为python脚本执行。(必须有,尤其在linux中)

第39行,引入 rospy模块(听说使用rospy不需要catkin_make就可以运行,官方解释是你写节点就需要import rospy)

第40行,从std_msgs.msg模块中引入String类(这个引入就是为了使用到字符串消息类型)

 第43行,调用了rospy类中的publisher方法,括号中分别是话题(chatter),消息类型(String),消息大小(queue_size)

第44行,是初始化节点,官方解释是给节点赋予了名字(名字不能包含/),没有这步,它无法和ROS管理器通信。anonimous翻译是匿名。

第45行,定义了rospy每秒发布10次的频率。

第46行,是个循环,如果rospy.is_shutdown没有被关闭则进行循环中的内容(被关闭的情况比如Ctrl+c等)

第47行,赋值给hello_str这个变量

第48行,这个loginfo(str)有3个作用,第一,打印消息,第二,被写入节点日志文件中,第三,被写入rosout中(这样就可以通过rqt_console查看)。

第49行,发布消息hello_str

50行,sleep函数,等待到下一次发布时间。(10HZ,也就是等1/10秒)

因为string是一个简单的消息类型,你会想知道它是怎么发布复杂的数据类型。其实容器参数的排序是根据msg中的排序一样。你也可以直接不输入参数并直接初始化该域(暂时不知道这个域指的是啥,感觉就是创建实例的意思。)。

例子是这样的(感觉就是string是一个class,然后创建了个实例赋值给了msg,然后对实例中的变量进行赋值这样)

msg=String()
msg.data = str

或者你可以初始化部分域和让剩下的使用默认值

String(data =str)

 

 

转载于:https://my.oschina.net/u/3384982/blog/898787

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
发布(C++)代码如下: ```c++ #include <iostream> #include <string> #include <vector> #include <cstring> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> using namespace std; struct msgbuf { long mtype; char mtext[1024]; }; int main() { key_t key = ftok("message_queue", 1); int msgid = msgget(key, IPC_CREAT | 0666); if (msgid == -1) { cerr << "Error creating message queue" << endl; return -1; } while (true) { double num; string str; cout << "Enter a number or a string: "; if (cin >> num) { msgbuf buf; buf.mtype = 1; memcpy(buf.mtext, &num, sizeof(num)); msgsnd(msgid, &buf, sizeof(num), 0); } else { cin.clear(); cin.ignore(); getline(cin, str); msgbuf buf; buf.mtype = 2; strcpy(buf.mtext, str.c_str()); msgsnd(msgid, &buf, str.size() + 1, 0); } } return 0; } ``` 订阅(python)代码如下: ```python import struct import sys import os import time from ctypes import * from numpy import * class msgbuf(Structure): _fields_ = [ ("mtype", c_long), ("mtext", c_char * 1024) ] def main(): key = os.ftok("message_queue", 1) msgid = os.msgget(key, 0666) if msgid == -1: print("Error creating message queue") return -1 while True: buf = msgbuf() if os.msgrcv(msgid, byref(buf), sizeof(double), 1, os.MSG_NOERROR | os.IPC_NOWAIT) != -1: num = struct.unpack('d', buf.mtext)[0] print(f"Received number: {num}") if os.msgrcv(msgid, byref(buf), sizeof(buf.mtext), 2, os.MSG_NOERROR | os.IPC_NOWAIT) != -1: str_ = buf.mtext.decode('utf-8') print(f"Received string: {str_}") time.sleep(0.5) if __name__ == '__main__': main() ``` 这两个程序需要在同一个操作系统下运行。发布程序会等待用户输入消息,如果是浮点数则发送消息类型为1的消息,如果是字符串则发送消息类型为2的消息订阅程序会不断接收消息队列中的消息,如果消息类型为1,则按照浮点数解析消息并输出;如果消息类型为2,则按照字符串解析消息并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值