话题通讯

  • 前言
  • 理论模型
  • 自定义消息配置与解释
    • Package调整
    • CmakeLists调整
    • 检查生效
  • 发布方实现
    • C++
    • python
  • 接收方实现
    • C++
    • python
  • 测试与注意事项

前言

本文主要是跟着audolabor学习ROS笔记,多为操作性质,并从另一种角度对实现的顺序进行调整,想要多学习,可以参考autolabor教程

理论模型


话题通讯包含发布方,实现方和ROS Master,我们在编写程序时,只需要在意发布方和实现方的实现已经两者之间的联系方式。两者之间的联系方式是依靠共同的话题(图中的bar),话题一致,接受方就可以接受发布方的消息

自定义消息配置与解释

ROS自带的消息比较单一,我们有时需要自己定义一下消息的类型,此时需要对Cmakelists等配置进行较大的调整,首先在工作环境新建一个msg文件夹,里面建立msg文件,保存为Person.msg

string name
uint16 age

Package调整

在package.xml中添加以下代码

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

注意,编译时,只需要message_generation,而在运行时,需要message_runtime

CmakeLists调整

打开工作目录src下的CmakeLists,改变以下代码

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
add_message_files(FILESPerson.msg
)
generate_messages(DEPENDENCIESstd_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

检查生效

编译后,使用rosmsg命令。一定要source一下,不然会找不到msg

rosmsg show Person

返回person.msg内容说明msg生效

发布方实现

C++

  • 配置环境,为了使vscode不误报错误,在c_cpp_properties.json中的includepath中添加编译后生成的Person.h头文件,一般为:工作空间/devel/include/**
  • 编写实现,代码如下:
#include "ros/ros.h"
#include "huati/Person.h" //huati为包名int main( int argc, char *argv[])
{ros::init(argc,argv,"pub_cpp");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<huati::Person>("huati1",10);//huati1是pub_cpp发布的话题huati::Person person;person.name = "zhangsan";person.age = 18;ros::Rate rate(1);//发送频率ros::Duration(2.0).sleep();//防止丢失数据while(ros::ok()){pub.publish(per);per.age++;rate.sleep();ros::spinOnce();}return 0;
}/*
编写完程序后记得对CmakeLists文件做调整,与正常相比还需要添加以下代码:
add_dependencies(person_talker ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(person_listener ${PROJECT_NAME}_generate_messages_cpp)
*/

cpp程序中,逻辑的实现依靠ros名称空间,所需要的函数与变量定义都在ros名称空间里,通过ros::使用。

python

  • 配置环境,在setting.json中的python.autoComplete.extraPaths添加编译后自定义消息的库,位置通常在:工作空间/devel/lib/python3/dist-packages
  • 代码如下:
#! /usr/bin/env python
import rospy
from huati.msg import Person #huati是包名if __name__ == "__main__":rospy.init("pub_py")pub = rospy.Publisher("huati2",Person,10)person = Person() #创建发布消息对象person.name = "Reese"person.age  = 30rate = rospy.Rate(1) #发送频率1Hzrospy.sleep(2)while not rospy.is_shutdown():pub.publish(person)person.age += 1rate.sleep()

接收方实现

C++

代码如下:

#include "ros/ros.h"
#include "huati/Person.h"void domsg(const huati::Person::Constptr& msg)//回调函数
{ROS_INFO("姓名是:%s,年龄是:%d",msg->name.c_str(),msg->age);
}
int main( int argc, char *argv[])
{ros::init(argc,argv,"sub_cpp");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("huati1",10,domsg);ros::spin();return 0;
}

python

#! /usr/bin/env python
import rospy
from huati.msg import Persondef domsg(msg):rospy.info("姓名是%s,年龄是%d"msg.name,msg.age)
if __name__ == "__main__":rospy.init("sub_py")sub = rospy.Subscriber("huati2",Person,domsg,queue_size = 10)rospy.spin()

测试与注意事项

  • python与cpp程序编写完成后需要配置cmakeLists文件
  • python需要添加可执行权限
  • 终端运行时需要source环境变量

1,话题通讯C++与python相关推荐

  1. 2,服务通讯C++与python

    服务通讯 前言 理论模型 自定义srv文件 Package调整 CmakeLists调整 服务器实现 C++ python 客户端实现 C++ python 测试与注意事项 前言 本文主要是跟着aud ...

  2. 2.通信机制-话题通讯 一直发,一直接收(电台-收音机)

    话题通讯:一直发,一直接收(电台-收音机) 服务通讯:请求接收被同意再发送(服务端-客户端)(浏览器访问) 参数使用:给对象设置数据.获取数据 组件使用01(消息过滤): 组件使用02(消息融合): ...

  3. ROS话题通信c++和python实现

    机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的.更确切的讲 ...

  4. python 即时通讯_用python实现发送即时消息到twitter

    1.[代码][Python]代码 Python语言: 用python实现发送即时消息到twitter #!/usr/bin/env python #coding=utf-8 # 通过urllib2模块 ...

  5. python爬取知乎话题广场_学习python爬虫---爬虫实践:爬取B站排行榜2(爬取全部分类排行榜、利用pygal库作图)...

    前面我们爬取了B站上全站的排行榜,详细见:魏勇:学习python爬虫---爬虫实践:爬取B站排行榜​zhuanlan.zhihu.com 一.爬取全部分类排行榜 我们观察一下B站排行榜,那里还有番剧排 ...

  6. python3蓝牙通讯_使用Python 3.3的蓝牙服务器

    坏消息: Python似乎不支持您想要的开箱即用.(至少不在socketmodule.c中). 我见过的大多数python/bluetooth用户都使用^{},尽管它自2009年以来就没有更新过. 好 ...

  7. python进行usb通讯_wireshark – 使用python进行USB映射

    在阅读一些CTF写作时,我遇到了这个脚本 #!/usr/bin/env python import struct import Image import dpkt INIT_X,INIT_Y = 10 ...

  8. python 服务端与c++客户端通讯_[原创]python socket 服务端 与 c++客户端通讯,发包内容加密,支持大文件,并发...

    代码经过网络搜索,综合算是原创吧.py脚本为服务端 项目文件在 https://github.com/jinjie412/service_client_socket import socketserv ...

  9. ROS同时订阅多个话题 Python

    记录一次ROS踩坑的经历.本来想用Python实现在一个节点中同时订阅两个话题的消息.在网上查阅了一些资料,其实没有找到特别合适的答案,大多数都是在回答"如何同时订阅和发布话题"这 ...

最新文章

  1. activity切换交互动画
  2. python对文件的读操作方法有哪些-python--文件的读写操作
  3. 当前订单不支持只花呗支付是什么意思_1、(跑腿介绍篇)支付宝花呗分期线下推广...
  4. HDU 1217 Arbitrage (Floyd + SPFA判环)
  5. (王道408考研数据结构)第七章查找-第二节2:二分查找及其判定树
  6. DB主从一致性架构优化4种方法
  7. Java界面排号系统_【前端系统】javaweb技术的医院门诊在线预约及排号管理系统的实现...
  8. winform程序的皮肤问题
  9. android模拟器directx,DX千骑驱动器模拟器
  10. 钉钉再放大招!打造公司文化也有智能工具,中国4300万中小企业有福了
  11. 什么是功能性测试?-Alltesting|泽众云测试
  12. Spark的位置优先: TaskSetManager 的有效 Locality Levels
  13. twiproxy - 基于GTAP 0.4的twitter API proxy
  14. 智慧医院3D导航导诊系统-基础功能详解
  15. 豆瓣fm(二)后端模型构建
  16. 刷机一直请求shsh_重磅,苹果刷机验证服务器异常(SHSH),大部分老版本开放降级,请速度降级或者备份SHSH2【已关闭】...
  17. 怎么用cad版本转换器?转换cad版本的方法
  18. Nginx进阶篇 :Nginx proxy服务器
  19. How to compile and install NCAR Command Language on IBM PowerPC 64 --- NCL编译安装步骤
  20. 网联车辆协同编队控制系统研究-马芳武

热门文章

  1. 网站建设学习(九)——JavaScript基础语法(上)
  2. 被尘封的故事技能点bug_幻象冰龙能减速?死亡缠绕打不死兵?这些War3里的Bug你都知道吗?...
  3. 叮当健康再闯IPO,三年累亏近30亿,如何杀出巨头重围?
  4. 在 Ubuntu 中与手机发送文件不方便,怎么让手机和 Ubuntu 远程建立连接,传输文件?
  5. 云计算、大数据和人工智能
  6. LeetCode——二叉树
  7. 访问修饰符有哪些?及作用范围
  8. 2019前端工程师的自检清单
  9. HTML特殊符号对照表【常用字符大全】含emoji表情
  10. C语言题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。