最近買了一台Tello,玩具等級的東西,但操控起來卻很穩定。除了遙控模式外,它還提供了文字命令模式,讓我們可以用phthon、node.js以及Scratch來控制它。之前,我用LineBot控制了很多東西,Tello怎麼能放過。Tello本身是利用WIFI連線,讓手機、電腦、平板等連上它並進而控制它,但這就代表和它連線的手機、平板,連上它之後便會喪失了連上Internet的能力,而LineBot卻是必須透過Internet來傳送訊息。為了解決這個問題,要把LineBot程式放在同時連接著有線網路以及WIFI的電腦上,才能讓Line傳送訊息到封閉的Tello網路裡。
用Line的文字介面就可以控制Tello
用Line控制Tello
用Line控制Tello
一、準備一台電腦,使用網路線連接上網路。
二、在電腦上準備好LineBot程式,在d:建立tello資料夾,資料夾裡面建立Line_Tello.py這個檔案,檔案內容如下:
# coding=utf-8from flask import Flask, request, abortfrom 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的portmyPort=8090app = Flask(__name__)#請修改以下的程式,加入自己Line的channelAccessToken以及channelSecretline_bot_api = LineBotApi('這裡改成自己Line的channelAccessToken')handler = WebhookHandler('這裡改成自己Line的channelSecret')host = ''port = 9000locaddr = (host,port) # Create a UDP socketsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#192.168.10.1是Tello的IPtello_address = ('192.168.10.1', 8889)sock.bind(locaddr)myId=''getId=Falsedef 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 createrecvThread = 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 Flaskpip install line-bot-sdk六、將Tello電源打開,電腦的無線訊號連線Tello的WIFI的SSID
七、在電腦的MS-DOS模式下開始執行以下的Line Bot程式
d:cd \tellopy Line_Tello.py八、接下來便可以在Line上面下指令,控制Tello了,控制Tello的指令,請參考以下大疆提供的PDF檔
https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf
比較重要的是,要能夠利用文字模式控制Tello,第一個要下的指令是:command,才能夠下其他的指令。
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello,Line圖文選單的製作請參考我之前的文章:
利用Line的文字介面輸入Tello的控制指令
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello
也可以將常用的指令,做成Line的圖文選單,方便遙控Tello