🐝

Thonnyを使ってCoDrone EDUを制御する(飛行編 その1)

2024/08/23に公開

はじめに

この記事ではCoDrone EDUをPythonでプラグラムして飛行させる方法について解説します。
以下のサンプルコードで使用しているcodrone_eduライブラリの詳細(英語)は以下のリンクにあります。

https://docs.robolink.com/docs/CoDroneEDU/Python/Function-Documentation

サンプルコード(1:離陸、ホバリング、着陸)

このサンプルプログラムはCoDroneを離陸させ、10秒間ホバリングさせた後、着陸させるものです。
パソコンのCTRL-Cを押すと緊急停止(全モータ停止による墜落)させるようにもしています。

06.Fly1.py
# 06.Fly1.py

# import codrone_edu library
from codrone_edu.drone import *
from time import sleep

# make drone instance
drone = Drone()
drone.pair()

try:
    drone.takeoff()
    drone.hover(10)
    sleep(10)
    drone.land()
    drone.close()

# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    # drone.land()


サンプルコード(2:前進と後退)

このサンプルプログラムは離陸した後、3秒間ホバーリングし、ピッチ50%で1秒間前進した後、5秒間ホバーリングし、ピッチ50%で1秒間後退し、5秒間ホバーリングの後着陸します。

06.Fly2.py
# 06.Fly2.py

# import codrone_edu library
from codrone_edu.drone import *

# make drone instance
drone = Drone()

# drone.pair()
drone.pair()


try:
    drone.takeoff()
    drone.hover(3)
    
    # reset move parameters, roll, pitch, yaw, and throttle to 0
    drone.reset_move()
    
    # move forward for 1 seconds
    drone.set_pitch(50)
    drone.move(1)
    
    # stay there for 5 seconds
    drone.hover(5)
    
    # move backward for 1 seconds
    drone.set_pitch(-50)
    drone.move(1)
    
    # stay there for 5 seconds
    drone.hover(5)

    drone.land()
    drone.close()

# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    # drone.land()

サンプルコード(3:リストで飛行コマンドを与える)

このサンプルプログラムはリストに飛行コマンドをリストとして与え、リストから順にコマンドを読み込んで飛行するようにしたものです。

06.Fly3.py
# 06.Fly3.py
# Read commands from command list

# import codrone_edu library
from codrone_edu.drone import *

# Command list
COMMANDS = [
    "pair()",
    "takeoff()",
    "hover(5)",
    "land()",
    "close()"
]

            
# make drone instance
drone = Drone()

try:
    for command in COMMANDS:
        c = "drone." + command
        print(c)
        
        # evaluate strings as python command
        eval(c)
    
# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    # drone.land()
  

サンプルコード(4:command.txtからコマンド読み取り)

このサンプルプログラムはCOMMANDFILEで指定される外部ファイル(この例では、command.txtなど)に飛行コマンドを記述し、そのファイルを読み込んで飛行するようにしたものです。

06.Fly4.py
# 06.Fly4.py
# Read commands from the file

# import codrone_edu library
from codrone_edu.drone import *

COMMANDFILE = "command.txt"

# if the file opens successfully
with open(COMMANDFILE, "r") as f:
    # read file as list
    commands = f.readlines()
            
# make drone instance
drone = Drone()

try:
    for command in commands:  
        c = "drone." + command # I'm not sure but Windows users may need to change
        print(c)
        
        # evaluate strings as python command
        eval(c)


# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    # drone.land()

Pythonプログラムを置いたフォルダと同じフォルダに以下の方なcommand.txt ファイルを作成します。
command.txtの内容

command.txt
pair()
takeoff()
hover(5)
land()
close()

サンプルコード(5:コマンドラインからファイル名入力)

このサンプルプログラムは外部ファイルをコマンドラインから指定できるようにしたものです。

コマンドファイルの行頭に#があれば無視するようにしているので、コメント行として使えます。また、空行は読み飛ばすようにしています。

コマンドラインの引数を取得するためにはThonnyの設定も必要になります。
次の手順でThonnyの設定を行なってください。

  1. 表示(View)タブをクリックする。
  2. プログラムの引数(Program arguments)をクリックする
  3. エディタ部の上部にコマンドライン引数入力欄が表示されるので、例えば、command.txtと入力します。
  4. Runボタンをクリックすれば、入力欄に入力した文字列がコマンドライン引数として与えられた状態でプログラムが実行されます。

不要になれば表示タブのプログラムの引数のチェックを外せば入力欄は表示されなくなります。

06.Fly5.py
# 06.Fly5.py
# Read commands from file using argv()
#
# How to give command line arguments
# 1) Click "View"(表示) tab
# 2) Click "Program arguments"(プログラムの引数)
# 3) Input "command.txt", for example, on right top of editor
# 4) Click "Run" button

# import codrone_edu library
from codrone_edu.drone import *
from sys import argv

COMMANDFILE = argv[1]
print(argv[1])

# if the file opens successfully
with open(COMMANDFILE, "r") as f:
    # read file as list
    commands = f.readlines()
            
# make drone instance
drone = Drone()

try:
    for command in commands:
        command = command.strip()  # remove whitespaces
        command = command.replace("\r", "")  # replace \r
        command = command.replace("\n", "")  # replace \n
        
        # ignore blank line and begin with # line
        if command != "" and (len(command) > 0 and command[0] != "#"):
            print(command)
            eval(command)

# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    # drone.land()

サンプルコード(6:sleepコマンド追加)

このサンプルコードは上記のサンプルコードにsleep()コマンドを追加してtime.sleep()できるようにしました。
同様の方法で新しい自分なりの新しいコマンドを追加できるのでやってみてください。

06.Fly6.py
# 06.Fly6.py
# Read commands from file using argv() and sleep command added
#

# import codrone_edu library
from codrone_edu.drone import *
from sys import argv

COMMANDFILE = argv[1]
print(argv[1])

# if the file opens successfully
with open(COMMANDFILE, "r") as f:
    # read file as list
    commands = f.readlines()
            
# make drone instance
drone = Drone()

try:
    for command in commands:
        command = command.strip()  # remove whitespaces
        command = command.replace("\r", "")  # replace \r
        command = command.replace("\n", "")  # replace \n
        
        # ignore blank line and begin with # line
        if command != "" and (len(command) > 0 and command[0] != "#"):
            print(command)

            # we added new command 'sleep' like time.sleep()
            if command.find("sleep") == 0:
                # get the value inside the ()
                wait = int(command[6:-1])
                sleep(wait)   
                
            else:
                eval("drone."+command)


# emergency stop if the CTRL-C key is pressed
except KeyboardInterrupt:
    print("Emergency Stop!")
    #drone.emergency_stop()
    # you may change soft landing instead of emergency stop if needed
    drone.land()

おわりに

単純にコマンドを羅列して実行するだけでは、正確な飛行ができないので、次回はセンサを使用して飛行させる記事を書く予定です。

Discussion