ラズパイ4/4GB(ubuntu 20.04)+ コンテナ+ROS2(Foxy)+ SG90(サーボモータ)という構成
なんでROS2があるのかというと….次回に続くからです^^。
デジタル・マイクロサーボ SG90(Tower Pro):秋月電子で1個400円也。
GPIOの結線
ラズパイのOSイメージはUbuntu Server 20.04 LTS
Jetsonで作成したROS2のドッカーイメージをDocker Hub にpushしておいたものを使います。同じUbuntuベースのarm64(aarch64)アーキテクチャなので可能ですが、X86-64 (amd64) のWindowsでは不可です。
初期設定やDocker のインストール、ROS2のイメージのDLなどはこのページをご参照ください。
/home/ubuntu のディレクトリ構成は適宜、読み替えてください。
コンテナ
作業用ディレクトリを作っておきます。
1 |
mkdir /home/ubuntu/work-ros2 |
コンテナからGPIOを操作するので以下のようなオプションを使います。
コンテナ作成
sudo docker create -it --name my_ros2 --network host --device /dev/gpiomem --device /dev/ttyAMA0 -v /home/ubuntu/work-ros2:/work wisteriahill/ros:foxy-ros-base-l4t-r32.4.4
コンテナ起動
1 |
sudo docker start -i my_ros2 |
アップデート&アップグレード、ライブラリ・パッケージ等のインストール
1 2 3 4 5 6 7 8 |
apt update apt upgrade -y apt install python3-pip python3 -m pip install --upgrade pip apt install nano pip3 install RPi.GPIO |
サーボモータを動かしてみます。
【servo.py】
上図の形を初期位置にします。
アーム(サーボ・ホーンと言うそうです、角?)の部分が行ったり来たりを10回繰り返します(それだけです)。Ctrl + C で強制終了。
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 |
#-*- coding:utf-8 -*- import RPi.GPIO as GPIO import time REPETITION = 10 #繰り返し回数 INTERVAL = 0.5 #回転の間合い PINNUMBER = 14 #GPIO14 FREQUENCE = 50 #Hz GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(PINNUMBER, GPIO.OUT) servo = GPIO.PWM(PINNUMBER, FREQUENCE) def ServoSetCtrl(deg): #アームの位置を角度で設定 duty = (12 - 2.5)/180 * deg + 2.5 + 0 servo.start(duty) def ServoCleanup(): ServoSetCtrl(0) time.sleep(1) GPIO.setup(PINNUMBER, GPIO.IN) #init servo.start(0.0) try: for i in range(REPETITION - 1): ServoSetCtrl(0) time.sleep(INTERVAL) ServoSetCtrl(180) time.sleep(INTERVAL) except KeyboardInterrupt: print("\nCtl+C") except Exception as e: print(str(e)) finally: ServoCleanup() GPIO.cleanup() print("\nFin") |
アームに矢印を貼ったりして意味を持たせると、より分かりやすくなります。
方位センサーやGPSなどと組み合わせれば「目的の場所はどっち?」を指示してくれます。
1 |
python3 servo.py |
グルグル回転させたい場合はこの方のブログ参照
また、使っているライブラリとの組み合わせだとアームがしばしばプルプルと微振動します。ジッターという現象だそうです。気になる方はこの用語で検索して対処法を探してみてください^^。
Appendix
コンテナからI2Cデバイスに接続する場合
1 |
--device /dev/i2c-1 |
Next
ROS2のDDS を使ってJetsonからメッセージを送り、ラズパイのサーボモータを任意の角度で動かしてみます。
DOMAIN_IDを設定することで、対象となる1機のラズパイにのみ、データを持つメッセージを1度だけpublish してみます。
Jetsonからラズパイにメッセージを届けてみる(ROS2/DDS)
Leave a Reply