首页 > 综合 > 正文

在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的运动,敬请期待。

关键词: 可能出现 设计开发 环境变量

便民

点击加载更多

频道推荐

  • 服饰
  • 时尚
  • 物流
  • 灯饰
  • 养老