Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

ロボットの眼 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/
 


Slide 14

Slide 14 text

RealSenseのセットアップ ● SDKのインストール ○ https://github.com/IntelRealSense/librealsense/releases
 ● RealSense Viewerで動作確認 ● pyrealsense2のインストール $pip install pyrealsense2

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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) 座標軸の回転ベクトル,平行移動 ベクトルが取得できる

Slide 18

Slide 18 text

座標を可視化すると捗る ● 3次元座標変換の計算結果が確認できるといろいろ捗る ● OpenGLを使ったグラフィック表示
 http://pyglet.org/ ● クロスプラットフォームのマルチメディア ライブラリ ● 使い方はrealsenseのサンプルコード参照 https://github.com/IntelRealSense/librealse nse/blob/master/wrappers/python/example s/pyglet_pointcloud_viewer.py
 


Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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)

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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 【注意点】慣れるまではゆっくり動かすこと. ・指を挟みます(それほど痛くはないがビックリします) ・アームが勢いをつけて机にぶつかったりもします

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

実験

Slide 25

Slide 25 text

実験(失敗編)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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