短いですがこちらに草刈り作業中の動画をアップしました。まだまだ精度を上げていかなくてはいけませんが、まずは草刈り対象物の検知→対象物までの単眼距離推定→対象物への到達→実際に草刈りの実施までを自律的に行うことができるようになりました。
昨日足柄上商工会を訪問して現在開発中のロボットの進捗状況と今後の方向性についてお話ししました。打ち合わせの場には事務局長の野本さんと経営指導員で中井町を担当している岡崎さんのお二方に同席していただきました。昨日は実際ロボットの動くところを見ていただいたほうが良いと考えて、簡単なデモをお見せしました。
お二方は非常に興味を持って見ていただいたようで、今後の方向性について活発に意見交換をさせていただきました。資金繰りについては「神奈川県ビジネスモデル転換事業費補助金」というものがあり、5月一杯まで公募を行っているとのこと。今後高性能3Dプリンタなどを導入する予定があれば、申請してみる価値があるとのことでした。また、ロボットの大量生産を行うのが難しければ、ロボットを買い取るのではなく、貸し出すようなビジネスモデルも考慮すべきではないか、との意見をいただきました。
商工会のみではなく、中井町の産業振興課とも連携をして今後の進め方について話し合いをおこなうということも勧められました。また、岡崎さんからは中井町役場裏にある田んぼをフィールドテストで使用してもよいとの申し出がありましたので、5月下旬から6月初旬に行われる田植えの時期に実際に現地に伺ってテストの進め方を決めていきたいと考えています。
先日4月10日(日)に実家にてフィールドテストを実施しました。今回のフィールドテストでは実際にロボットを地面上で動かして、脚部やカメラの動作を確認することです。まず比較的地面が固く、雑草が密集していない場所を選んで動作させてみました。

