他にどんな操作ができるのかなと思って、ドキュメントを探す。
ここに SDK2.0のマニュアルがあった。
とりあえず、 上昇、下降、 left , right , flip_front/back/left/rightを追加。
ついでにコマンドベースでできるように変更しようと思い、プログラムを微修正。
おおおお。これで基本確認は完了。
import logging
import socket
import sys
import threading
import time
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger(__name__)
DEFAULT_DISTANCE = 0.30
DEFAULT_SPEED = 10
DEFAULT_DEGREE = 10
class DroneManager(object):
def __init__(self, host_ip='192.168.10.2', host_port=8889,
drone_ip='192.168.10.1', drone_port=8889,
is_imperial=False, speed=DEFAULT_SPEED):
self.host_ip = host_ip
self.host_port = host_port
self.drone_ip = drone_ip
self.drone_port = drone_port
self.drone_address = (drone_ip, drone_port)
self.is_imperial = is_imperial
self.speed = speed
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.bind((self.host_ip, self.host_port))
self.response = None
self.stop_event = threading.Event()
self._response_thread = threading.Thread(
target=self.receive_response,
args=(self.stop_event, ))
self._response_thread.start()
self.send_command('command')
self.send_command('streamon')
self.set_speed(self.speed)
def receive_response(self, stop_event):
while not stop_event.is_set():
try:
self.response, ip = self.socket.recvfrom(3000)
logger.info({'action': 'receive_response',
'response': self.response})
except socket.error as ex:
logger.error({'action': 'receive_response',
'ex': ex})
break
def __dell__(self):
self.stop()
def stop(self):
self.stop_event.set()
retry = 0
while self._response_thread.isAlive():
time.sleep(0.3)
if retry > 30:
break
retry += 1
self.socket.close()
def send_command(self, command):
logger.info({'action': 'send_command', 'command': command})
self.socket.sendto(command.encode('utf-8'), self.drone_address)
retry = 0
while self.response is None:
time.sleep(0.3)
if retry > 3:
break
retry += 1
if self.response is None:
response = None
else:
response = self.response.decode('utf-8')
self.response = None
return response
def takeoff(self):
return self.send_command('takeoff')
def land(self):
return self.send_command('land')
def move(self, direction, distance):
distance = float(distance)
if self.is_imperial:
distance = int(round(distance * 30.48))
else:
distance = int(round(distance * 100))
return self.send_command(f'{direction} {distance}')
def up(self, distance=DEFAULT_DISTANCE):
return self.move('up', distance)
def down(self, distance=DEFAULT_DISTANCE):
return self.move('down', distance)
def left(self, distance=DEFAULT_DISTANCE):
return self.move('left', distance)
def right(self, distance=DEFAULT_DISTANCE):
return self.move('right', distance)
def forward(self, distance=DEFAULT_DISTANCE):
return self.move('forward', distance)
def back(self, distance=DEFAULT_DISTANCE):
return self.move('back', distance)
def set_speed(self, speed):
return self.send_command(f'speed {speed}')
def clockwise(self, degree=DEFAULT_DEGREE):
return self.send_command(f'cw {degree}')
def counter_clockwise(self, degree=DEFAULT_DEGREE):
return self.send_command(f'ccw {degree}')
def flip_front(self):
return self.send_command('flip f')
def flip_back(self):
return self.send_command('flip b')
def flip_left(self):
return self.send_command('flip l')
def flip_right(self):
return self.send_command('flip r')
if __name__ == '__main__':
drone_manager = DroneManager()
drone_manager.takeoff()
time.sleep(10)
drone_manager.forward()
#time.sleep(5)
drone_manager.forward()
#time.sleep(5)
drone_manager.forward()
#time.sleep(5)
drone_manager.forward()
#time.sleep(5)
drone_manager.right()
#time.sleep(5)
drone_manager.back()
#time.sleep(5)
drone_manager.back()
#time.sleep(5)
drone_manager.back()
#time.sleep(5)
drone_manager.back()
#time.sleep(5)
drone_manager.left()
#time.sleep(5)
drone_manager.up()
#time.sleep(5)
drone_manager.up()
#time.sleep(5)
drone_manager.flip_front()
time.sleep(5)
drone_manager.flip_back()
time.sleep(5)
drone_manager.flip_left()
time.sleep(5)
drone_manager.flip_right()
time.sleep(5)
drone_manager.down()
time.sleep(5)
drone_manager.down()
time.sleep(5)
drone_manager.land()
drone_manager.stop()