通过Rosbridge与Android通信---安卓接口说明

摘要

项目核心文件

manifests,res是安卓常规文件夹
com.jilk.ros包含核心客户端代码实现
net.xxhong.rosclient 对客户端进行封装,且实现了所有节点,话题,服务的显示

在这里插入图片描述

项目依赖文件

我在拿到代码之后,花好一阵子才稍微熟悉项目中的一些依赖。
在这里插入图片描述

  1. butterknife 通过注解绑定视图,简化操作
  2. Eventbus 可以用于Android四大组件间通讯,也可以用于异步线程和主线程间通讯等
  3. bmelnychuk-TreeView树形可视化结构
//gradle 
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.github.bmelnychuk:atv:1.2.+'
}

接口使用

  1. 连接ROS
    MainActivity.java
    函数private void connect(String ip, String port)
    参数:传入字符串类型ip,port
    说明:此函数创建ROSBridgeClient类客户端实例。将已连接的客户端类存储于RCApplication,便于进行Activity间的数据传递

  2. 发送给服务端
    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+"]}");
  1. 从服务端接收
    使用Eventbus 定义的类进行数据传递。
    这里开源作者已经定义PublishEvent类。
    首先在要接受消息的页面注册
    EventBus.getDefault().register(this);
    开源作者已经写好从ROS服务端接收的代码并且
    ROSBridgeWebSocketClient.javaonMessage()方法中
    通过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;
        }
posted @ 2020-10-15 20:01  無数  阅读(199)  评论(0编辑  收藏  举报