CS機器人二次開(kāi)發(fā)端口總結
1. 簡(jiǎn)介
艾利特CS機器人為方便用戶(hù)二次開(kāi)發(fā)而開(kāi)放了一些機器人控制器端口,包括29999、30001、30004、30011、30020、40011等。本質(zhì)都是TCP/IP協(xié)議,29999連接上位機(示教器界面),30001、30004、30011、30020、40011主要連接A9,原理都是通過(guò)socket通訊發(fā)送指定字符串或其它指定格式控制機器人或接收特定的格式數據進(jìn)行解析,目前沒(méi)有動(dòng)態(tài)鏈接庫連接對應的控制器端口,各通訊接口相互獨立,可以同時(shí)使用
2. 操作流程
2.0. 端口簡(jiǎn)介

2.1. 端口選擇
● 29999(Dashboard)端口,可用于機器人的上下電操作、切換機器人的任務(wù)或配置、運行,停止,暫停程序等操作。
● 30001端口,可用于獲取機器人的各種狀態(tài)及數據,機器人會(huì )以10HZ的頻率向30001端口發(fā)送機器人的狀態(tài)數據,還可以往30001端口發(fā)送腳本命令,運動(dòng)指令,控制機器人運動(dòng)等。
● 30004(RTSI)端口,全稱(chēng)為實(shí)時(shí)數據交互,可用于獲取機器人的各種狀態(tài)及數據,以及設置輸入訂閱(改變一下IO變量的值,調整速度滑塊等)與30001端口不同的是可按指定頻率訂閱用戶(hù)指定的數據返回,在返回速率方面最快可達250HZ。
● 30020(解釋器)端口,可用于實(shí)現一些動(dòng)態(tài)的腳本排隊運行,比如用戶(hù)在自己的上位機程序,實(shí)時(shí)計算出一些運行點(diǎn)位,用戶(hù)在程序運行的過(guò)程中,將一些實(shí)時(shí)計算的腳本排隊到當前運行的任務(wù)后。
● 40011(明文狀態(tài)請求)端口,可用于獲取機器人的各種狀態(tài)及數據或者設置機器人相應的參數(運動(dòng)指令和耗時(shí)指令除外),與其他獲取數據端口相比,屬于一問(wèn)一答式數據回復類(lèi)型,上位機發(fā)送對應的請求,機器人返回對應的數據。
● 端口詳細使用說(shuō)明可查看對應的端口使用手冊技術(shù)資料_機器人技術(shù)-艾利特機器人。
2.2. 端口介紹及作用
2.2.1 29999端口介紹及作用
介紹:
29999端口描述的是 EliRobot 機器人平臺開(kāi)放的 dashboard shell,允許用戶(hù)或開(kāi)發(fā)者通過(guò) TcpSocket 連接 EliRobot 的29999端口并對其進(jìn)行訪(fǎng)問(wèn)控制,其中讓包括機器人的上下電操作、切換機器人的任務(wù)或配置、運行,停止,暫停程序等操作。
作用:
EliRobot dashboard shell 提供了大量的命令,以便與 EliRobot 機器人平臺進(jìn)行交互,創(chuàng )建 TcpSocket 客戶(hù)端并連接 dashboard shell 后,發(fā)送對應格式的字符至 EliRobot,即可控制機器人做出相應的命令 。(端口詳細使用教程請查看EliRobot Dashboard 手冊或29999端口使用文檔技術(shù)資料_機器人技術(shù)-艾利特機器人)
2.2.2 30001端口介紹及作用
介紹:
30001端口描述的是 EliRobot 機器人平臺開(kāi)放的數據獲取端口,控制器會(huì )提供機器人的數據狀態(tài),例如關(guān)節角、溫度等等,這些數據都會(huì )通過(guò) socket 打包以10HZ的頻率發(fā)送至連接的客戶(hù)端。
除了獲取機器人的狀態(tài)信息外,還可以通過(guò)30001端口發(fā)送腳本來(lái)控制機器人的各種操作。
作用:
EliRobot 提供了大量狀態(tài)獲取數據,以便與 EliRobot 機器人平臺進(jìn)行監測,創(chuàng )建 TcpSocket 客戶(hù)端并連接 30001端口后,系統會(huì )自動(dòng)返回的對應格式的報文,可查詢(xún)機器人狀態(tài)報文表(30001端口詳細使用教程請查看機器人狀態(tài)報文示例或30001端口使用文檔技術(shù)資料_機器人技術(shù)-艾利特機器人)。
2.2.3 30004端口介紹及作用
介紹:
通過(guò)socket鏈接機器人的30004端口,可以按指定頻率訂閱用戶(hù)指定的數據,例如,用戶(hù)程序socket鏈接30004端口后告訴控制器,需要訂閱”payload”變量,以125HZ發(fā)送,然后控制器就開(kāi)始按125HZ向用戶(hù)程序發(fā)送”payload”的值。這個(gè)功能叫做RTSI 全稱(chēng)為實(shí)時(shí)數據交互(Real-Time Synchronization Interface), 該協(xié)議提供了標準的TCP/IP鏈接, 用于與外部程序進(jìn)行實(shí)時(shí)的數據交互。
- 輸出:機器人輸出整型寄存器的值、末端負載等
- 輸入:機器人浮點(diǎn)輸入寄存器、數字輸入IO的狀態(tài)設置
作用:
- 輸出訂閱:客戶(hù)端向 RTSI 服務(wù)端發(fā)送輸出訂閱項并發(fā)送開(kāi)始信號后,服務(wù)端將按照客戶(hù)端所指定的頻率周期性發(fā)送所訂閱的數據。
- 輸入訂閱:客戶(hù)端向 RTSI 服務(wù)端發(fā)送輸出訂閱項并發(fā)送開(kāi)始信號后,客戶(hù)端可以向服務(wù)端發(fā)送訂閱的變量的值,服務(wù)端將會(huì )把這些值設置到機器人中。
- 消息傳輸:任何時(shí)刻,RTSI 的客戶(hù)端和服務(wù)端都可以向對方發(fā)送普通消息、警告消息、異常消息、錯誤消息。
- 客戶(hù)端運行環(huán)境:可以為任意的外部鏈接程序。
● 30004端口詳細使用教程請查看機器人RTSI使用說(shuō)明或30004端口使用文檔技術(shù)資料_機器人技術(shù)-艾利特機器人。
2.2.4 30011端口介紹及作用
介紹:
30011端口描述的是 EliRobot 機器人平臺開(kāi)放的數據獲取端口,控制器會(huì )提供機器人的數據狀態(tài),例如關(guān)節角、溫度等等,這些數據都會(huì )通過(guò) socket 打包以10HZ的頻率發(fā)送至連接的客戶(hù)端,與30001不同的是不受機器人模式影響,無(wú)法向端口發(fā)送腳本。
作用:
EliRobot 提供了大量狀態(tài)獲取數據,以便與 EliRobot 機器人平臺進(jìn)行監測,創(chuàng )建 TcpSocket 客戶(hù)端并連接 30011端口后,系統會(huì )自動(dòng)返回的對應格式的報文,可查詢(xún)機器人狀態(tài)報文表,可以在機器人任何模式下獲取對應的數據。
2.2.4 30020端口介紹及作用
介紹:
系統進(jìn)入解釋器模式后,允許編程人員在任務(wù)運行時(shí)發(fā)送并排隊運行腳本語(yǔ)句,只需要腳本語(yǔ)句為有效的python語(yǔ)句即可,用戶(hù)可以將腳本語(yǔ)句通過(guò)30020端口,發(fā)送到控制器,控制器解收之后,會(huì )根據當前的狀態(tài),對語(yǔ)句進(jìn)行編譯運行。發(fā)送到30020端口的腳本語(yǔ)句,會(huì )以隊列的方式存儲在控制軟件內部,并按順序執行。
腳本語(yǔ)句必須為單行語(yǔ)句,并以\n作為結束符,如 set_tcp([0,0,0,0,0,0])\n。
● 30020端口詳細使用教程請查看機器人解釋器模式使用說(shuō)明或30020端口使用文檔技術(shù)資料_機器人技術(shù)-艾利特機器人。
作用:
用于實(shí)現一些動(dòng)態(tài)的腳本插隊運行,比如用戶(hù)在自己的上位機程序,實(shí)時(shí)計算出一些運行點(diǎn)位,用戶(hù)在程序運行的過(guò)程中,將一些實(shí)時(shí)計算的腳本插隊到當前運行的任務(wù)當中,腳本語(yǔ)句為有效的python語(yǔ)句且必須為單行語(yǔ)句。
2.2.5 40011端口介紹及作用
介紹:
用于實(shí)現明文TCPIP狀態(tài)請求,客戶(hù)端可以連接到系統的40011端口,通過(guò)下發(fā)固定格式的請求報文,獲取機器人的各種狀態(tài)及數據或者設置機器人相應的參數,屬于一問(wèn)一答式數據回復類(lèi)型,上位機發(fā)送對應的請求,機器人返回對應的數據。該端口與SEC命令相同,不支持運動(dòng)指令、延時(shí)指令等耗時(shí)指令,僅支持不耗時(shí)指令執行。
作用:
目前CS軟件目前30001端口無(wú)返回值,用戶(hù)有較多的獲取返回值的需求(比如請求逆解結果)實(shí)現起來(lái)不夠方便。根據該需求,系統增加40011端口,用于實(shí)現快速的明文數據請求功能。
40011端口類(lèi)似于一問(wèn)一答式與機器人交互。
2.3. 端口比較(獲取數據信息)
30001、30004、30011、40011端口對比(獲取數據信息)
● 30001和30011端口全數據獲取,頻率均為10HZ,區別30001可以響應外部腳本輸入,30011僅用于外部監測機器人狀態(tài),可在任意機器人模式下獲取。
● 30001和30004端口,30001為全數據獲取,頻率為10HZ,30004可訂閱輸出,最高頻率250HZ,例如客戶(hù)只想獲取機器人的力值,可通過(guò)30004端口訂閱,只接收力值,相對于30001更簡(jiǎn)便,無(wú)需考慮或者解析其他數據。
● 40011實(shí)現明文TCPIP狀態(tài)請求,下發(fā)固定格式的請求報文,可直接獲取機器人的各種狀態(tài)及數據,無(wú)需復雜的轉化解析,30001目前無(wú)返回值,相對于用戶(hù)有較多的獲取返回值的需求(比如請求逆解結果),30001實(shí)現起來(lái)不夠方便。
● 獲取數據各個(gè)端口選擇使用,可根據客戶(hù)現場(chǎng)實(shí)際應用來(lái)選擇對應端口。
2.4. 端口比較(控制運動(dòng))
● 30001端口無(wú)法實(shí)現一些動(dòng)態(tài)的腳本排隊運行,只能保持當前的腳本運行,若第一個(gè)移動(dòng)腳本沒(méi)有執行完,下一個(gè)移動(dòng)腳本已經(jīng)下發(fā),第一個(gè)移動(dòng)會(huì )直接停止,執行下一個(gè)移動(dòng)。
● 30020端口用于在一定的條件下,實(shí)現用戶(hù)腳本的排隊運行,比如用戶(hù)在自己的上位機程序,實(shí)時(shí)計算出一些運行點(diǎn)位腳本,第一個(gè)任務(wù)在運行的過(guò)程中,將一些實(shí)時(shí)計算的腳本排隊到當前運行的任務(wù)后。不會(huì )打斷第一個(gè)任務(wù)的執行。
3. 常見(jiàn)問(wèn)題解答
● CS系列支持Python腳本運行,并且腳本分為sec腳本與def腳本,def腳本為主程序腳本,一次僅支持一個(gè)def腳本運行,如果在第一個(gè)def腳本運行過(guò)程中,下發(fā)第二個(gè)def腳本,則會(huì )強制停止第一個(gè)運行中的def腳本,去執行新收到的def腳本,sec腳本可以與def腳本同時(shí)運行,不會(huì )導致def腳本停止,但sec腳本不支持運動(dòng)指令,并且不允許運行耗時(shí)指令(如sleep、串口、socket的超時(shí)操作等),存在一定的限制。
3.1. 29999端口相關(guān)問(wèn)題
● 29999端口 EliRobot dashboard shell 的控制指令在執行時(shí),需要注意機器人的狀態(tài)是否是處于遠程模式,因為有一些指令需要機器人在遠程模式下才生效。
● dashboard命令以”\n”為結束輸入標志,但某些第三方Socket工具設計使用鼠標點(diǎn)擊按鍵提交輸入(不支持物理鍵盤(pán)的Enter提交),因此不會(huì )自動(dòng)在輸入末尾添加”\n”,導致dashboard認為輸入未完成而不予響應,因此此類(lèi)情況需在輸入末尾自行添加結束輸入標志”\n”。
3.2. 30001端口相關(guān)問(wèn)題
● 遠程模式:此時(shí)機器人僅能通過(guò)外部控制源對機器人進(jìn)行控制(比如外部連接30001后,發(fā)送控制腳本),示教器上,會(huì )鎖定,任務(wù)欄
● 本地模式:此時(shí)機器人僅能通過(guò)示教器對其進(jìn)行控制,外部的控制源連接會(huì )被強制斷開(kāi)(即連接到30001的服務(wù)均會(huì )被強制斷開(kāi)),防止發(fā)生危險。
● 普通模式(非遠程與本地模式):如在系統設置中,禁用遠程控制模式,則此時(shí)系統會(huì )處于普通模式,該模式下不會(huì )對通過(guò)30001進(jìn)行的外部控制源進(jìn)行限制,可以理解為是遠程模式+本地模式的狀態(tài),但此時(shí)無(wú)法執行IO的啟動(dòng)程序的功能,并且無(wú)法執行29999 Dashboard中的遠程模式生效的指令。
● tcp通信的連包現象(包含30011端口),這個(gè)不是咱們的特性,所有的tcp通信都可能有這個(gè)現象。(接收到的是不是完整報文,那是根據報文長(cháng)度判斷的,比如報文長(cháng)度是100,本次他直接收到了80,那就要等另外20上來(lái)一起解析)。
3.3. 30004端口相關(guān)問(wèn)題
● RTSI 分為協(xié)議檢查、設置、同步循環(huán)三個(gè)步驟,當 RTSI客戶(hù)端接入時(shí)需要首先進(jìn)行協(xié)議版本的校驗,以確定是否可以繼續進(jìn)行通信
● 數據包都有統一的結構,都為報文頭+報文內容的形式(有的數據包不需要報文內容)
● 不同變量類(lèi)型所占字節數不同
● 協(xié)議數據采用大端模式
● 訂閱輸入輸出需要注意(客戶(hù)搞反)
3.4. 30020端口相關(guān)問(wèn)題
● 目前解釋中運行非運動(dòng)類(lèi)的耗時(shí)腳本(如sleep指令),會(huì )完整的等待sleep命令執行結束后,才可以自動(dòng)退出,中途即使調用了end_interpreter()命令,也不會(huì )強制停止耗時(shí)腳本運行。
● 任務(wù)運行狀態(tài)的控制,比如暫停、繼續、停止等,對解釋器模式同樣生效。
● 解釋器腳本隊列數量上限目前為8500條,腳本隊列數量超過(guò)該數量時(shí),再次添加新的解釋器腳本,會(huì )返回discard信息,并拋棄新添加的腳本。
● 解釋器模式中目前不支持start_thread函數調用,下發(fā)的腳本中,如果包含了start_thread函數調用,會(huì )觸發(fā)對應的discard。
● V2版本的解釋器模式,如果運動(dòng)指令后有轉接半徑設置,并且沒(méi)有在規定時(shí)間內,下發(fā)后續的運動(dòng)指令,會(huì )出現咯噔急停的情況,該現象目前認為是正常情況。
● 請關(guān)注長(cháng)時(shí)間運行,大量腳本隊列運行,內存是否存在異常的持續增加,并且通過(guò)停止運行任務(wù)等操作無(wú)法降低的情況。
● clear_interpreter()函數ack后,會(huì )停止新的腳本ack,此時(shí)新的腳本會(huì )處于等待狀態(tài),只有當clear_interpreter()執行后,才會(huì )將等待狀態(tài)的腳本進(jìn)行ack。
3.5. 40011端口相關(guān)問(wèn)題
● 下發(fā)的id盡量每次不同,這樣便于管理,同時(shí)在一些同時(shí)請求的情況,可以區分返回值與請求之間的匹配關(guān)系,(如果沒(méi)有同時(shí)請求的情況,理論上來(lái)說(shuō)id不變也沒(méi)問(wèn)題,但并非一個(gè)好的請求習慣)。
● 該請求的調用函數規則與SEC函數相同,即不可以執行運動(dòng)指令(如movej命令)、不可以執行耗時(shí)指令(如sleep等),不可以執行無(wú)法退出的命令(如死循環(huán)等)。
● 與SEC命令類(lèi)似,請求命令并不會(huì )打斷正在執行的主函數(即def函數)。