[转]使用rosbridge协议实现安卓跟ros的解耦
安卓与ROS通信的现状
因为ROS官方支持的语言绑定只有C++和Python,所以目前安卓想与ROS通信,必须借助半官方的rosjava包,而Rosjava太重了,因为它跟C++/Python一样,是一个全功能的ROS绑定,意即你可以在Java(android)平台上创建Master Node,然后其他Node(C++/Python)可以连上这个Master,进行分布式通信!这对于桌面Java或许还能接受,但对于android实在是过于复杂了。
另外,rosjava的gradle脚本太复杂,需要很深的gradle知识才能将其集成到自己的android工程,很多公司(比如我们-_-!)嫌麻烦直接导入rosjava的demo工程,然后将自己的代码添加进去,团队里如果有新人加入,则还要重新搭建一个rosjava环境,太麻烦了。
rosbridge协议
很多人都觉得移动平台or嵌入式系统要实现跟ROS进行分布式通信成本太高昂,大家寻思用C/S架构可能更符合移动平台的需求,于是提出了rosbridge协议,该协议的基本思想是将节点间的分布式通信,改成client节点与一个代理节点进行C/S通信,然后代理节点再将请求转发给server节点,这样移动端就不需要实现整个ROS平台,只需要跟代理节点通信即可。
这是一篇比较rosjava跟rosbridge优劣的pdf,简单来说,就是移动平台以牺牲做server节点的代价,换来了轻量级ROS交互的能力。不过特殊情况下rosjava还是有用的,比如机器人的底盘调用机械臂的service,如果机械臂只支持rosbridge,则调用不可行——不过这种情况通过pub/sub应该也能解决。
ROSBridgeClient库
要让android能收发rosbridge消息,首先要支持WebSocket这种特殊的传输通道才能实现android接收ROS端publish(推送)过来的消息,目前实现WebSocket的大部分集中在桌面Java,比如Jetty、Netty等,其中Jetty因为用到了某些Dalvik VM不支持的java类而导致不能在android上使用。另外android自身的webview对WebSocket的支持较晚,不能保证全机型覆盖,所以Java-WebSocket这个用java.nio包里的类实现的WebSocket就脱颖而出。
有了传输通道,剩下的就是怎么组包发送了,这个库不仅要将发送的Java类型转换成语言无关的ROS消息类型(反之亦然),还要将ROS操作(订阅、发布、调用service、广播topic等)转换成rosbridge里规定的json串,在评估了java_rosbridge库和ROSBridgeClient库后,我选择了后者,因为前者虽然更小巧,但是用的jetty来实现WebSocket通信,没法跑在android上。
添加std_msgs包里的消息类型
在试用ROSBridgeClient库的过程中,我发现作者连std_msgs里的消息类型——例如String——都没有实现,却而代之的,是一个精巧的注解加反射机制实现的meta message类型,要扩展很简单,见我fork出来的repo 。
在摸索std_msgs的过程中,我弄明白一个机制:ROS的内置类型其实并不是实际存在的,它必须对应到具体语言的内置类型,所以为了跨语言通信,所有Message只能使用Wrapper类型,这就解释了为什么std_msgs包里一堆wrapper了,因为每个msg文件里的内置类型(比如string),都是不存在的,必须对应到Java的String,或Python的str、或C++的std::string,唯独不能对应ROS的string,因为ROS不是一门语言。
[转]使用rosbridge协议实现安卓跟ros的解耦的更多相关文章
- Exchange Server 2016 安卓手机打不开超过10M的附件问题处理
华为手机配置Exchange Server 2016 时,打不开超过10M的附件,如PPT或者是DOC之类的附件,而iphone手机确可以,因为iphone手机使用了IMAP协议,安卓手机如果使用I ...
- Rosbridge 的使用
参考文献: http://rosclub.cn/post-569.html ROS与Android的窃窃私语 1.简介 ROSbridge 顾名思义,是一个ROS当中的中间件,ROS 桥,是用 ...
- 在ros中集成Fast-rtps库并运行hello world 程序
1.介绍 ROS:自行百度 Fast-RTPS:是eProsima公司对RTPS标准的一个实现,也就是函数库.RTPS是DDS标准中的一个子集.RTPS:Real Time Publish Subsc ...
- ROS之初见Hello World
前言 最近在玩ROS,笔记中断了一段时间. ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象.设备驱动.库函数.可视 ...
- 使用扫描二维码打开app
应该不少人遇到过这种需求,扫描二维码打开app如果用户没有这个app则提示它跳转. 用网页直接来调用app是不打可能的,必须原生那边先做一些配置. 首先,安卓和苹果的调用方法是不同的. 所以我们需要先 ...
- 判断终端类型、微信的文章防盗链、h5页面跳转打开新的app、跳转到app市场
判断终端的类型.安卓.ios.微信.qq function GetMobelType() { var browser = { ...
- Task 6.1 校友聊之NABCD模型分析
我们团队开发的一款软件是“校友聊”--一个在局域网内免流量进行文字.语音.视频聊天的软件.下面将对此进行NABCD的模型分析. N(Need需求):现如今,随着网络的迅速普及,手机和电脑已经成为每个大 ...
- 安全性测试:OWASP ZAP 2.8 使用指南(四):ZAP扫描移动应用安全
在做移动应用(APP,小程序等)测试时,需要关注应用安全性. ZAP是可以用来进行手机移动应用渗透性测试扫描的. 正因为ZAP是采用“中间代理”的形式,截取并扫描所有客户端与服务器的交互请求,作为客户 ...
- actionlib学习
ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...
随机推荐
- 解决Linux平台下VMware出现"No 3d support is available from the host"或"Hardware graphics acceleration is not available" 错误
错误日志: No 3d support is available from the host Hardware graphics acceleration is not available 解决方法: ...
- log4cplus的安装与使用初步
1. 简单介绍 log4cplus是C++编写的开源的日志系统,The purpose of this project is to port the excellentLog for Java (lo ...
- Echarts实例
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 【TP5.0】页面布局,引入公共的模版文件
1.实例:如后台admin模块,公用一个header.html和footer.hml 2.模块结构: 3.使用方式: {include file="common/header"} ...
- Linux索引节点(Inode)用满导致空间不足
一.问题出现 在创建新目录和文件是提示“no space left on device”!按照以前的情况,很有可能是服务器空间又被塞满了,通过命令查看,发现还有剩余.再用df -i查看了一下/分区的索 ...
- [ASP.NET]使用uploadify上传图片,并在uploadify按钮上生成预览图
目录 需求 主要代码 总结 需求 项目中有用到uploadify上传插件,给的原型就是上传成功后替换原来的图片.没办法需求在那儿,也不能修改需求吧,只能想办法解决问题了. 主要代码 修改uploadi ...
- python--内置函数清单
转自:http://www.cnblogs.com/vamei/archive/2012/11/09/2762224.html Python内置(built-in)函数随着python解释器的运行而创 ...
- selenium 实现浏览器 前进和后退
#coding=utf-8from selenium import webdriver driver = webdriver.Chrome()driver.get("https://www. ...
- Mysql 字符串函数 详解
字符串函数是最常用的一种函数了,如果大家编写过程序的话,不妨回过头去看看自己使用过的函数,可能会惊讶地发现字符串处理的相关函数占已使用过的函数很大一部分.MySQL中字符串函数也是最丰富的一类函数,表 ...
- winform程序textbox滚动条保持在最下面 内容不闪烁
在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...