- ROSパッケージ内にROSSerialのArduinoコードをまとめて管理したい
- ArduinoはPlatformIOのプロジェクトで開発したい
- まとめてGitHub Actionsで自動ビルドチェックをしたい
この場合のやり方をメモ。
ROSの作法等、全く知らないので基本的に自己流です。
概要
ROSSerialはArduinoやmbedといったいわゆるマイコンをROSの枠組みに取り込むためのフレームワークです。
LEDをトピック通信で光らせたり、簡易的なモータドライバを作ったりするのに使えます。
Arduinoは開発環境としてArduino IDEを用いることがポピュラーですが、PlatformIOというIDEが非常に便利でおすすめです。
PlatformIOはVSCode拡張としてインストールでき、デバッガやテスト機能などできることも豊富です。
基本的にPlatformIOで開発するプロジェクトは、組み込み向けのコードのみで単一のプロジェクトフォルダで管理することが多いようです。
しかし、ROSSerialを使った開発ではPC向けのROSパッケージの中にArduinoのスケッチを一緒に入れて管理、公開したいというケースもあります。
また、ROSもPlatformIOもGitHub Actionsによるテストビルドに公式に対応していることもあり、これらの三つを合わせて活用する方法をメモしておきます。GitHub ActionsでCIを回すと、READMEにこういうバッジが付きます。かっこいい。

ディレクトリ構成
最終的なディレクトリ構成を以下に示します。
赤の部分がPlatformIOのプロジェクト領域になります。
紫の部分はGitHub Actionsのコンフィグです。.github/workflows/main.ymlというような構成にするのが推奨されているようです。
リポジトリのルートに置く必要があるようです。
.
├── .git
├── .github
│ └── workflows
│ ├── ROS1_melodic.yml
│ ├── ROS1_noetic.yml
│ └── Arduino.yml
├── LICENSE.txt
├── README.md
├── ROSSerial_package
│ ├── include
│ ├── lib
│ │ └── ros_lib
│ ├── platformio.ini
│ ├── src
│ │ └── main.cpp
│ └── test
└── ros_package_sample1
├── CMakeLists.txt
└── package.xml
このディレクトリの作り方として、自分は
- catkin_ws/srcにパッケージ群親ディレクトリを作成
- 親ディレクトリ内で“`catkin_create_pkg“`で必要なパッケージ作成
- 親ディレクトリ内にROSSerial用のソースコード置き場のディレクトリを作成(個人的に大抵は~~~_Arduinoとか~~~_rosserialという名前にしている)
- 3で作ったディレクトリ内でplatformIOのプロジェクトを生成
というやり方を良くとっています。自己流です。そもそもROSSerialのソースをまとめてcatkin_ws内のパッケージに入れるのがマナー的に良いのかすらよく分かっていません。
GitHub Actionsの設定
ほとんどテンプレート通りにymlを書くだけです。
workflows下に複数ymlを設置すると、それ毎にテストが入ります。
ymlの最初の行のname:タグがバッジアイコンの表示名になります。
PlatformIOの設定
各パラメータについてはgithub actionsとplatformIOでそれぞれ詳しく解説されているのでそちらを参照。
注意する点として、PlatformIOはデフォルトでプロジェクトがルート直下にあることが想定されているので、ROSpackage化に伴ってディレクトリをまたいでいると動作しません。
なので、最後の行のように、```run: pio run -d ROSSerial_package/
“`みたいに相対のディレクトリを指定してやる必要があります。
name: PlatformIO CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Cache pip
uses: actions/cache@v2
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Cache PlatformIO
uses: actions/cache@v2
with:
path: ~/.platformio
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
- name: Set up Python
uses: actions/setup-python@v2
- name: Install PlatformIO
run: |
python -m pip install --upgrade pip
pip install --upgrade platformio
wget https://github.com/xxxajk/spi4teensy3/archive/master.zip -O /tmp/spi4teensy3.zip
unzip /tmp/spi4teensy3.zip -d /tmp
- name: Install library dependencies
run: pio lib -g install 1
- name: Run PlatformIO
run: pio run -d ROSSerial_package/
ROSの設定
ROSはindustrial_ciを使わせていただきました。基本そのままです。
ディストロごとに実行するといい感じかもです。
name: ROS1 melodic
on: [push]
jobs:
industrial_ci:
strategy:
matrix:
env:
- {ROS_DISTRO: "melodic",
ROS_REPO: "main",
CATKIN_LINT: "false",
OPT_VI: "-vi",
CATKIN_LINT_ARGS: "--ignore unknown_package"}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: 'ros-industrial/industrial_ci@master'
env: ${{matrix.env}}
テスト実行&READMEにバッジを表示
ymlの設定ができたらプッシュするなど設定したアクションに応じてテストが入ります。
無事にパスするとリポジトリのコミットログのところに緑の・が表示されます。
READMEにバッジを表示するには、
以下のようなタームをREADME.mdに追加します。
ymlトップののname:タグに設定したものを指定します。
空白は %20 という文字列に置き換える必要があります。

# ros_led_matrix
コメント