通过Rosbridge与Android通信---安卓接口说明
摘要
- 本文承接上一篇博客【rosbridge】ROS与Android通信(加更续集)
- 继续研究Rosbridge开源项目,介绍通信接口使用方法及学习体会
- 附带介绍开源项目中的实用的依赖包、依赖库
项目核心文件
manifests,res是安卓常规文件夹
com.jilk.ros包含核心客户端代码实现
net.xxhong.rosclient 对客户端进行封装,且实现了所有节点,话题,服务的显示
项目依赖文件
我在拿到代码之后,花好一阵子才稍微熟悉项目中的一些依赖。
- butterknife 通过注解绑定视图,简化操作
- Eventbus 可以用于Android四大组件间通讯,也可以用于异步线程和主线程间通讯等
- bmelnychuk-TreeView树形可视化结构
//gradle
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.github.bmelnychuk:atv:1.2.+'
}
接口使用
-
连接ROS
MainActivity.java
中
函数private void connect(String ip, String port)
参数:传入字符串类型ip,port
说明:此函数创建ROSBridgeClient
类客户端实例。将已连接的客户端类存储于RCApplication,便于进行Activity间的数据传递。 -
发送给服务端
Rosbridge协议通信支持json字符串格式
获取已经连接的ROSBridgeClient
类客户端实例。
//获取已经连接的Rosbridgeclient类的实例
client = ((RCApplication)getApplication()).getRosClient();
调用其成员方法send(String json)
//发送数据给服务端
client.send("{\"op\":\"unsubscribe\",\"topic\":\"" + "/map" + "\"}");
client.send("{\"op\":\"subscribe\",\"topic\":\"" + "/cmd_vel" + "\"}");
client.send("{\"op\":\"publish\",\"topic\":\"" + TopicName + "\",\"msg\":{"+data+"}}");
client.send("{\"op\":\"call_service\",\"service\":\"" + ServiceName + "\",\"args\":["+data+"]}");
- 从服务端接收
使用Eventbus 定义的类进行数据传递。
这里开源作者已经定义PublishEvent
类。
首先在要接受消息的页面注册
EventBus.getDefault().register(this);
开源作者已经写好从ROS服务端接收的代码并且
在ROSBridgeWebSocketClient.java
的onMessage()
方法中
通过EventBus发布
现在获得ROS服务端的数据只需要从EventBus接收消息即可:
这些消息被封装在PublishEvent
类中,通过onEvent
方法接收
public void onEvent(PublishEvent event) {/* Do something */};
基本代码实现
在连接步骤已经完成基础上
//UserActivity部分代码
//Butterknife绑定组件
@Bind(R.id.show_linsp)
TextView showLinsp;
ROSBridgeClient client;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//背景布局设置
setContentView(R.layout.activity_user);
//启动ButterKnife插件
ButterKnife.bind(this);
//注册订阅者
EventBus.getDefault().register(this);
//获取已经连接的Rosbridgeclient类的实例
client = ((RCApplication)getApplication()).getRosClient();
//发送数据给服务端
client.send("{\"op\":\"subscribe\",\"topic\":\"" + "/cmd_vel" + "\"}");
}
public void onEvent(final PublishEvent event) {
if("/cmd_vel".equals(event.name)){
//在消息框显示原始信息
showLinsp.setText(event.msg);
return;
}