【自律型ロボット製作記】#1 ラズパイ+ROSでリモコン操作で動くロボットのシャーシ部を作る
こんにちは、koheiです。
あけましておめでとうございます。
2020年、ずっとやりたかったオリジナルロボット製作にチャレンジしたいと思います。
まずは、キャタピラー型の移動ロボットにROSやラズパイ、各種センサーをつけて、自宅内を自律的に走行する「お手伝いロボット」を作ります。
目次
ロボットの構成
今回作製するロボットの構成は、以下のようになります。
・Androidスマホに入れた「ROS Control」アプリから、速度情報を通知して、ラズパイのROSで受け、それをDCモーター用の指示値に変換して、DCモーターを動かします。
購入部品
冬休みに入りまとまった時間がとれそうだったので、若干勢いで以下の部品を購入してみました。
Devastator タンク移動ロボットプラットフォーム (メタル DC ギヤモータ)
こちらは、ロボットのシャーシ部に使うために購入。同額のシャーシはアマゾンに色々売っていますが、一番評価が高かったのでこちらを購入しました。
ビット・トレード・ワン Raspberry Pi用汎用電動機制御基板 ADRPTB8C
半田不要で、DCモーターが簡単に動かせるということで、ラズパイ用の制御基板「ADRPTB8C」を購入しました。
Anker PowerCore 10000
ラズパイ用のモバイルバッテリーとして購入しました。
1.ラズパイ3B+にUbuntu+ROSシステムをインストールする
事前準備として、ラズパイ3B+にUbuntu+ROSを入れます。
以下サイトでSDイメージが取得できます。
Ubuntu16.04 + ROS Kineticです。ラズパイにubuntuとROSを入れるのは苦労した記憶があるのですが、すごく便利なサイトがあり助かりました。
Ubiquity Robotics Downloads
Etcherというツールで、ダウンロードしたイメージをSDに焼き込みます。
ツールは以下からダウンロードできます。
balenaEtcher
2.シャーシ部を組み立てる
Devastator タンク移動ロボットプラットフォームを組み立てていきます。
組立自体は難しくなく、1時間ぐらいで組み上がりました。
※説明書は英語と中国語で書かれています。
全部組み上げる前に、DCモーターがちゃんと動くかを確かめたかったので、一旦この状態で止めておきます。
3.DCモーターテスト
DCモーターが作動するかテストしてみました。
その前に、ADRPTB8Cを使うための下準備がいります。(I2Cの有効化、ライブラリのインストールなど)
そのあたりの設定は、以下サイトを参考にさせていただきました。ありがとうございました。
ADRPTB8C制御基盤を使った本格的なロボット開発 for ラズパイ
早速、ADRPTB8CとラズパイとADRPTB8CとDCモーターを接続してテストコードを動かしてみました。
ちゃんとDCモーターが動きました!
4.ROS cmd vel受信→DCモーター用指示値への変換ロジックを作る
スマホから通知される速度情報(cmd_vel)をDCモーター用の速度指令値に変換して、DCモーターへ通知するPythonプログラムを作ります。(コードは以下)
※コードは、自己流でかなり試行錯誤していますので、ご注意ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#!/usr/bin/python from Adafruit_MotorHAT import Adafruit_MotorHAT import rospy from geometry_msgs.msg import Twist from nav_msgs.msg import Odometry from geometry_msgs.msg import TwistStamped,Twist,Vector3 from time import sleep import numpy as np mh = Adafruit_MotorHAT(addr=0x60) myMotor1 = mh.getMotor(1) myMotor2 = mh.getMotor(2) NODE_NAME_STR = 'inobo_dcmotor' CMD_VEL_STR = 'joy_teleop/cmd_vel' TREAD = 0.22 #TRED 0.20m LIMIT = 1.00#0.70 SPEED_MAX = 255 ANGULAR_BOOST = 1.5 def callback(msg): rospy.loginfo("%s ' Linear [%f, %f, %f]"%(CMD_VEL_STR, msg.linear.x, msg.linear.y, msg.linear.z)) rospy.loginfo("%s ' Angular [%f, %f, %f]"%(CMD_VEL_STR, msg.angular.x, msg.angular.y, msg.angular.z)) v_r = (-1*msg.angular.z*ANGULAR_BOOST*TREAD/2 + msg.linear.x)*SPEED_MAX*LIMIT v_l = (msg.angular.z*ANGULAR_BOOST*TREAD/2 + msg.linear.x)*SPEED_MAX*LIMIT if v_r > 0 and v_l > 0: rospy.loginfo("forward!!") myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(abs(int(v_r))) myMotor2.setSpeed(abs(int(v_l))) elif v_r > 0 and v_l < 0: rospy.loginfo("right!!") myMotor1.run(Adafruit_MotorHAT.FORWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(abs(int(v_r))) myMotor2.setSpeed(abs(int(v_l))) elif v_r < 0 and v_l > 0: rospy.loginfo("left!!") myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.BACKWARD) myMotor1.setSpeed(abs(int(v_r))) myMotor2.setSpeed(abs(int(v_l))) elif v_r < 0 and v_l < 0: rospy.loginfo("back!!") myMotor1.run(Adafruit_MotorHAT.BACKWARD) myMotor2.run(Adafruit_MotorHAT.FORWARD) myMotor1.setSpeed(abs(int(v_l))) myMotor2.setSpeed(abs(int(v_r))) else: myMotor1.run(Adafruit_MotorHAT.RELEASE) myMotor2.run(Adafruit_MotorHAT.RELEASE) #myMotor1.setSpeed(abs(int(v_r))) #myMotor2.setSpeed(abs(int(v_l))) rospy.init_node(NODE_NAME_STR, anonymous=False) try: rospy.Subscriber(CMD_VEL_STR, Twist, callback) except rospy.ROSInterruptException: import traceback traceback.print_exc() rospy.spin() |
作ったプログラムをROSで実行するため、ROSのパッケージにします。
catkin_wsの配下のsrcフォルダ内に作ったPythonプログラムを配置します。
srcフォルダへ移動して、以下コマンドを実行します。
~/catkin_wsに移動して、以下コマンドを実行します。
5.走行テスト
さっそく走行テストしてみます。
ラズパイ側にログインして、以下コマンドを実行します。
これで、roscoreが立ち上がります。
次に別のターミナルを開いて、作成したプログラムを実行します。
次に、AndroidスマホにインストールしたROS Controlで、ラズパイに接続し、リモコン操作します。
ちゃんとキャタピラーが動きました!!
最後に
次は、ROS+SLAMで地図作成、自律走行などを実現できるように
がんばります!!
それでは!!
スポンサーリンク