ROSSerial×PlatformIO×GitHub ActionsでCIする

  • 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

このディレクトリの作り方として、自分は

  1. catkin_ws/srcにパッケージ群親ディレクトリを作成
  2. 親ディレクトリ内で“`catkin_create_pkg“`で必要なパッケージ作成
  3. 親ディレクトリ内にROSSerial用のソースコード置き場のディレクトリを作成(個人的に大抵は~~~_Arduinoとか~~~_rosserialという名前にしている)
  4. 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 という文字列に置き換える必要があります。

![](https://github.com/<your github name>/<your repositories name>/workflows/PlatformIO%20CI/badge.svg)

# ros_led_matrix

handaru

handaru.net

handaru(はんだる)です。 工作が趣味です。

コメント

コメントを残す

メールアドレスが公開されることはありません。