摘要
- 本文承接上一篇博客【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;
}
本文详细介绍了如何使用Rosbridge在Android应用中与ROS进行通信,包括连接ROS、发送和接收数据。通过Eventbus库实现不同组件间的消息传递,以及Butterknife简化视图绑定。示例代码展示了如何订阅、发布话题和调用服务。
1299

被折叠的 条评论
为什么被折叠?



