之前有用安卓平台控制ROS节点的需求,在设计实验方案的时候了解到rosbridge。这一篇就对rosbridge做一个简单的介绍。希望这篇文章解释明白几个问题
  1. rosbridge是什么?
  2. rosbridge的结构
  3. rosbridge的小demo

1.rosbridge是什么

  rosbridge是官方提供一款工具包,用于ROS系统和非ROS系统通信(只用于通信)。纯ROS系统可以做master节点,ros官方支持语言是C++,python。虽然rosjava可以让java也变成纯ros系统,但rosjava体量较大,一般用于PC。安卓平台资源不足,无法支持涵盖master节点的分布式结构,于是改用轻量级的C/S模式。所以安卓平台不是直接和ROS系统做通信,其中经过一次代理。安卓手机作为客户端,经过代理发给服务端。不过rosbridge为开发者屏蔽了代理转发过程。rosbridge本身有两种结构,适用于两种场景。BS结构适用于浏览器和ROS系统交互,CS结构适用于安卓平台和ROS系统交互。
  rosbridge既然是提供通信功能的,整体内容都围绕通信展开。rosbridge支持非ros和ros通信的原理是通过把json格式的数据转换成ros中消息/服务信息,反之也可以。如下图所示:

  所以任何支持json格式进行数据传输的语言都可以通过rosbridge和ROS通信,而java是其中最广泛使用的的一种。

2.rosbridge的结构

  用一张图表示rosbridge的结构就是:

  rosbridge的内容结构包括:rosbridge protocol(协议),rosbridge implementation(实现)。协议做的事是规定通信格式,也就是ros中具体操作(话题发布,订阅)到底使用什么样的json格式。通信方式包括话题订阅,消息发布,服务调用,参数设置获取。Implementation部分具体实现功能。
  实现包括三部分:
  rosbridge_library:最核心的部分,负责获取json字符串并将命令发送到ros,实现获取json格式数据发送到ros中并解析成ros话题,
  rosbridge_server:提供传输功能,支持websocket连接(实现浏览器和rosbridge交谈,浏览器的实现通过roslibjs),
  rosapi:提供ros服务,通过服务调用对ros中一些操作做封装,操作包括获取和设置参数,获取主题列表
  我觉得下面整这个图很好的解释了rosbridge的工作原理,图的左半部分是rosbridge的工作,右半部分就是json格式的生成。

  图源:实在抱歉,我忘记原作者的引用网址了。侵权删~

  rosbridge支持以下三种具体的通信协议,要根据实际情况进行选择:

  但rosbridge只实现了tcp/udp/websocket Server端,而且Server端不会主动连接,也就是需要自己实现客户端,将数据变成符合rosbridge提供的协议格式(rosbridgev2.0)的json数据,再通过同样的通信协议方法(websocket)进行连接。

  针对于上面那个麻烦的问题,有高手已经做了处理。并将其开源了出来(我叫它现成轮子~):https://github.com/djilk/ROSBridgeClient
  这个轮子其实做了两件事情:
  1.还是用ros的话题方式操作数据,把数据自动的转成符合要求的  json格式
2.将该json格式,利用符合协议要求的方式通过websocket发送到服务器端

  对于这个轮子的使用提一下,主要是参照/ROSBridgeClient/src/com/jilk/ros/example.java,将这个项目集成到自己的安卓项目中(具体内容请学习安卓开发),/ROSBridgeClient/src/com/jilk/ros/message/,这个目录是话题传递的消息类型,不一定有自己预期的,可以对其进行增加然后使用。(对于更详细的使用,因为都没有官方的教程,只能慢慢摸索啦)

3.rosbridge的小demo

  demo1:网页控制小海龟移动(BS结构):

  详见:https://blog.csdn.net/dzjoke/article/details/116056180
  用rqt_garph看拓扑结构就是这样的:

demo2:网页文字交互demo(BS结构):

  详见:https://blog.csdn.net/qq_41821678/article/details/120976232

demo3:github开源项目(CS结构,未真实验证)

  详见:https://github.com/UbiquityRobotics/Robot_Commander
  详见:https://github.com/1hada/android_rosbridge_teleop
  详见:https://github.com/Hongshuai-Wang/RosAppCtrl-rosbridge

4. rosbridge安装命令:

  sudo apt-get install ros-版本-rosbridge-suite
  举例:sudo apt-get install ros-melodic-rosbridge-suite


最后再留一些相关的资料或者有收获的博客,感兴趣的可以看看哈~

古月居介绍rosbridge
rosbridge - 简书 (jianshu.com)
rosbridge wiki: http://wiki.ros.org/rosbridge_suite

协议(目前使用的是rosbridgev2.0版本):https://github.com/RobotWebTools/rosbridge_suite/blob/groovy-devel/ROSBRIDGE_PROTOCOL.md
rosbridge——JS应用库(用于网页开发html与ros通信)
教程:http://wiki.ros.org/roslibjs
源码:https://github.com/RobotWebTools/roslibjs

ros与JS网页交互基础教程:https://www.bilibili.com/video/av6293256/
rosbridge各组件代码参数详细:https://blog.csdn.net/wjydym/article/details/95380260

参考(对成熟安卓开发框架做了一定解释):

https://blog.csdn.net/XCCCCZ/article/details/86773609
https://blog.csdn.net/XCCCCZ/article/details/89739759

安卓开发demo:
https://blog.csdn.net/GreatSimulation/article/details/108899572
源码:https://github.com/KEYD111/TestRosBridge

安卓结合rosbridge开发Demo(对ROSBridgeClient做了一层封装):
https://www.codercto.com/a/42991.html