LineBot控制Tello

最近買了一台Tello,玩具等級的東西,但操控起來卻很穩定。除了遙控模式外,它還提供了文字命令模式,讓我們可以用phthon、node.js以及Scratch來控制它。之前,我用LineBot控制了很多東西,Tello怎麼能放過。Tello本身是利用WIFI連線,讓手機、電腦、平板等連上它並進而控制它,但這就代表和它連線的手機、平板,連上它之後便會喪失了連上Internet的能力,而LineBot卻是必須透過Internet來傳送訊息。為了解決這個問題,要把LineBot程式放在同時連接著有線網路以及WIFI的電腦上,才能讓Line傳送訊息到封閉的Tello網路裡。

用Line的文字介面就可以控制Tello

用Line控制Tello

用Line控制Tello

利用LineBot控制Tello的步驟:

一、準備一台電腦,使用網路線連接上網路。

二、在電腦上準備好LineBot程式,在d:建立tello資料夾,資料夾裡面建立Line_Tello.py這個檔案,檔案內容如下:

# coding=utf-8
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import threading, socket, sys, time

#這邊的port是和Line伺服器溝通的port,可以修改成你要想run的port
myPort=8090

app = Flask(__name__)

#請修改以下的程式,加入自己Line的channelAccessToken以及channelSecret
line_bot_api = LineBotApi('這裡改成自己Line的channelAccessToken')
handler = WebhookHandler('這裡改成自己Line的channelSecret')

host = ''
port = 9000
locaddr = (host,port) 

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#192.168.10.1是Tello的IP
tello_address = ('192.168.10.1', 8889)
sock.bind(locaddr)
myId=''
getId=False

def recv():
    count = 0
    while True: 
        try:
            data, server = sock.recvfrom(1518)
            data=data.decode(encoding="utf-8")
            data=data.replace('\r\n','')
            print(data)
            line_bot_api.push_message(myId, TextSendMessage(text=data))
        except Exception:
            print ('\nExit . . .\n')
            break

#recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()


@app.route("/", methods=['POST'])
def index():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

#以下從Line伺服器收到Tello控制命令後,用sock.sendto()傳送命令給Tello
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global myId
    global getId
    if not getId:
       myId=event.source.user_id
       getId=True
    if event.message.text=="end":
       sock.close()
    else:
       sock.sendto(event.message.text.encode(encoding="utf-8"), tello_address)
    #line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))

if __name__ == "__main__":
    app.run(host='0.0.0.0', port= myPort)

三、下載ngrok程式,ngrok的下載位置,https://ngrok.com/download,這個程式會幫我們在Line伺服器以及自己的電腦建立虛擬通道,並產生一個https的專用網址,複製這個網址,並在Line伺服器設定這個網址。點選下載下來的ngrok,執行如下的指令:

ngrok http 8090

以上的8090必須和程式碼當中所設定的Line Bot的port一致

ngrok會取得一個https的網址(如下圖圖片所示),將自己取得的https網址填入Line的Message API的Webhook URL,讓Line的伺服器可以識別得到您的電腦。這個ngrok程式不要關掉,如果關掉再重新啟動ngrok,又會重新取得一個不一樣的https網址。

四、將以上ngrok所取得的https網址,填到Message API裡的Webhook URL欄位裡

五、python要執行Line Bot程式,必須安裝以下的套件,進入MS-DOS模式,執行

pip install Flask
pip install line-bot-sdk

六、將Tello電源打開,電腦的無線訊號連線Tello的WIFI的SSID

七、在電腦的MS-DOS模式下開始執行以下的Line Bot程式

d:
cd \tello
py Line_Tello.py

八、接下來便可以在Line上面下指令,控制Tello了,控制Tello的指令,請參考以下大疆提供的PDF檔

https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf

比較重要的是,要能夠利用文字模式控制Tello,第一個要下的指令是:command,才能夠下其他的指令。

也可以將常用的指令,做成Line的圖文選單,方便遙控Tello,Line圖文選單的製作請參考我之前的文章:

如何建立LineBot圖文選單

利用Line的文字介面輸入Tello的控制指令

也可以將常用的指令,做成Line的圖文選單,方便遙控Tello

也可以將常用的指令,做成Line的圖文選單,方便遙控Tello