ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

ANKI社のAIロボットCOZMOのカメラ画像をOpenCVに渡す(COZMO SDK)

[technology]COZMO SDKを使って、COZMOのカメラ映像をOpenCVに読み込ませる

COZMOは日本ではタカラトミーから発売されているAIロボットトイです。
www.takaratomy.co.jp

残念ながら開発元の米ANKI社は事業を畳むらしいのですが、我が家では小学生の息子の良い遊び相手として現役で活躍しています。

japanese.engadget.com

さて、このCOZMO、python経由でリモート制御するためのSDKが公開されており、またCOZMOの顔部分にはカメラも付いているのでそのうちのディープラーニングとか使って自律走行させたいと思っていました。
で、手始めにCOZMO君のカメラ画像をpythonスクリプトで読み出し、OpenCVで扱えるnumpyのベクトルに変換する方法を調査しました。

APIリファレンスは公開されているので、これを調べれば良いですが、APIリファレンスを読んでもなかなか全体像を把握しずらく、SDKについているサンプルソースから調査します。
cozmosdk.anki.com

SDKサンプルソースにtutorials/02_cozmo_face/02_cozmo_face_mirror.pyに参考になる実装があります。

    while True:
        duration_s = 0.1  # time to display each camera frame on Cozmo's face

        latest_image = robot.world.latest_image
〜中略〜
        time.sleep(duration_s)

抜粋すると上記の様な感じで、COZMOの制御用クラスcozmo.robot.Robotのインスタンスのworld.latest_imageというオブジェクトを定期的に参照することで、COZMOのカメラ画像を取得出来ます。
実際のカメラ画像はPillowのイメージフォーマットでworld.latest_imageのraw_imageをいうメンバー変数に格納されています。
COZMOのカメラ自体はモノクロですが、このraw_imageはRGBのカラーデータを格納する形式になっています。

このraw_imageをnumpyのarrayに変換すればOpenCVで扱えます。
下記はとりあえずOpenCVにカメラ画像を渡して表示するだけのサンプルです。

最終的にはOpenCVの物体検出器とかと組み合わせてCOZMOの制御を出来る様にしたいと思っています。


#!/usr/bin/env python3
#  Example to pass COZMO camera image to OpenCV function
#  Copyright (C) RC30-popo,2019



import sys
import time
import cv2
from PIL import Image
import numpy as np
import cozmo

def cozmo_camera_test(robot: cozmo.robot.Robot):
    robot.camera.image_stream_enabled = True # Enable COZMO camera capture
    head_action = robot.set_head_angle(cozmo.util.Angle(degrees=0.0),in_parallel=False)
    head_action.wait_for_completed()
    firstTime = True
    try:
        while True:
            duration_s = 0.1
            latest_image = robot.world.latest_image
            if latest_image != None:
                gray_image = latest_image.raw_image.convert('L')

                cv_image = np.asarray(gray_image)
                if firstTime:
                    height, width = cv_image.shape[:2]
                    print('*** Start captureing COZMO camera')
                    print('image height   = ',height)
                    print('image width    = ',width)
                    firstTime = False

                cv2.imshow('frame',cv_image)
                cv2.waitKey(1)

            time.sleep(duration_s)
    except KeyboardInterrupt:
        print('Keyboard Interrupt!!')
        print('Exit Cozmo SDK')
        cv2.destroyAllWindows()
        pass

cozmo.run_program(cozmo_camera_test)