はじめに
ドコモ・テクノロジ*1 サービスインテグレーション事業部の松村です。NTTドコモ クロステック開発部の画像認識チームの中で、画像認識技術を活用したアグリテックによる農業の社会課題の解決を目指しています。 本記事では組み込み(ハード寄り)を触り始めた方を対象とし、業務の 1 つである NVIDIA Jetson *2を使った農業ロボットの紹介と、最近発生したトラブル事例をご紹介します。
除草ロボットの概要
NTT ドコモ クロステック開発部では、農業用除草ロボット(以下、除草ロボット)の開発・実証実験 *3を行なっています。本除草ロボットは、機体を農機メーカー様に作っていただき、その上にコンピュータNVIDIA Jetson を載せ、内製開発したソフトウェアで制御を行なっています。
この除草ロボットは、ロボット前方の単眼(RGB)カメラ画像を入力とし、物体検出やセグメンテーション技術等の深層学習を用いて畑の状況を画像認識し、操舵方向等を算出してモーターの走行制御を行い、また圃場終端の検出、後部の除草機制御を行う事で、圃場の自動除草を行います。 *4 除草ロボットのミドルウェアとして ROS2(Robot Operating System 2)を使用して開発しており、内製したアプリケーションで走行制御しています。
走行機能は、前述の画像認識による自動走行モードと、ラジコンのプロポ(送信機・コントローラの通称)による手動操作モードを備えており、操作者による切り替えを可能としています。プロポによる操作制御や走行用モータードライバ制御、バッテリー情報取得や距離(車軸回転パルス)取得にはマイコン(Arduino)を使っており、ファームウェアや周辺回路基板も内製で試作しています。
CAN のススメ
CAN(Controller Area Network)は、自動車内部の車載ネットワークにも使われている通信インターフェースです。接続は信号線 2 本のみを配線するのみと簡便で、2線の差動電圧方式による通信でノイズに強い特徴があります。また、複数ノードの同時接続・同時通信が可能で 1Mbps までの高速通信ができ、通信エラー検出も可能という、利便性・柔軟性・信頼性が高い特徴があります。
本除草ロボットにおいて、内部機器でやりとりする各情報の通信に CAN を採用しており、ロボットの動脈のような重要な役割を持っています。
Jetson の更改と CAN 通信不調の発生
除草ロボットでは小型であることとコストパフォーマンスを重視し、Jetson TX2 を使って開発していました。2023 年に新しい Jetson Orin シリーズが登場し、シリーズ中最も小型である Jetson Orin nanoへの更改を行いました。小型ロボットに組み込む上で、コンピュータが小さいという事はとても良い事なので す。
Orin nano へ更改した結果、処理能力が格段に上がり、画像認識処理のフレームレート(秒間処理枚数)も増え、走行安定性も向上。Orin nano への更改の効果で、全てが良い方向へ進化しました。
ところが、走行試験を続けているうちに、一部のロボットの動作が不安定になりはじめました。本ロボットはラジコンプロポのスイッチで、手動操作による走行と画像認識による自動走行を切り替えることができ、自動走行時は Jetson から CAN 信号で送られる指示に従って動作します。しばらくロボットを動かしていると突然 CAN 通信が不調になり、それにより自動走行が突然止まってしまう事象が発生しました。
本事象が発生すると、ロボット制御プログラムを再起動しても復旧せず、Orin nano の再起動/電源入れ直しをしないと復旧しない状態になりました。
エラー解析(Jetson)
マイコン基板から1[秒]ごとに CAN 信号(ID:002)を送信するプログラムを作成し、Orin nano で受信する最小構成で実験を行いました。これで余計な送信信号を省き、CAN バスの帯域被疑や、受信バッファ起因の取りこぼしが起きない状態で、解析を行えます。
最低限の環境にしてもエラーが発生しました。本システムはCAN ドライバには OSS のSocketCAN *5を使っており、SocketCANとROS2のやり取りにはOSS のsocketcan_bridge *6 を使っています。
コンソールでは socketcan_bridge の「CAN 受信フレームがエラーである」という情報しか表示されず、それ以上の情報は得られませんでした(下ウィンドウ)。
この時エラーで受信が全くできてないかというとそうでは無く、CAN 通信情報を出力する candump コマンドでは ID 002 が表示され、部分的には受信できている事がわかります(上ウィンドウ)。つまりエラーが出たり出なかったり、不安定な状況になっていました。Jetson 側での解析はここで限界でした。
信号解析
次に、一歩低レイヤに踏み込んで CAN 信号をオシロスコープで確認します。2本の信号線(CAN-H と CAN-L)にプローブを接続して、波形を見てみます。まずは基準を明確にするため、エラーが起きていない 正常時を観察します。
画像は、横いっぱいで 5[秒]です。正常時は1 秒に 1 回のタイミングできちんと送信されているのがわかります。 次にエラー発生時の波形を観察します。
1 秒間に 1 回送信しているはずですが、密過ぎて何もみえません。なんという事でしょう。 全く見えないので CAN フレーム 1 つが見えるまで(時間軸を)拡大します。
画像は、横いっぱいで 500[μ秒]です。オシロスコープの CAN デコード機能で ID 2、データ 0 を 8 つ、チェック用の CRC が送られている事がわかります。*7 次にエラー発生時の波形も拡大します。
正常時と同様に CAN 信号が見えますがデコード情報に赤い表示が出ています。赤い部分はエラーを示しています。CANのデータフレームでは、最後に受信ノードが ACK を返送しますが、この部分が何も返送されておらずエラーとなっているようです。また、CAN信号波形の直前にも同様の波形が見られます。前回の信号から 50[μ秒]しか開いていません。
この事から、何らかの受信エラーが発生し ACK が返送されない事で、信号再送がバースト的に発生している事がわかりました。
原因究明と対策実施
何故マイコンのモーター制御基板送信時にだけ、Orin nano で受信エラーが発生するのか。あらためてマイコン基板の仕様・実装を再確認しました。
複数のマイコン基板のファームウェアのベースは共通で、CAN関連実装部品も CANコントローラーMCP2515、CANトランシーバーMCP2551 に 8MHz の水晶発振子で共通のはずでした。
ところが、ある時期にマイコンのモーター制御基板だけ、水晶発振子はセラミック発振子の実装に変更になっていた事が判明しました。発振子は発振によりクロックを生成する部品ですが、セラミック発振子は水晶発振子より周波数精度が悪いため、通信クロックがばらつき信号波形に何かしらの影響が出ている可能性が見えてきました。
対策として、水晶発振子に付け替えることにしました。ユニバーサル基板をカットし、即席の修正モジュールを作成しました。
ロボットのモーター制御基板からセラミック発振子をはんだ吸い取り機を使って外し、水晶モジュールに付け 替えます。
水晶発振子に付け替えた結果、ぴたりとエラーは出なくなり、問題は解決しました。
考察
Orin nano の CAN 受信エラー問題は解決したものの、なぜ Jetson TX2では発生しないのかという疑問は残りました。
2 つの Jetson 環境の差としては、Jetson 本体の他に、キャリアボード、OS やソフトウェアバージョン等に差分があります。この中で一番可能性がありそうなのが、キャリアボードの違いかもしれません。
JetsonTX2 や Orin nano の Developer board(通常買った時についているボード)にはCAN-IF がついていない為、CAN を使う為にはキャリアボードの交換が必要でした。ロボットへ搭載するために小型であることを重視し、Jetson TX2 には CTI 社 Quasar Carrier を、Orin nano には Seeed社の A603 キャリアボードを選定し、小型かつ CAN の利用ができる組み合わせにしています。メーカーが違うキャリアボードですので、CAN トランシーバ・コントローラ等の採用部品が異なっている可能性はあり、その差で同じ信号波形でも受信可否が別れたのかもしれません。
複数台のロボットを修正し、回収したセラミック発振子を使い追試した結果、型番・外見が全く同じセラミック発振子でもエラーが発生する物と、発生しない物がある事がわかりました。電子部品の性能は製造時にばらつきがありますが、ちょうど閾値ギリギリのラインを踏んでしまったのかもしれません。
さいごに
業務の 1 つである NVIDIA Jetson を使った農業ロボットの紹介と、最近発生したトラブル事例をご紹
介しました。読者のみなさまの何かの参考になれば幸いです。
CAN 通信は一見ハードルが高く感じられるかもしれませんが、非常に安定性が高くお勧めです。今回のような問題が発生すると解析の難易度も高いですが、オシロスコープやプロトコルアナライザを使うことによって解析が可能ですので、クリスマスプレゼントでの導入をお勧めします!
私たちは主にソフトウェア領域のエンジニアとして業務を行なっていますが、今回の除草ロボットはハードウェア制御、回路設計、CAN 通信等の領域に踏み込んだ結果、困難なトラブルに遭遇してしまいました。
しかしこのような知見・経験を多く得る事で、高速な開発・デバッグを行え、より良いサービスやプロダクトを、より早く世に出していけると考えています。 今後の除草ロボットの実用化にご期待ください。
補足
*1:ドコモ・テクノロジ株式会社は株式会社 NTT ドコモの機能分担会社で、ドコモグループの研究開発を支えている企業です。 https://www.docomo-tech.co.jp/
*2:NVIDIA及びJetson は、米国またはその他の国におけるNVIDIA Corporation の商標または登録商標です。また、他に記載の会社名および製品名は、各社の商標または登録商標です。
*3:農業・食品産業技術総合研究機構(農研機構)様、みのる産業株式会社様、他と実証実験を実施しています。
*4:ロボット自動走行制御の詳細は、共著論文をご覧ください https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=227948&item_no=1&page_id=13&block_id=8
*5:SocketCAN https://en.wikipedia.org/wiki/SocketCAN
*6:socketcan_bridge https://wiki.ros.org/socketcan_bridge
*7:オシロスコープは波形を見るものですが、今回使った機種は CAN のデコード機能がついている為、データを見ることができます。 このRIGOL DHO800シリーズ はカタログ上CAN デコード機能が書いてないのですが、なぜかできています(謎)。なお 2ch のエントリー機なのは私物のためです(このために買っちった)。