安卓与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的解耦的更多相关文章

  1. Exchange Server 2016 安卓手机打不开超过10M的附件问题处理

    华为手机配置Exchange Server 2016  时,打不开超过10M的附件,如PPT或者是DOC之类的附件,而iphone手机确可以,因为iphone手机使用了IMAP协议,安卓手机如果使用I ...

  2. Rosbridge 的使用

      参考文献: http://rosclub.cn/post-569.html ROS与Android的窃窃私语   1.简介 ROSbridge 顾名思义,是一个ROS当中的中间件,ROS 桥,是用 ...

  3. 在ros中集成Fast-rtps库并运行hello world 程序

    1.介绍 ROS:自行百度 Fast-RTPS:是eProsima公司对RTPS标准的一个实现,也就是函数库.RTPS是DDS标准中的一个子集.RTPS:Real Time Publish Subsc ...

  4. ROS之初见Hello World

    前言 最近在玩ROS,笔记中断了一段时间. ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象.设备驱动.库函数.可视 ...

  5. 使用扫描二维码打开app

    应该不少人遇到过这种需求,扫描二维码打开app如果用户没有这个app则提示它跳转. 用网页直接来调用app是不打可能的,必须原生那边先做一些配置. 首先,安卓和苹果的调用方法是不同的. 所以我们需要先 ...

  6. 判断终端类型、微信的文章防盗链、h5页面跳转打开新的app、跳转到app市场

    判断终端的类型.安卓.ios.微信.qq function  GetMobelType()  {                 var  browser  =   {                 ...

  7. Task 6.1 校友聊之NABCD模型分析

    我们团队开发的一款软件是“校友聊”--一个在局域网内免流量进行文字.语音.视频聊天的软件.下面将对此进行NABCD的模型分析. N(Need需求):现如今,随着网络的迅速普及,手机和电脑已经成为每个大 ...

  8. 安全性测试:OWASP ZAP 2.8 使用指南(四):ZAP扫描移动应用安全

    在做移动应用(APP,小程序等)测试时,需要关注应用安全性. ZAP是可以用来进行手机移动应用渗透性测试扫描的. 正因为ZAP是采用“中间代理”的形式,截取并扫描所有客户端与服务器的交互请求,作为客户 ...

  9. actionlib学习

    ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...

随机推荐

  1. Mac下的 /private 是个什么目录?

    Mac下的 /private 是个什么目录? 学习了:https://www.zhihu.com/question/19582264/answer/125522314  有图有真想

  2. js 多域名跳转

    <script>try {if( self.location == "http://cnblogs.com/endv" ) { top.location.href = ...

  3. 分享六个基于Bootstrap的实用开发教程和模板演示

    关于Bootstrap,相信大家一定不陌生,它已经成为现在主流产业的一个重要工具,Bootstrap提供了优雅的HTML和CSS规范,它基于jQuery框架开发的,它在jQuery框架的基础上进行了更 ...

  4. 如何在代码中设置以dp为单位的长度

    获取当前屏幕的密度系数 ,并设置控件以dp为单位的长宽   float density = getResources().getDisplayMetrics().density;   params = ...

  5. Discuz常见小问题-如何设置163邮箱注册验证

    参考网址: https://jingyan.baidu.com/album/c843ea0b804a6e77931e4aa7.html?picindex=3 http://www.discuz.net ...

  6. TCP客户/服务器程序实例——回射服务器

    目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编 ...

  7. Mysql Field * doesn't have a default value解决方法

    Mysql Field * doesn't have a default value解决方法 MySQL 5中,出现错误提示: Field 'id' doesn't have a default va ...

  8. Arrays.asList的用法

    使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常说明: ...

  9. webp转jpg

      webp转jpg CreateTime--2017年12月8日09:32:38 Author:Marydon 1.webp格式介绍 WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的 ...

  10. Linux内核开发之异步通知与异步I/O(一)

    “小王,听说过锦上添花吧..”我拍拍下王的头说. “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我. “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东 ...