ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【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を追記してみました。

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にrosidl_interface_packagesの記載が必要のようです。

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を編集して、以下追記します。

<?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を以下に変更します。

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アプリを作る選択肢はありそうです。
また色々調べてブログにまとめます。

それでは!!

関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン