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

添加权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

将原始工程的 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

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

 

 

 

  • 9
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值