この時のテストで気になった点としては、
- 右前にはさみとアームが配置されている関係でロボット全体が前がかりになり、軌道が直線にはならず、弧を描いてしまっている
- 1.と関連するが、右前脚が地面から離れるタイミングでロボット全体が前がかりになるように回転してしまう。右前脚が接地すると姿勢が元に戻る
- 動き出しと撮影のタイミングによって写真がぶれることがある
- 写真中で明るい部分と暗い部分の差が激しい
- 脚部先端部に枯葉が何枚か刺さっている
1,2に関しては先日投稿したように加速度センサ、ホール効果センサ、サーボ角度からロボットの姿勢をフィードバック制御する仕組みが必要だが、現時点では実装していないことが原因となります。
次に場所を変えてもう一度前進歩行パターンの動作テストを実施しました。今度は比較的雑草が密集しており、地面も柔らかい場所を選びました。この時のテストで気になったことは、何といっても
- 脚部先端部が地中に刺さってしまい、ロボット全体が沈み込んでしまった。その結果、脚部を振り出すときに雑草に邪魔されてその場でロボットがスタックしてしまった
ことです。元々脚部の第二リンク(真ん中のリンク)の長さが47[mm]で、水平状態から60°まで回転したときの高さの差は約40[mm]です。従ってもし脚部先端部が10[mm]地面に刺さると、残りの30[mm]しか脚部を持ち上げることしかできなくなります。さらに雑草は地面に近い部分が比較的固いので、サーボの出力が十分でないと、雑草に打ち勝つことができなくなります。サーボのパラメータを変えて最大出力を上げることも可能ですが、今度は消費電力が大きくなり、電池の消耗が激しくなり、十分な作業時間が確保できなくなります。
ということで、今後の対策として脚部第二リンクの長さを47[mm]から90[mm]へ変更することにしました。リンク長さが伸びたことで脚部をより高く持ち上げることが可能になるわけですが、その一方で以下のようなデメリットもあります。
- 脚部先端部がロボットの重心からより離れ、その結果地面からの反作用によるトルクが大きくなる。従って脚部第二リンクの角度を保持するためにサーボの出力が大きくなり、消費電力が上がってしまう。
- 1.と関連するが、ロボット全体の姿勢バランスが崩れる可能性もある
- ホール効果センサやサーボ間をつなぐ配線長さを調整する必要が出てくるかもしれない。
いずれにせよ、脚部第二リンクを伸ばした結果についてはこのブログで改めて触れることにします。
現在開発中のカニを模倣した6足草刈ロボットの写真をCAD図面と共に載せました。このロボットはそれぞれの脚部に3つのサーボモータを持ち、脚部先端部には磁気ホールセンサを利用した圧力計測機能を持っています。ロボット前面にははさみが搭載されていてカメラによって撮影された映像を基に自律的に草刈りをおこないます。コントローラはArduino Nano EveryとRaspberry Pi Zero WHによって構成され、前者には加速度センサ、磁気ホールセンサが接続され、Raspberry Pi に定期的にセンサ情報を送信します。Raspberry Piにはカメラが接続され、Arduinoからのセンサ信号を統合してサーボに対して目的角度を送信します。
ここ数年で比較的大型の草刈ロボットがいくつか開発、販売されていますが、6足の自律型ロボットで草刈りをおこなうというのは恐らく初めてと思われます。現在外部への販売に向けてフィールドテストの真っ最中です。テスト結果は随時ホームページ上にアップしていきますので、興味のある方はぜひご覧ください。
合同会社 Nakai Field Robotics
代表社員 鶴井政雄
カメラを除いてロボットに搭載されるセンサは以下の通りです。
- 3軸加速度センサ(ADXL345, Analog Devices):姿勢の変化、進行方向の変化、衝突の検知
- ホール効果センサ(A1324, Allegro MicroSystems):接地の検知、衝突の検知
- サーボモータ(KRS-3301,Kondo Kagaku,目標角度との差):姿勢の変化、衝突の検知
3.のサーボモータは純粋なセンサではありませんが、モーター+センサという構成なのでセンサとして取り扱うことにします。先日投稿したブログでは加速度センサを障害物回避に利用する手順を示しましたが、そこで示したように加速度だけではなく、速度、変位も後付けで計算できるので非常に有用です。まずは加速度センサを姿勢変化の把握のために利用する場合の具体的な方法を以下に示します。
- 姿勢の変化は、現在の重力加速度ベクトル g_vecと水平時の重力加速度ベクトル g_initの内積をとってそれを1.0と比較することで判断できます。内積をとる前にはまず2つのベクトルを長さ1.0となるように正規化しておきます。水平に近い姿勢の場合は内積の値は1.0に近くなります。また、ロボットがひっくり返ると-1.0に近くなります。
- 今回はロボットに設置されたはさみ及びアームの重量によって常に前掛りの荷重がかかっています。そこで姿勢を補正して水平時の重力加速度ベクトルになるべく近づけるようにします。ロボットの姿勢が前掛りになっている場合、6本の脚部先端部に埋め込まれたホール効果センサを利用した圧力計測では前脚に最も荷重がかかり、次いで中脚、最も荷重が少ないのは後脚となります。さらにはさみ及びアームの重心は右に寄っているので、右前脚に最も荷重がかかり、対角線上の左後脚は最も荷重が軽くなります。
- 同時にサーボモータの目標角度からのずれは、前脚が最も大きく、次いで中脚、最も小さいのは後脚となります。さらにはさみ及びアームの重心は右に寄っているので、右前脚のずれが最も大きく、対角線上の左後脚は最もずれが小さくなります。
- このように加速度センサ、ホール効果センサ、サーボモータそれぞれの出力に関連性が出てきます。姿勢変化の補正はこれら3種類のセンサからの出力を総合的に見て判断します。こうして多角的に見ることで姿勢変化が本当に発生しているかどうかをより精緻に見極めることが可能になります。
- サーボモータの目標角度は、脚部先端部が予め設定された接地点に一致するように逆運動解析によって計算して求めます。
- まずはロボットが歩行を開始していない状態で姿勢の補正をおこない、その後リアルタイムでの補正に移行することにします。
ロボットが雑草を認識した後は、雑草までの距離を推定する必要があります。別のブログ記事でも記載したように今回のロボットは単眼カメラしか搭載していません。カメラがもう一つあれば、視差を利用して距離の推定が行えるのですが、別のアプローチを探る必要があります。今回採用した単眼カメラでの距離推定の処理の流れは以下のようになります。
- 今回の場合、ロボット自体その場で回転することによって相対距離を推定する
- ロボットが雑草を認識したとき、雑草は正面に位置している。ロボット自体がその場でθ回転した後、同じ雑草が画像データ中のどの位置に見えるかで相対距離を推定する
- ロボットから雑草までの距離をd、ロボットの回転角をθとする
- ロボットがθだけ回転したときに、回転前に写っていた物体が回転後の画像データ中のどの位置P(x,y)にあり、ロボットからの距離dがどれ位かを予め何ケースか計測し、d,θ,P(x,y)の関係を求めておく。そうすることで簡単な計算で物体までの距離を推定することができる
- この処理方式のポイントはd,θ,P(x,y)の関係式の導出と回転前後の画像データに含まれる同一物体の推定である。推定はガボールフィルタバンクを利用して得られた回転前後の特徴量ベクトルを求め、距離が最も小さいウィンドウを選択する
画像認識処理によって雑草が見つかった場合の処理の流れは、以下のようになります。
- 雑草がアームの可動範囲内にあるかどうかの判別をおこなう。判別は雑草が前景でハサミが背景であるかどうかでおこなう。はさみ、アーム部分は常にレンズの前に位置しており、遮るものが特になければはさみ、アーム全体を含む画像が256×256の解像度で映し出される。この画像の中からはさみ、アーム部分のみを抜き出す。抜き出した画像のスーパーピクセルを算出し、アームのカバー色およびそれに隣接するはさみ先端の色を持つセグメントのみマスクして他は黒く塗りつぶす。これを画像①とする。下の写真でははさみ先端部がうまく抽出できていないが、カバー部分と同じ素材(青色ニトリルゴム)ではさみ先端部を覆うことによって解決可能である。はさみとニトリルゴムとは異種材料向け接着剤(セメダイン社の多用途3000など)で張り合わせる。
次に現時点での画像を②とする。ROIを画像①に含まれるアームカバーおよびはさみ先端部に限定し、画像②と比較する。比較は画像色情報の減算(画像②ー画像①)結果がある決められた閾値を上回るかどうかで行う。雑草がはさみよりも前面に位置していても、接近しすぎる場合も当然ありうる。しかし、これはスーパーピクセルを求めたときに青色のカバー部分が欠けることによって認識することができる。したがって画像色情報の減算(画像②ー画像①)結果がある決められた閾値を上回ることが期待できる - 雑草がアームの可動範囲内にある場合、雑草の根元付近を特定するための画像認識処理をおこなう。画像認識処理は雑草判別時と同じ仕組み、すなわち学習済みのカスケード分類器を使用するか、動画中に含まれる連続した画像の差分処理によって行う。後者の場合、特に雑草が背景から前景に変化したタイミングあるいははさみが接触したことによって発生する変形を捉える。下の写真は雑草がはさみ先端部の背景だったところから前景に移ったタイミングの例である。前景、背景の判別処理は1.と同様である。
前景、背景判別処理の有利な点は1.の処理が流用できることだが、「どこをはさみで切断するか」という問いには答えてくれない。この点は今後の検討課題だが、アーム部分のサーボ角度からはさみ先端部が地面からどれだけ離れているかは分かるので、極端に雑草上部を刈り込むような動作を行う可能性があれば、処理を一旦中断して雑草探索モードに切り替えることとする。 - 雑草がアームの可動範囲内にある場合、はさみの回転軸付近が雑草の根元に一致するように逆運動解析によってサーボ角度を算出する。ハサミを所定の位置に移動させる前に、ハサミを30°開いた状態にしておく。はさみが雑草の根元をとらえているかどうかの判別は、1.と同様に前景と背景の識別処理によっておこなう。今回の場合ははさみの片側部分が最後面、雑草が中間、はさみのもう片方が最前面の3層となる。はさみが雑草の根元をうまくとらえられなければ、アームを元の位置に戻してから同様の処理を行う。3回試行してもはさみが雑草の根元をうまくとらえられなければ、give upしてアームを元の位置に戻してから別の雑草の探索を続ける
- はさみが雑草の根元をうまくとらえられたら、ハサミを3回開閉するようにサーボに指令を送る。この時雑草が刈り取れたかどうかを判断する処理は現時点では実装しない
- 雑草がアームの可動範囲内になければ雑草の探索を続ける
次にCADを使ったシミュレーション手順については以下のようになります。
- グランド上に新たにボディを作成し、画像を射影する
- 前進歩容パターンでロボットを動作させる
- 画像がカメラの視野角に入っているかどうかを判別する(視野角は水平方向160°、垂直方向90°)。ここでは簡略化してカメラの正面に画像が配置されたことで視野角に入ったと解釈する
- 画像が視野角に入っていたらその画像が雑草を含むかどうか判別する
- 画像に雑草が入っていたら上記の画像認識、アーム、はさみ連動処理をおこなう
- 1枚の画像で動作が確認出来たら、画像枚数を増やす。また、追加画像には雑草を含むケースと含まないケースをランダムに配置する

