Android和ROS的通信 消息的传递
本人才疏学浅吗,对理论不是很懂,就简单的阐述一下前人的结论,重点放在功能的实现上面。
首先要实现ROS和Android的通信,那么就先有Android,再安装ROS,再进行通信。这是一个很漫长的过程,大家看到这篇博文的时候,淡定一点,因为它很长,涉及的方面比较广,这篇博文主要适于 Android的开发人员,ROS端的大神,就别来凑热闹了。
简单的分一下大家从哪些方面来完成任务,相应的代码都已经上传Github上面去了:https://github.com/KEYD111/TestRosBridge
1、Android端 首先你得有个AndroidStudio,然后编写界面,了解通信协议。这些下面都会讲到。
2、ROS端 基于 Ubuntu16.04 的kinetic ,安装好环境,设置环境变量 编译 ROS
3、通信协议
我们倒着看,因为通信协议最少。
Android和ROS常见的通信方式,串口 涉及JNI/NDK 具体的实现请看我的另外一篇博文,TCP/IP 通信,不合适UDP更合适,作者小试牛刀,三天写了Bug,不好用,我们是调包侠,没到那地步,用前人的吧:
1.1、rosjava 是一个全功能的ROS绑定,进行分布式通信,只适合于桌面java 对于Android太重了 移植不方便 且只支持 ubuntu 14.04(indigo)版本
1.2、C/S的架构,rosbridge协议,基本思想是将节点间的分布式通信,改成client节点与一个代理节点进行C/S的通信。
1.3、android能收发rosbridge消息,要支持WebSocket这种特殊的传输通道,才可以实现,对ROS操作(订阅、发布、调用service,广播topic)转换成rosbridge里规定的json串,
所以 直接调包 rosbridge ,别的了解即可,做到心中有数就行,看ros的官网有详细的介绍,但是是英文的 简单粗暴 来吧 具体实现:
Android的实现:
首先感谢博主:https://blog.csdn.net/lovedarling/article/details/78400062 给我的启发,来开始
参考代码地址GitHub地址:安卓代码:
1.1.1首先添加 libs: bufferknife EventBus java_websocket json解析工具(json-simple-1.1) 但是我喜欢马爸爸的fastjson
添加权限:
将原始工程的 jilk.ros 的东西全部复制过来,,路径 !!!!! 路径!!!!! 包名的路径
此处有图片
1.1.2添加 RCApplication
public class RCApplication extends Application {
ROSBridgeClient client;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onTerminate() {
if (client != null) {
client.disconnect();
super.onTerminate();
}
}
public ROSBridgeClient getClient() {
return client;
}
public void setRosClient(ROSBridgeClient client) {
this.client = client;
}
}
在AndroidManifest中Application中添加
android:name="com.dadac.testrosbridge.RCApplication"
建立连接
/** * @Function: 建立连接 * @Return: */public void onConnect(String ip, String port) { client = new ROSBridgeClient("ws://" + ip + ":" + port); boolean conneSucc = client.connect(new ROSClient.ConnectionStatusListener() { @Override public void onConnect() { client.setDebug(true); ((RCApplication) getApplication()).setRosClient(client); showTip("Connect ROS success"); Log.d("dachen", "Connect ROS success"); } @Override public void onDisconnect(boolean normal, String reason, int code) { showTip("ROS disconnect"); Log.d("dachen", "ROS disconnect"); } @Override public void onError(Exception ex) { ex.printStackTrace(); showTip("ROS communication error"); Log.d("dachen", "ROS communication error"); } });}
1.1.3发送数据到ROS端 了解 topic publish subscribe unsubscribe 的含义(自己去查 )
private void SendDataToRos(String data) {
String msg1 = "{ \"op\": \"publish\", \"topic\": \"/chatter\", \"msg\": { \"data\": \""+data+" \" }}";
client.send(msg1);
}
格式一定要正确
1.1.4 接受来自ROS端的数据
先订阅
//接收来自Ros端的数据
private void ReceiveDataToRos() {
if (isSubscrible == true) {
String msg1 = "{\"op\":\"subscribe\",\"topic\":\"/chatter\"}";
client.send(msg1);
} else if (isSubscrible == false) {
String msg2 = "{\"op\":\"unsubscribe\",\"topic\":\"/chatter\"}";
client.send(msg2);
}
}
/chatter 只是一个标志位 方便请求的是哪种数据 对应的是 ROS端的文件名
public void onEvent(final PublishEvent event) { //处理请求
if ("/chatter".equals(event.name)) {
parseChatterTopic(event);
return;
}
Log.d("dachen", event.msg);
}
private void parseChatterTopic(PublishEvent event) { //JSON解析 fastjson.jar
try {
JSONParser parser = new JSONParser();
org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) parser.parse(event.msg);
String jsondata = (String) jsonObject.get("data");
DC_TextView_ShowData.setText(jsondata);
Log.i("dachen",jsondata);
} catch (ParseException e) {
e.printStackTrace();
}}
但是呢 不建议这么去看 大家还是乖乖的去下我的代码 已经封装好了 大家可以拿去直接使用
ROS端的创建
2、1 安装 Ubuntu16.0.4 若是版本不一样,直接去查阅 ROS版本和Ubuntu版本对应的名字
比如说 kinetic indigo 等等 切记
感谢博主的ROS安装文章 https://blog.csdn.net/okasy/article/details/79448623?tdsourcetag=s_pcqq_aiomsg
有点小问题,,可能是因为环境啥的不一样。我下面给出了对应我的解决方案
2.1.1 修改ubuntu的镜像源:
2.1.2 在安装之前,先选择 Ubuntu中的系统设置, 软件和更新(Software&Updates) 然后 选择 UbuntuSoftware -----DownLoad from 然后测试后选择合适的镜像源,最适合你的那个
2.1.3
2.1.4
2.1.5 安装 ROS kinetic Kame 大家这边可能会有问题
$ sudo apt-get install ros-kinetic-desktop-full 全包 kinetic 根据 版本 自己去选择
会安装很长的时间 安装完成后 sudo apt-get install ros-kinetic-rosbridge- Tab 三个都要安装
如果想安装其他ROS功能包,可以使用apt-cache命令搜索ros-kinetic开头的所有功能包。
初始化 sudo rosdep init
rosdep update
安装 ROS 的各种功能包 $ sudo apt-get install python-rosinstall 装完后方便使用
2.1.6
至此为止,大家就可以使用启动ROS的服务程序,然后 android 订阅对应的 topic 了,Ubuntu 启动ROS的代码在后面,现在配置ROS的发送程序,简单的打印一串 hello world,感谢博主 https://blog.csdn.net/dingjianfeng2014/article/details/52847764
2.1.6.1: 创建一个 catkin 空间: 1.在当前用户工作空间的目录,新建如下文件夹,名字可以随意取,一般教程都使用catkin_ws/src。 命令行: mkdir -p ~/catkin_ws/src
2:初始化catkin 空间:cd ~/catkin_ws/src
catkin_init_workspace
此时src文件夹中会生成一个CMakeLists.txt文件。
3:3.“build” catkin工作空间,即使工作空间是空的,也可以编译该工作空间:
cd ~/catkin_ws/
catkin_make 执行该命令后,catkin_ws文件夹下会生成build和devel两个新的文件夹。其中,在devel文件夹中,你会发现有好几个setup.sh文件,source这些文件中的任何一个都会使你创建的工作空间置于环境顶部。你可以使用 echo $ROS_PACKAGE_PATH来查看当前工作环境。
由于每次source比较麻烦,我们可以将这条命令配置进~/.bashrc中,如根据我的目录,我需要在~/.bashrc中加入下面的语句:
source /home/ding/catkin_ws/devel/setup.bash
下面,你关闭当前终端,重新打开一个终端,输入echo $ROS_PACKAGE_PATH,你会发现,你创建的工作空间出现在工作环境中。
4:编译ROS程序包: 1.切换到catkin workspace cd ~/catkin_ws/
2.用catkin_make命令进行编译 catkin_make
敲完后如下图所示
5,python 是不需要编译,所有前面的 echo 的环境变量一定要对,然后 改变 catkin_ws 文件的权限(测试后无所谓你改不改) 但是 test.py 一定要 chmod 777 test.py 不然找不到指定的路径
6、test.py 新建文件
#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String
def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
hello_str = "hello world"
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
2.1.7 至此基本上都已经ok了
来张大图: 完成了
Android 启动: 启动我的github文件就行了
ROS端启动:1. roscore
2. roslaunch rosbridge_server rosbridge_websocket.launch
3. rosrun dcsb main.py
4.( show:) rostopic echo /chatter
总结: 看大家的方向,需要什么样的知识,慢慢看,涉及的东西比较多,下载我的代码,然后搭建ROS环境,基本上你就可以自己去调试了,另附工程代码, ROS端实现了自主导航 然后 Android 可以实时控制 代码:https://github.com/KEYD111/RemoteControlAndroidROS
不足之处,错误之处,及时和我联系 谢谢大家啦
更多相关文章
- Android工作经验一年总结。(零基础自学Android)
- 如何在代码中为组件设置dip,sp值
- android中的跨进程通信的实现——远程调用过程和aidl(转)
- Android实战技巧之四十五:复用原有C代码的方案
- android中的跨进程通信的实现(一)——远程调用过程和aidl
- 这本《第三行代码》,让大家久等了!
- 《第一行代码Android》读书笔记