【ROS2】ros2_javaを使って、Android用ROS2ライブラリを作成する方法
ROS2へ乗り換えると、ros javaで実装していたAndroidアプリが使えなくなります。
色々調査すると、ros2用のjavaライブラリがありましたので、使ってみようと思います。
また、ライブラリに無いmsgなど新規で追加するにはどうすればよいかも調査しましたので、ブログにまとめます。
ros2_javaでAndroid用ライブラリを作成
How to use ROS2 on Android
1.
ros2java-androidのdocker build環境をgithubからcloneします。
git clone https://github.com/YasuChiba/ros2-android-build.git
2.
cloneした環境に入り、docker buildしてdocker imageを生成します。
docker build -t ros2java-android-build ./
3.
ライブラリ作成用のpythonスクリプトを実行します。
こちらを実行すると、dockerコンテナが立ち上がり、コンテナ内で、ライブラリ作成のビルドが走り、ビルド結果のライブラリ(.jarファイルと.soファイル)がホストPC側のoutフォルダに出来上がる仕組みのようです。
※ビルドが終了すると、コンテナは自動削除されます。
python3 run.py ./out/soOut ./out/jarOut
ビルドが終わると、jarファイルとsoファイルが生成されていました。

Android projectにライブラリを組み込む
さて、生成したライブラリ(jarとso)をAndroidプロジェクトに組み込みます。
ROS2ライブラリを使うサンプルAndroidアプリが以下から取得できます。
ros2-android-test-app
生成したjarファイルは、Androidプロジェクトのapp/libsディレクトリ内にコピーします。
soファイルは、Androidプロジェクトのapp/src/main/jniLibs/arm64-v8a内にコピーします。
これで準備完了。
Android端末でROS2でpublishしたり、subscribeしたりできます。
※AndroidでのROS2通信の実装方法についてはもう少し調べて別途纏めようと思います。
補足:ライブラリにないmsg型を追加するには?
ros2_javaのライブラリはだいたいのmsgは対応しているようですが、一部ライブラリに入っていないものもあります。
例えば、can_msgs.Frameなど。
これを追加して、ライブラリを生成するにはどうすればよいかを調査しました。
とりあえず、先程の環境とは別で作りたいので、最初から実行。
別のディレクトリに移り、cloneします。
git clone https://github.com/YasuChiba/ros2-android-build.git
imageは、別名ros2java-android-build-customしてイメージ作成
docker build -t ros2java-android-build-custom ./
スクリプトの中を確認すると、おそらく、ros2_java_android.reposに、追加したいpackageのリポジトリを記載すればよさそう。
ということで、can_msgsを使ってるros2のパッケージ ros2can_bridgeを追記してみました。
|
1 2 3 4 5 6 |
repositories: ros2/ros2can_bridge: type: git url: https://github.com/ROS4SPACE/ros2can_bridge.git version: master |
ダメ元でやってみます。
python3 run.py ./out/soOut ./out/jarOut
やはり、エラーが出ました。
CMake Error at /home/user/workspace/install/rosidl_cmake/share/rosidl_cmake
/cmake/rosidl_generate_interfaces.cmake:229 (message):
Packages installing interfaces must include
'rosidl_interface_packages ' in their
package.xml
単純にはいかないですね。。。
エラー内容をみると、package.xmlに
ROS2用のcan_msgsのパッケージを自分で作成し、自分のgitから落としてビルドするようにやってみます。
まず、ROS2環境でcan_msgsパッケージを作ります。
VNCのROS2環境を実行します。
docker run -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
ROS2環境内で、can_msgsのパッケージを作成します。
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake can_msgs --dependencies std_msgs
package.xmlを編集して、以下追記します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="3"> <name>can_msgs</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="ubuntu@todo.todo">ubuntu</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group> <depend>std_msgs</depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package> |
CMakeList.txtやmsg/Frame.msgを追加し、ビルドします。
colcon build
※can_msgsパッケージの詳細は、gitに登録しましたのでそちらを確認ください。
can_msgs (github link)
can_msgsパッケージを作ったので、自分のホストPCに戻り、
ros2_java_android.reposを以下に変更します。
|
1 2 3 4 5 6 |
repositories: ros2/can_msgs: type: git url: https://github.com/InomaCreate/can_msgs.git version: main |
再度、ros2_javaのビルドを走らせます。
※一度、outフォルダとtmpフォルダを消してから、cleanオプションをつけて実行しました。
python3 run.py ./out/soOut ./out/jarOut --clean
暫く待つと、ビルドが終わり、outフォルダができていました。
中身を確認すると、can_msgs用のjarとsoファイルができていました!成功です。
最後に
かなり試行錯誤でしたが、なんとかROS2用のライブラリが作成できました。
これでAndroidでROS2のUIアプリが作れそうです。
他にも、Unityを使ったりFlutterを使ったり、ROS2のUIアプリを作る選択肢はありそうです。
また色々調べてブログにまとめます。
それでは!!