ロボットを使って草刈りを行う場合、考慮しなければならない点として障害物の取り扱いがあります。障害物取り扱いとしては大まかに以下の2つに分類されます。
- IRセンサ、超音波センサ、ToFセンサ、カメラ(CMOSセンサ)などを利用して先回りして障害物を検知してそれを回避する(アクティブな障害物回避)
- 加速度センサ、圧力センサ、接触センサなどを利用して後付けで障害物に衝突したことを検知してそれを回避する(パッシブな障害物回避)
今回の草刈ロボットにはカメラ、ホール効果センサ(脚部先端)、加速度センサの3種類のセンサが搭載されています。

カメラは草刈の対象となる物体の認識に使用し、障害物回避には使用しません。なぜなら、草刈ロボットの基本歩容パターンは「かに歩き」であり、カメラによる撮影方向とロボットの進行方向が直交しているため、進行方向の様子がタイムリーに取得できないためです。
一応カメラは160°の視野角を持ちますが、それでも進行方向を見据えるには不足しています。どうしても進行方向の様子をカメラでとらえたければ、現在固定されているカメラを可動にするか、進行方向撮影用のカメラを新たに追加するか、ロボット自体がその場にとどまって90°回転するしかありません。カメラの可動化、複数化は機構の複雑化を招き、ロボットの回転は歩容パターンの複雑化を招きます。
ということで、今回はパッシブな障害物回避を選択しました。具体的には以下の手順で障害物を回避していきます。
- ある一定の時間間隔でArduino Nano Everyにつないだ加速度センサからのデータ(X,Y,Z)を取得します。今回はジャイロセンサは搭載していません。なぜなら、ロボットは6足であり安定限界を超えるタイミングがほとんどないためです。障害物とは異なりますが、穴などにロボットの足先がはまった場合には姿勢が急激に変化することもあり得ます。これを回避するためには足先に設置されているホール効果センサからの信号を利用します。
- 予め「障害物がない場合の」加速度センサからのデータを歩容パターン(前進、後退、右旋回、左旋回)ごとに用意しておきます。下図は前進パターンの際の進行方向変位です。グラフは単調減少傾向を示しており、特に障害物がないことがわかります。変位は加速度データの累積和を2回とることで取得しています。
- 次に障害物にぶつかった場合の進行方向変位は下図のようになります。75ステップ付近で変位が逆方向に向いてしまっているのが分かります。
「現時点での歩容パターンと障害物がある場合に加速度センサから得られたデータ」と「2.で予め取得しておいた障害物がない場合のデータ」を比較して、ある閾値を超えた場合には歩容パターンを後退→90°旋回と変化させます。旋回方向は左右ランダムに振っていきます。歩容パターン変化のトリガーとなる「閾値」ですが、実際に障害物に衝突したときの加速度データを何回か取得して経験的に決定していくこととします。閾値を小さく設定すれば、ちょっとしたものにぶつかるたびにイベントが発生し、方向転換を繰り返すことになります。大きく設定すれば明らかに前に進めないのに何度も前進をしようとしてしまいます。ちょうどよい塩梅を見つけ出すにはやはり試行が必要です。このあたりの学習モデルの開発は今後の課題です。
一か月のご無沙汰です。雑草認識の仕組みを色々と試行錯誤していたら一月経ってしまいました。。。ということでブログの更新を再開したいと思います。
現在開発中の草刈ロボットは5メガピクセルの解像度を持った単眼カメラを搭載しています。カメラはCSIでRaspberry Pi Zero WHに繋がっています。まず、雑草かどうかを判別するための大まかな処理手順ですが、以下のようになります(ここでは雑草までの距離推定までは扱いませんので、念のため)。
- 取得した画像から緑色がdominantな四角形領域を選択する
- 選択した領域のスーパーピクセルを計算し、緑色がdominantなセグメントを選択し、他セグメントを黒色で塗りつぶす
- カスケード分類器で緑色がdominantなセグメントが葉脈を含むかどうか判別する
1.の緑色がdominantかどうかは、四角形領域のRGB値のヒストグラム(16分割)を求め、緑色のピークが赤色、青色のピークより右側に来ていることで判別しています。2.ではOpenCVに含まれるスーパーピクセル計算関数を利用しました。また、緑色がdominantかどうかは1.と同じロジックを流用しています。3.のカスケード分類器はOpenCVに含まれるものを利用させていただきました。
緑色がdominantな領域の選択
写真は実家の庭をスマホで撮影したものの内の一つです。元々の写真の大きさは1108 x 1478ピクセルの大きさのものを1/4にリサイズしています。Raspberry Pi Zero WHは、ハードウェアリソースが限られており、画像処理以外にもやらなければならないタスクがあるため、なるべく画素数を絞って処理するようにしています。

この画像データをさらに4つの長方形領域(左上、右上、左下、右下)に等分割し、緑色がdominantな四角形領域をひとつ選択します。選択後の画像データ(左下が選択されている)は下図のようになります。

スーパーピクセルの計算
この画像データに対してスーパーピクセルを計算し、再度緑色がdominantなセグメント以外を黒く塗りつぶしたのが下の写真です。雑草なのに黒くなっている部分がありますが、誤って刈り込まないように厳しめに判定を行っています。

カスケード分類器による仕分け
次にカスケード分類器で緑色部分に葉脈の画像パターンが含まれるかどうかを判別します。学習には正解、背景画像共に700枚用意しました。正解画像のサンプルの内の一つを取り上げると下の写真のようになります。

学習後の分類器を使ってROIを重ねたものが下の写真です。当初は誤って正解とする箇所が散見されたのですが、スーパーピクセルを使って対象領域を絞り込んだのが奏功しています。

いかがでしたでしょうか?なお、今回の手順にたどり着くまでには色々と紆余曲折がありましたが、次のステップは実際にロボットに搭載されたカメラでリアルタイムに雑草認識をおこなう処理を追加していきます。現在鋭意コンテンツ準備中です。