Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonではじめる農業ロボット開発

Makoto Koike
November 20, 2021

 Pythonではじめる農業ロボット開発

#2021/11/20 PyCon mini Shizuoka 2021

Makoto Koike

November 20, 2021
Tweet

More Decks by Makoto Koike

Other Decks in Technology

Transcript

  1. Pythonではじめる
    農業ロボット開発
    #2021/11/20 PyCon mini Shizuoka 2021

    View full-size slide

  2. お前誰よ
    小池 @ike_jpn
    ● キュウリ農家
    ● もぐりの組み込みエンジニア
    ● Pythonでやってること
    ○ 機械学習(時系列データ分析・画像認識)
    ○ プロトタイプ開発全般
    ● 最近やってること
    ○ 農業に使えるモノづくり!
    ○ 減速機付きロボットアーム作りたい!
    <キュウリ等級判別装置の開発>
    <自作ロボットアーム(開発中)>

    View full-size slide

  3. ● スマート農業
    ● 自動化&効率化
    農具を作るの楽しい
    Data
    Analysis
    sensing
    Auto
    mation
    ハウス環境センサ
    培地重センサ
    ボイラー稼働モニタ
    等級選別の自動化
    灌水自動化
    データドリブン
    な経営判断
    もともと農家は
    自ら農具を作ってきた!

    View full-size slide

  4. 最近70歳近くになる母が作った農具

    View full-size slide

  5. 画像認識を用いたキュウリの等級判別器
    ● 出荷時に9つの等級に選別しないといけない
    ● めんどくさい選別作業を楽にしたい
    試作1号機 試作2号機 試作3号機

    View full-size slide

  6. 画像認識を用いたキュウリの等級判別器
    ● Python
    ● Tensorflow
    ● OpenCV
    ● Kivy
    (Mini)
    ● MicroPython

    View full-size slide

  7. https://www.donkeycar.com/
    草取りドンキーカー
    ● Python
    ● Tensorflow
    ● OpenCV
    ● Tornado

    View full-size slide

  8. 今日話すこと
    ● 野菜ピッキングロボットの制作
    ○ myCobot
    ○ RealSense

    View full-size slide

  9. 話さないこと
    なんでROS使わないんですか?

    View full-size slide

  10. 開発のきっかけ
    ● キュウリ選別器の改良(試作4号機)
    ● とりあえず何かに使えそう
    ⇒ 野菜ピッキングロボを作ってみる
    比較的安価でそれなりのロボッ
    トアームが登場
    ・Dobot
    ・UFACTORY
    ・Elephant Robotics
    など
    【価格帯】
     卓上:約8~12万
     小型:約30~60万

    View full-size slide

  11. myCobot 280
    Elephant Robotics社
    myCobot 280
    DoF : 6
    Payload : 250g
    Working radius : 280mm
    M5Stackで制御可能
    https://www.elephantrobotics.com/en/mycobot-en/ より

    View full-size slide

  12. myCobotのセットアップ
    ● 台座を付ける
    ● ファームウェアの書き換え
    ○ MyStudioを使ってTransponderを書き込む
    ○ (参考)「myCobotのすべて」からあげ氏
    ■ https://zenn.dev/karaage0703/books/3be6bad93b0c8e
    ● pymycobotのインストール
    $pip install pymycobot
    開発用PC myCobot
    serial on USB

    View full-size slide

  13. ロボットの眼
    Intel RealSense L515
    depth range    : 0.25 - 9.0m
    depth resolution : 1024x768
    RGB resolution  : 1920x1080
    ※残念ながら2022年2月をもってL,F,Tシリーズはディ
    スコンになることがIntelよりアナウンスされました
    代わりにDシリーズを使ってとのことです.
    https://www.intelrealsense.com/message-to-customers/


    View full-size slide

  14. RealSenseのセットアップ
    ● SDKのインストール
    ○ https://github.com/IntelRealSense/librealsense/releases

    ● RealSense Viewerで動作確認
    ● pyrealsense2のインストール
    $pip install pyrealsense2

    View full-size slide

  15. 構成を考える
    ピッキングロボットの構成
    ● RealSenseの取付位置
    ○ 全体を見渡せる上部に配置
    ● myCobotの位置
    ○ ワークと同じ高さの地面に配置
    ● ワークの運搬先
    ○ とりあえず今回はアームの横に置く
    (持ち上げられれば良い)

    View full-size slide

  16. ● AR(ArUco)マーカで地面とアーム先端の初期位置を検出
    RealSenseによる座標系の検出(1)
    画像からARマーカーを使って,カメラに対する地
    面座標の回転を計測することで,地面に対するカ
    メラの姿勢が分かる.

    View full-size slide

  17. RealSenseによる座標系の検出(2)
    ● ARマーカによる回転&平行移動ベクトルの計測
    corners, ids, _ = cv2.aruco.detectMarkers(color_image, aruco_dict)
    _, rvec, tvec = cv2.aruco.estimatePoseBoard(corners, ids, board,
    camera_matrix, dist_coeffs)
    ● カメラ内部パラメータの取得
    import pyrealsense2 as rs
    ~割愛~
    profile = pipeline.start(config)
    camera_profile = rs.video_stream_profile(profile.get_stream(rs.stream.color)
    intrinsics = camera_profile.get_intrinsics()
    camera_matrix = np.array([[intrinsics.fx, 0, intrinsics.ppx],
    [ 0, intrinsics.fy, intrinsics.ppy],
    [ 0, 0, 1]])
    dist_coeffs = np.array(intrinsics.coeffs)
    座標軸の回転ベクトル,平行移動
    ベクトルが取得できる

    View full-size slide

  18. 座標を可視化すると捗る
    ● 3次元座標変換の計算結果が確認できるといろいろ捗る
    ● OpenGLを使ったグラフィック表示

    http://pyglet.org/
    ● クロスプラットフォームのマルチメディア
    ライブラリ
    ● 使い方はrealsenseのサンプルコード参照
    https://github.com/IntelRealSense/librealse
    nse/blob/master/wrappers/python/example
    s/pyglet_pointcloud_viewer.py


    View full-size slide

  19. 野菜の位置の検出
    ● アーム直下の地面上24cmのライン上をサーチ
    ● 3次元カメラ座標系⇒2次元Depth画像座標系⇒3次元カメラ座標系
    (将来的には,深層学習を用いて掴みやすい位置の検出までやりたい...)
    野菜検出ライン[pix]

    View full-size slide

  20. RealSenseで投影・逆投影
    # 3次元カメラ座標系->2次元depth画像座標系
    p0 = rs.rs2_project_point_to_pixel(depth_intrinsics, points[0]) # ライン右端
    p1 = rs.rs2_project_point_to_pixel(depth_intrinsics, points[1]) # ライン左端
    # 2次元depth画像座標系->3次元カメラ座標系
    points = rs.rs2_deproject_pixel_to_point(depth_intrinsics, [x, y], d)

    View full-size slide

  21. アームを野菜位置まで動かす
    ● 目的の位置までロボットアームを動かすには
    ○ 運動学,逆運動学,軌道計画などロボット工学の知識が必要(ニワカに
    は難しい...)
    ● とりあえず俺は三角関数で行く!

    View full-size slide

  22. myCobotの動かし方(1)
    ● 各関節の角度と移動速度を指定すればよい
    from pymycobot import MyCobot, utils
    port = utils.detect_port_of_basic()
    cobot = MyCobot(port, 115200)
    cobot.sync_send_angles([0., 120., -140., 120., 90., 90.], 30)
    各関節の角度:[J1, J2, J3, J4, J5, J6]
    移動速度  : 0~100
    【注意点】慣れるまではゆっくり動かすこと.
    ・指を挟みます(それほど痛くはないがビックリします)
    ・アームが勢いをつけて机にぶつかったりもします

    View full-size slide

  23. myCobotの動かし方(2)
    ● 結構ガバい
    ○ 指定した位置にきっちり止まるとは限ら
    ない
    ● 目的の角度に到達するまで動かし続ける
    angles = cobot.get_angles() # 現在角度の取得
    if angles != target_angles:
    ~目標角度を強める~
    cobot.sync_send_angles([j1, j2, j3, j4, j5, j6], 30)

    View full-size slide

  24. 実験(失敗編)

    View full-size slide

  25. まとめ
    ● Pythonでロボットアームを動かすことができた
    ○ ロボットの眼  ⇒ RealSense : pyrealsense2
    ○ ロボットアーム ⇒ myCobot : pymycobot
    ● 単純にロボットアームは超楽しい!
    ○ キュウリを持ち上げた時には感動すら覚えた
    ○ いろいろな作業をやらせてみたい

    View full-size slide

  26. 退屈なことはPythonにやらせよう
    https://automatetheboringstuff.com/
    ● やっかいなことに退屈な仕事はなくならない
    ● 変えられないことを受け入れる冷静さと変え
    られることを変える勇気を(二ーバーの祈り
    より)
    最近特に仕事を選ばなくなった
    Python君に助けてもらおう!

    View full-size slide

  27. ご清聴ありがとうございました.

    View full-size slide