Linux活用レシピ > ドローンに活用 > ドローンをRaspberryPiとGoで自動飛行させカメラ動画を撮影し録画する方法
このページでは、ドローン「TELLO」をRaspberry PiとGoで自動飛行させカメラ動画を撮影し録画する方法を紹介します。


ドローンをラズパイとGoで自動飛行&撮影(録画)する方法
カメラ動画を録画

自動飛行ができ、カメラ動画のライブ表示ができました、次はカメラの動画を保管(録画)してみましょう。

カメラ動画を保管(録画)できるようコードを変更

    先ほど作った、自動飛行プログラムに、カメラ動画をライブ表示できるようコード(赤文字)を追加しました。そこから動画を保管(録画)するようコード(緑文字)を変更し、実行しましょう。

    まず、Raspbianのメニューから赤枠の部分をクリックしてターミナルを起動します。


    カレントディレクトリに「tellotakeoff-left20-rec.go」をviで作成します。
    pi@raspberrypi:~ $ vi tellotakeoff-left20-rec.go[ENTER]
    
    MPlayerが表示されるまで10秒待ってTELLOが離陸、10秒後に左にスピード「20」で移動し、5秒後に静止その後5秒後に着陸するコードを先ほど書きましたが、ここに以下の通り緑文字で示したコードを増やしています。
    具体的にはTELLOのカメラ動画を「FFmpeg」で、「drone.mp4」ファイルに保存するようにしています。
    package main
    
    import (
        "time"
        "os/exec"
        "fmt"
    
        "gobot.io/x/gobot"
        "gobot.io/x/gobot/platforms/dji/tello"
    )
    
    func main(){
        drone := tello.NewDriver("8888")
    
        work := func() {
    ffmpeg := exec.Command("ffmpeg", "-i", "-", "-acodec", "copy", "-vcodec", "copy", "drone.mp4")
                    ffmpegIn, _ := ffmpeg.StdinPipe()
                    if err := ffmpeg.Start(); err != nil {
                            fmt.Println(err)
                            return
                    }
    
                    drone.On(tello.ConnectedEvent, func(data interface{}) {
                            fmt.Println("Connected")
                            drone.StartVideo()
                            drone.SetVideoEncoderRate(4)
                            gobot.Every(100*time.Millisecond, func() {
                                    drone.StartVideo()
                            })
                    })
    
                    drone.On(tello.VideoFrameEvent, func(data interface{}) {
                            pkt := data.([]byte)
                            if _, err := ffmpegIn.Write(pkt); err != nil {
                                    fmt.Println(err)
                            }
                    })
                    time.Sleep(10 * time.Second)
    
                    drone.Left(0)
                    drone.Right(0)
                    drone.Forward(0)
                    drone.Backward(0)
                    drone.TakeOff()
                    fmt.Printf("TakeOff\n")
    
                    gobot.After(10*time.Second, func() {
                           drone.Left(20)
                           fmt.Printf("Left 20\n")
    
                           time.Sleep(5 * time.Second)
                           drone.Left(0)
                           fmt.Printf("Left 0\n")
    
                           time.Sleep(5 * time.Second)
                           drone.Land()
                           fmt.Printf("Land\n")
                           return
                    })
    
        }
    
        robot := gobot.NewRobot("tello",
            []gobot.Connection{},
            []gobot.Device{drone},
            work,
        )
    
        robot.Start()
    }
    


    「tellotakeoff-left20-rec.go」を実行します。
    pi@raspberrypi:~ $ go run tellotakeoff-left20-rec.go[ENTER]
    
    ※なお既に「drone.mp4」ファイルがあるとエラーになりますのでこのプログラムを実行する前に「drone.mp4」ファイル名前を変更しておくか、削除しておいてください。

    実際に撮影録画した動画が以下になります。10秒待ってTELLOが離陸、10秒後に左にスピード「20」で移動し、5秒後に静止その後5秒後に着陸する。
    その際のTELLO搭載のカメラ動画を「drone.mp4」ファイルに録画できたかと思います。



いかがでしたでしょうか。比較的簡単に自動飛行&撮影(録画)ができました。ただ、自動飛行の品質は「Scratch」でプログラムしたほうが安定している気がしました。