在Ubuntu22.04下编译ros2 humble的Android版本 简讯
2023-03-06 15:58:19来源:哔哩哔哩
前提
我一直想捣鼓一下机器人开发,想着自己独立去设计一款机器人,但了解到整个流程中所要学习的技能以及自己为数不多的业余时间,这事儿让我觉得有点犯难。直到去年看到古月居发布了OriginBot智能小车,在看完它的整体资料后,我觉得它有以下几个特点比较吸引我:
开源特性,基本上展现了如何从头到尾去设计开发一款小型的机器人,这和我的初始想法非常吻合。
软硬件的可拓展性,旭日X3派提升了它的可开发性,毕竟我不希望买它回来只是跑跑例程。
(相关资料图)
价格,在同类型的产品中它的价格比较亲民。
在组装好小车并跑了一些例程后,我觉得小车还缺少一个遥控器,毕竟不能一直端着笔记本电脑去控制小车吧,但是我又不想买手柄,于是我把目光投向了我身边的那部沉睡已久的安卓手机,想法来了,那就用手机去遥控小车吧。
其实用手机控制小车这也不是什么新鲜事,网上例子也很多,蓝牙,WiFi都可以,虽然都是学习,但是我也想整点不一样的,后来查资料发现ROS2也有安卓的版本,这就正合我意了,而且有了ROS2也能做更多的事情了。
我其实并不会安卓开发,也不会java,但是安卓开发作为一门很成熟的技术,咱们程序员稍微学习一下,开发点简单的应用应该没什么问题。问题的关键是如何编译ROS2的安卓版本,下面就来讲讲整个编译过程以及我踩过的坑吧。
编译过程
系统:Ubuntu22.04
GitHub上的原项目:https://github.com/esteve/ros2_java
编译的步骤基本和原项目一致,但是这个项目的版本比较老,有些步骤直接使用会报错,所以经过我踩坑后的步骤如下:
1、配置Android SDK
可以直接下载Android studio进行配置,在初次启动Android studio时会提示用户安装必要的sdk和其他模块,一般Ubuntu系统会安装在用户目录下。
2、配置Android NDK
可以直接在Android studio中进行下载配置,也可以前往NDK官网下载,下载后可以和SDK放在同一目录,至于NDK的版本选最新的就可以。
3、设置环境变量
在.bashrc文件最后一排设置SDK和NDK的环境变量,如下
4、克隆ros2和ros2 java源码
原项目的版本是ros2 galactic,想要换成最新的长期支持版本humble也可以,需要将ros2_java_android.repos里面的galactic字样修改为humble,其中Fast DDS的版本也可以更新为最新的版本。
我也整理了一份humble的repos:
此处要特别注意一个问题,因为本项目需要大量下载GitHub上的ROS相关模块,所以要求电脑终端必须要能流畅的访问GitHub,强调一下,这个是必要条件。
最终得到的文件目录如下图:
5、设置编译配置
其中ANDROID相关选项可以更换,如
这里我们选择 ANDROID_ABI 为arm64-v8a
6、编译命令
此编译命令经过多次问题排查更改,已经可以避免大多数错误。但是仍然可能出现其他错误:
找不到jni.h和jni_md.h
解决方法: 可以添加全局搜索路径到 .bashrc 或者配置文件 /etc/profile 中,其中java-11-openjdk-amd64为当前系统已经安装的jdk版本,CPATH关键字表示适用于所有语言。
编译到Fast-DDS时可能出现找不到asio和tinyxml2的头文件
解决方法: 可以在其目录下(eProsima/Fast-DDS)的CMakeList.txt文件里添加包含头文件路径
打包过程
1、jar文件和so文件
编译完成后在install目录下会生成很多文件夹,其中包含了所有的jar文件和so文件,可以直接在目录下搜索,如下图:
可以将两种文件分别拷贝并整理到单独的文件目录下,比如:
2.、根据需要加载库文件
编译好的jar文件和so文件包含了比较完整的ros常用功能包,以下是so文件:
可以看到共有1144个文件,事实上很多消息类的库文件我们是按需所用,比如项目中只需要用到std_msgs,那么其他的消息类库文件就可以不用再加载,如果加载所有的库文件会使最终的apk文件变得比较大。
测试应用程序
下面是一个测试APP的简单说明,这个应用也是我之前学习的时候在GitHub上找到的:https://github.com/YasuChiba/ros2-android-test-app
我觉得拿来作为测试用的应用比较合适,当然这个应用使用的库文件是ros2 galactic编译好的,我将其替换成humble也是没问题的。
测试APP主界面包括四个Button和一个TextView(空白处),如下图:
要实现的功能也比较简单,建立一个发布者和一个订阅者,定时发布消息,其话题名称为/chatter,消息类型为字符串,可以开始和暂停发布或订阅。
Android相关代码这里就不做说明,可以看上面完整的项目;下面看一下在java语言下的ros发布及订阅节点的实现。
发布者节点,TalkerNode.java:
订阅者节点,ListenerNode.java:
用于管理 ROS 的执行器(Executor)和在 Android 设备上运行的 ROS 节点,ROSActivity.java:
最后在MainActivity中创建新的发布和订阅者节点对象,并将其添加到执行器:
最后的运行效果如下:
将手机和电脑连接到同一网络下,可以在终端中看到手机端发布的话题及消息,如下图:
至此,关于ros2 humble的Android版本的编译以及测试到此结束;下一篇来聊聊如何开发APP来控制OriginBot的运动,敬请期待。





南宁铁路公安“寻包达人”两年收到旅客锦旗116面
福建平潭海警出击 破获一起涉嫌走私冻品案
齐齐哈尔市龙江县警方破获一涉案200余万元的“帮信”案件
北京市新增本土确诊病例7例、无症状感染者2例
浙江东阳警方通报:剧组因拍摄致猫死亡等事实不成立
天津大学留学生志愿者:同天津人民一起守护共同的家园
永远意气风发!平均年龄62岁的教授合唱团重阳节唱响
我国首颗太阳探测科学技术试验卫星“羲和号”成功发射
人社部副部长李忠:加强对中小微企业的服务 营造鼓励创新氛围
中国驻俄使馆与新疆维吾尔自治区政府共同举办“新疆是个











