この記事は ダーディット株式会社の技術ブログ からのサルベージ品です。
–
代表の遠藤です。
みなさん、ロボット開発していますか!?
弊社では現在、自律走行が可能なロボットの開発に取り組んでおります。 ロボットの制御には ROS(Robot Operating System) を活用させていただいており、 そのおかげで効率よくシステムを開発することができるようになりました。 弊社が注力したい自律走行アルゴリズムの開発に使うことのできる時間が増えており、大変助かっております。
現在弊社で開発しているロボットシステムは、ROSが動く制御システムとロボット側のソフトウェアで独立しています。 そのため、制御システムとロボットとの界面にその仲介をするソフトウェアが必要となっています。 これはこれでよくある話だとは思うのですが、せっかくROSを使っているのですから、 ロボットも ROS のメッセージパッシングの仕組み上で制御出来たら便利なのになぁと常日頃思っていました。
そんな私にぴったりなソフトウェアが、今回ご紹介する micro-ROS です。 本記事では、micro-ROS とは何か簡単にご紹介したのちに、 micro-ROS を動かすための前段階として、FreeRTOS を動かしてみたいと思います。
micro-ROS とは何なのか
まずは ROS公式の micro-ROS 紹介動画 をご覧ください。
micro-ROS は、ROSによって構築されたプロセッサー側のシステムとロボット自体を制御するために一般的に利用される マイクロプロセッサー側のシステムを統合するために作られた、軽量なミドルウェアーとクライアントライブラリーの総称です。 micro-ROS公式ブログの記事 によると、 2018年あたりから活動をしているようです。 思ったより昔からあるんですね。
micro-ROS は以下の7つの特徴を有しています。(公式サイトより和訳)
- ROSのすべてのメジャーなコンセプトをサポートするマイコンに最適化されたクライアントAPI
- ROS 2 とのシームレスな連携
- 非常にリソース制約が強いが、フレキシブルなミドルウェア
- 一般的なビルドシステムを持つ複数のRTOSのサポート
- 制約の少ないライセンス
- 活気あふれるコミュニティーとエコシステム
- 長期にわたるメンテナンス可能性と相互運用性
従来はロボット側とROS側の世界は分離していたわけですが、micro-ROSの登場によって ロボットも含めてすべてが ROS のエコシステムに乗れるようになり、 イノベーションが加速しそうですね。
micro-ROS のアーキテクチャー
micro-ROS のシステムは、複数のレイヤーにて構成されています。 そのアーキテクチャー図を以下に示します。
micro-ROS の本体となるのは、図中のミドルウェアの部分とクライアントライブラリーの部分です。
ROS2 自体が、メッセージ通信を外部の DDS(Data Distribution Service) というミドルウェアー上に展開されており、 通信に関する様々な制御を DDS にお任せとしています。 micro-ROS もその枠組みを踏襲した形となっています。
この図を見るとミドルウェア層が RTOS の上に乗っかっています。 DDS提供元のページ を見ると、ベアメタルでも行けそうな感じはしますが、 ここでは公式の記載に従って、RTOSがいる環境上で実験したいと思います。
FreeRTOS を STM32 マイコンで動かしてみよう!
本当は micro-ROS を動かしたいのですが、まずは順を追って FreeRTOS を動かしたいと思います。
今回使用する機材
今回は手持ちの STM32 Nucleo-64 ボード (NUCLEO-F103RB) を使用します。 今回使用するボードの特徴は以下の通りです。
- 搭載マイコン: STM32F103RBT6
- 最大72MHzクロックの ARM Cortex-M3 CPU
- 20kB の内蔵 RAM
- 128kB の内蔵 Flash
- 最大51本のGPIO
- 16bitタイマー x4
- 12bit ADC x2 (up to 16 ch)
- SPI/I2C x2
- UART x3
- CPUのすべてのピンが引き出されており、容易にアクセス可能
- ユーザー用LED x1
- ユーザー用プッシュスイッチ x1
- ST-LINK(デバッガー)内蔵で、ボードをUSBで接続するだけで開発が可能
- USBシリアル変換内蔵で、ボードをUSBで接続するだけでUART接続が可能
秋月電子にて1,900円で入手できる、大変お手頃かつ便利なボードです。
実は、別のSTM32 Nucleoボードなら ROSコミュニティーによるサポートがある ものもあるのですが、 それらのボードは今回使用するボードよりも高機能なモデルになっています。 今回は秋月でも手ごろに入手可能な、比較的安価なボードでの動作実績を作ることを目標にします。
なお、秋月電子ではより安価なSTM32ボードも売っています。 今後は、より小規模なボード/マイコンでも動作することを目指していきたいと思います。
やってみた
今回は、まずは基本のLチカをやってみたいと思います。
(1): STM32CubeIDE でプロジェクトを作成する
まずは、STM32CubeIDE を開きます。
IDEが開いたら、以下の手順でプロジェクトを作成します。
- File -> New -> STM32 Project を選択
- いろいろと動くのでしばらく待つ
- Target Selection のウィンドウが開くので、 “Board Selector” のタブをクリックする
- Board Filters の “Commercial Part Number の欄に “NUCLEO-F103RB” を入力
- 右側に NUCLEO-F103RB の行が出るので、それをクリックして選択し、 “Next” をクリック
- プロジェクト名を入力して、 “Finish” をクリック。
- “Initialize all peripherals with their default Mode?” と聞かれるので、 “Yes” をクリック
- 他にも何かごちゃごちゃ聞かれるが、“Yes” をクリックして先に進む
この手順で、とりあえずプロジェクトの作成は完了です。 初回は裏で何かダウンロードが走りますが、ほほえましく眺めましょう。
(2): RTOSの設定をする
STM32CubeIDE のプロジェクト作成が終わると、チップ設定の画面 (Pinout & Configuration) の画面に行きます。 この画面に行っていない場合は、画面左の Project Explorer より “xxxx.ioc” をダブルクリックします。
- Pinout & Configuration の画面の、 “Middleware” をクリック
- FREERTOS をクリック
- Interface の選択ボックスをクリックし、 “CMSIS_V2” を選択
- ごちゃごちゃ聞かれたらとりあえず Yes で切り抜けて、コード生成する
これで RTOS を有効にしたコードが生成されます。
(3): 基本のLチカを実装する
ここまでで、FreeRTOSの設定や諸々の初期化は、すでに自動生成コードで済んだ状態になっています。 それでは、Lチカを実装してみましょう。
main.c
を見ると StartDefaultTask()
という関数があります。
この関数が、デフォルトで生成されたタスクの実体になります。
この関数を下記の通り編集することで、Lチカが実現できます。
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
osDelay(500);
}
/* USER CODE END 5 */
}
実装が完了したら、 Run -> Run を押して、ビルドの実行 & ボードへのプログラムの転送を行います。
ここまでできると、Lチカが動いた状態が確認できます。 簡単ですね!!!
今回利用したコード
今回のコードは下記 GitLab リポジトリに置いておきました。 参考までにどうぞ。
まとめ
本記事では、micro-ROS の紹介と、FreeRTOS の立ち上げまでを紹介しました。 本当は FreeRTOS らしい使い方等をやりたかったのですが、とりあえず現時点できたところまでで公開することとします。
今後は、micro-ROS を利用したデモをいろいろと作りこんでいきたいと思いますので、よろしくお願いいたします。