本人才疏学浅吗,对理论不是很懂,就简单的阐述一下前人的结论,重点放在功能的实现上面。

首先要实现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的镜像源: Android和ROS的通信 消息的传递_第1张图片

2.1.2 在安装之前,先选择 Ubuntu中的系统设置, 软件和更新(Software&Updates)  然后 选择 UbuntuSoftware -----DownLoad from   然后测试后选择合适的镜像源,最适合你的那个Android和ROS的通信 消息的传递_第2张图片

2.1.3

2.1.4

Android和ROS的通信 消息的传递_第3张图片

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

                 敲完后如下图所示

               Android和ROS的通信 消息的传递_第4张图片
             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和ROS的通信 消息的传递_第5张图片

 

          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

   不足之处,错误之处,及时和我联系   谢谢大家啦  

 

 

 

更多相关文章

  1. Android工作经验一年总结。(零基础自学Android)
  2. 如何在代码中为组件设置dip,sp值
  3. android中的跨进程通信的实现——远程调用过程和aidl(转)
  4. Android实战技巧之四十五:复用原有C代码的方案
  5. android中的跨进程通信的实现(一)——远程调用过程和aidl
  6. 这本《第三行代码》,让大家久等了!
  7. 《第一行代码Android》读书笔记

随机推荐

  1. androin各类动画效果实现
  2. android 写入联系人
  3. 常用的android intent和intent action
  4. 程序猿学习的网站
  5. ubuntu 9.04上如果去获得android最新源
  6. 如何同时启动两个Android 模拟器
  7. Android图像处理(一)色调、饱和度、亮度
  8. 地图相关
  9. Android获取天气预报
  10. Android(安卓)OpenGLES2.0(十五)——利用EG