源生態(tài)的六軸機(jī)器人控制系統(tǒng)設(shè)計(jì)實(shí)踐)
簡(jiǎn)介PDF文檔《基于開(kāi)源倍??刂葡到y(tǒng)的機(jī)器人控制系統(tǒng)設(shè)計(jì)》面向機(jī)器人控制、運(yùn)動(dòng)控制與工業(yè)自動(dòng)化方向的研發(fā)人員、高校師生及參賽者圍繞如何構(gòu)建高精度超高速開(kāi)放式機(jī)器人控制系統(tǒng)這一工程問(wèn)題給出了基于倍福Beckhoff開(kāi)源自動(dòng)化平臺(tái)的設(shè)計(jì)方案。壓縮包內(nèi)共1個(gè)PDF文件大小約297KB內(nèi)容精煉但覆蓋系統(tǒng)架構(gòu)、硬件選型、軟件平臺(tái)、通信協(xié)議與時(shí)鐘同步等關(guān)鍵環(huán)節(jié)便于快速建立整體認(rèn)知。目前已有178人學(xué)習(xí)下載。文檔重點(diǎn)介紹了采用XFC技術(shù)提升系統(tǒng)動(dòng)態(tài)響應(yīng)性能以TwinCAT為軟件平臺(tái)選用ARM9S3C2440作為核心處理器并通過(guò)EtherCAT分布式時(shí)鐘實(shí)現(xiàn)多軸同步有效降低各子流程延遲為機(jī)器人多樣化運(yùn)動(dòng)控制提供了可參考的工程思路也可作為相關(guān)課題研究和論文寫(xiě)作的參考文獻(xiàn)。 去年幫客戶搭過(guò)一套六軸關(guān)節(jié)機(jī)器人的控制系統(tǒng)客戶一開(kāi)始抱著“能不能全部用開(kāi)源”的設(shè)想開(kāi)源運(yùn)動(dòng)學(xué)庫(kù)、開(kāi)源示教界面、開(kāi)源EtherCAT主站。結(jié)果一落地實(shí)時(shí)性、驅(qū)動(dòng)兼容性、調(diào)試效率這些現(xiàn)實(shí)問(wèn)題全冒出來(lái)了。最后我們折中成一套“開(kāi)放控制”架構(gòu)以倍福Beckhoff的TwinCAT做實(shí)時(shí)控制核心外圍把ROS2、PyADS、開(kāi)源運(yùn)動(dòng)學(xué)庫(kù)全部接進(jìn)來(lái)做成了一套基于開(kāi)源生態(tài)和倍??刂葡到y(tǒng)的機(jī)器人控制系統(tǒng)。這套方案穩(wěn)定性和開(kāi)發(fā)效率都不錯(cuò)我整理成設(shè)計(jì)筆記適合做機(jī)器人集成、自動(dòng)化設(shè)備開(kāi)發(fā)的工程師參考也適合想從傳統(tǒng)PLC轉(zhuǎn)向開(kāi)放控制架構(gòu)的研究生和愛(ài)好者。整個(gè)設(shè)計(jì)的核心目標(biāo)很簡(jiǎn)單既能享受開(kāi)源生態(tài)的算法紅利又能保住工業(yè)控制該有的實(shí)時(shí)性和可靠性。很多人把“開(kāi)源”和“商業(yè)”對(duì)立起來(lái)實(shí)際做項(xiàng)目根本不是這么回事。機(jī)器人的運(yùn)動(dòng)控制鏈路里實(shí)時(shí)關(guān)節(jié)插補(bǔ)、伺服同步、安全邏輯這一類(lèi)需要確定性極強(qiáng)的實(shí)時(shí)系統(tǒng)去扛純開(kāi)源方案不是做不了但要自己啃的東西太多而路徑規(guī)劃、視覺(jué)識(shí)別、逆解算法這些上層?xùn)|西開(kāi)源社區(qū)已經(jīng)很成熟沒(méi)必要從零造輪子。倍福TwinCAT加上EtherCAT總線剛好提供了工業(yè)和開(kāi)放之間的連接點(diǎn)再通過(guò)ADS通信協(xié)議把開(kāi)源生態(tài)掛進(jìn)來(lái)整個(gè)系統(tǒng)就活了。1. 方案選型與總體架構(gòu)1.1 為什么把倍福TwinCAT作為控制核心倍福是PC-Based Control路線的代表廠商TwinCAT 3跑在Windows或嵌入式的實(shí)時(shí)內(nèi)核上本質(zhì)上是一套軟PLC加運(yùn)動(dòng)控制平臺(tái)。選它做機(jī)器人控制核心主要看中三點(diǎn)。第一是開(kāi)放性。TwinCAT 3支持IEC 61131-3標(biāo)準(zhǔn)語(yǔ)言也能直接用C/C寫(xiě)算法模塊還能集成MATLAB/Simulink生成的代碼。這意味著開(kāi)源庫(kù)里用C寫(xiě)的運(yùn)動(dòng)學(xué)算法、濾波算法理論上可以封裝成TwinCAT模塊跑在實(shí)時(shí)任務(wù)里不需要翻譯成梯形圖或者ST這種PLC專(zhuān)用語(yǔ)言。第二是實(shí)時(shí)性。TwinCAT通過(guò)CPU核隔離技術(shù)把Windows的普通任務(wù)和實(shí)時(shí)任務(wù)分開(kāi)保證EtherCAT周期在微秒級(jí)抖動(dòng)范圍內(nèi)。機(jī)器人控制要求位置環(huán)同步周期一般1ms到4ms倍福在這種場(chǎng)景下的表現(xiàn)很穩(wěn)我實(shí)測(cè)過(guò)多次EtherCAT同步抖動(dòng)基本能壓到幾十微秒。第三是EtherCAT總線的開(kāi)放姿態(tài)。EtherCAT協(xié)議本身是開(kāi)放的倍福作為主站可以帶任意支持CoECANopen over EtherCAT協(xié)議棧的第三方伺服驅(qū)動(dòng)器。你不需要整套都用倍福的伺服電機(jī)完全可以在保證控制精度的前提下選性價(jià)比更高的國(guó)產(chǎn)或者日系伺服這點(diǎn)對(duì)控制成本很重要。1.2 開(kāi)源組件在系統(tǒng)中扮演的角色這套系統(tǒng)里的“開(kāi)源”并不是指望TwinCAT本身開(kāi)源而是用開(kāi)源組件撐起控制系統(tǒng)中不要求強(qiáng)實(shí)時(shí)的部分同時(shí)用開(kāi)放的通信接口把它們和TwinCAT打通。我在實(shí)際項(xiàng)目中用到的開(kāi)源組件大概有這幾類(lèi)ROS2承擔(dān)上層智能功能比如視覺(jué)識(shí)別、機(jī)械臂運(yùn)動(dòng)規(guī)劃、狀態(tài)機(jī)調(diào)度跑在Linux工控機(jī)上。開(kāi)源運(yùn)動(dòng)學(xué)庫(kù)比如KDL、Trac-IK、Pinocchio用來(lái)做正逆運(yùn)動(dòng)學(xué)解算、雅可比矩陣計(jì)算替代自己推導(dǎo)矩陣的繁瑣工作。PyADS庫(kù)Python的ADS通信庫(kù)用來(lái)和TwinCAT交換數(shù)據(jù)做監(jiān)控、數(shù)據(jù)采集、離線調(diào)參。開(kāi)源HMI/Web前端用Node-RED或者純Web技術(shù)做示教面板通過(guò)ADS把指令寫(xiě)進(jìn)PLC比傳統(tǒng)觸摸屏靈活。開(kāi)源EtherCAT主站比如SOEM、IgH我在實(shí)驗(yàn)室驗(yàn)證階段會(huì)拿它們模擬從站或者做備選方案正式項(xiàng)目里還是以TwinCAT為主。這里面的核心原則是實(shí)時(shí)鏈路內(nèi)的代碼越簡(jiǎn)潔越好能不塞算法進(jìn)去就不塞非實(shí)時(shí)的智能決策和數(shù)據(jù)處理全部放開(kāi)源生態(tài)里。兩層之間用定義好的接口通信。1.3 系統(tǒng)分層架構(gòu)我把整個(gè)控制系統(tǒng)分成三層每層職責(zé)非常清晰。最上層是智能層Linux系統(tǒng)上跑ROS2做任務(wù)解析、軌跡規(guī)劃、視覺(jué)感知。這一層對(duì)實(shí)時(shí)性要求低但對(duì)算力、庫(kù)生態(tài)要求高適合放開(kāi)源算法。中間是控制層TwinCAT實(shí)時(shí)任務(wù)運(yùn)行在Windows或者倍福嵌入式控制器上負(fù)責(zé)EtherCAT主站通信、伺服軸同步、邏輯控制、安全保護(hù)。這層代碼量不大但每一條都要保證確定性和可靠性。最下層是驅(qū)動(dòng)層由EtherCAT總線上掛載的伺服驅(qū)動(dòng)器、IO模塊、安全模塊組成直接驅(qū)動(dòng)電機(jī)和執(zhí)行機(jī)構(gòu)。層與層之間控制層通過(guò)ADS協(xié)議與智能層通信通過(guò)EtherCAT與驅(qū)動(dòng)層通信。很多項(xiàng)目死就死在層級(jí)職責(zé)不分比如硬要把動(dòng)態(tài)避障算法寫(xiě)進(jìn)PLC里結(jié)果CPU占用飆高周期抖動(dòng)變大軸運(yùn)動(dòng)就開(kāi)始不順暢。分層的價(jià)值在于每一層都能獨(dú)立調(diào)試上層壞了下層還能手動(dòng)操作讓機(jī)器人安全停下來(lái)。2. 核心控制邏輯與算法設(shè)計(jì)2.1 機(jī)器人運(yùn)動(dòng)學(xué)建模與正逆解六軸關(guān)節(jié)機(jī)器人的運(yùn)動(dòng)學(xué)是控制系統(tǒng)的數(shù)學(xué)地基。正解是根據(jù)六個(gè)關(guān)節(jié)角度計(jì)算末端位姿逆解則是已知末端位姿反推六個(gè)關(guān)節(jié)角。正解我一般用D-H參數(shù)法建模每根軸對(duì)應(yīng)一個(gè)齊次變換矩陣相乘就得到末端位姿。開(kāi)源庫(kù)里KDL和ROS2的urdf都封裝好了這套計(jì)算不需要自己寫(xiě)矩陣乘法的細(xì)節(jié)。逆解要復(fù)雜一些。六軸機(jī)器人如果滿足后三個(gè)關(guān)節(jié)軸線交于一點(diǎn)Pieper準(zhǔn)則可以推導(dǎo)解析解速度快、精度高適合實(shí)時(shí)控制。球腕結(jié)構(gòu)的工業(yè)機(jī)器人一般都滿足這個(gè)條件。對(duì)于不滿足條件的構(gòu)型就得用數(shù)值迭代解比如雅可比迭代或者Trac-IK庫(kù)里的優(yōu)化算法但迭代法有收斂性問(wèn)題靠近奇異位形的時(shí)候容易發(fā)散。我的做法是先用開(kāi)源庫(kù)在ROS2環(huán)境里把運(yùn)動(dòng)學(xué)驗(yàn)證好生成一份“關(guān)節(jié)角度查找表”或者逆解函數(shù)然后在TwinCAT里用ST語(yǔ)言實(shí)現(xiàn)同樣邏輯保證正逆解結(jié)果一致。如果嫌ST寫(xiě)起來(lái)麻煩也可以把C版逆解封裝成TwinCAT的C模塊這樣實(shí)時(shí)任務(wù)里直接調(diào)用代碼維護(hù)量小很多。2.2 軌跡規(guī)劃與插補(bǔ)軌跡規(guī)劃分為關(guān)節(jié)空間規(guī)劃和笛卡爾空間規(guī)劃。關(guān)節(jié)空間規(guī)劃適合點(diǎn)到點(diǎn)的搬運(yùn)每個(gè)關(guān)節(jié)獨(dú)立規(guī)劃速度曲線笛卡爾空間規(guī)劃適合走直線、圓弧這類(lèi)需要末端保持特定路徑的工藝比如涂膠、焊接。關(guān)節(jié)空間我一般用梯形速度規(guī)劃和S型速度規(guī)劃。梯形簡(jiǎn)單但加速度有突變高速運(yùn)行時(shí)機(jī)身會(huì)抖S型曲線對(duì)加速度做平滑處理運(yùn)動(dòng)更柔順代價(jià)是計(jì)算量大一些。用TwinCAT做這類(lèi)規(guī)劃可以直接使用MC_MoveAbsolute這類(lèi)運(yùn)動(dòng)控制指令它會(huì)自動(dòng)完成加減速處理軸參數(shù)里設(shè)置好速度加速度即可。笛卡爾空間軌跡則麻煩一些需要把末端位姿軌跡離散成插補(bǔ)點(diǎn)每個(gè)點(diǎn)逆解成關(guān)節(jié)角再下發(fā)給伺服。這里有兩個(gè)選擇一是用TwinCAT的CNC功能通過(guò)G代碼描述末端軌跡系統(tǒng)自動(dòng)插補(bǔ)二是在ROS2中用MoveIt生成軌跡點(diǎn)通過(guò)ADS或UDP批量下發(fā)給PLC。前者實(shí)時(shí)性好適合工藝穩(wěn)定、重復(fù)性高的場(chǎng)景后者算法靈活適合需要?jiǎng)討B(tài)避障、視覺(jué)引導(dǎo)的場(chǎng)景。2.3 伺服控制三環(huán)與PDO參數(shù)配置伺服驅(qū)動(dòng)器的控制邏輯分三個(gè)環(huán)電流環(huán)、速度環(huán)、位置環(huán)電流環(huán)響應(yīng)最快速度環(huán)次之位置環(huán)最慢。大多數(shù)EtherCAT伺服驅(qū)動(dòng)器內(nèi)部已經(jīng)實(shí)現(xiàn)了電流環(huán)和速度環(huán)位置環(huán)可以由驅(qū)動(dòng)器自己跑也可以由TwinCAT NC運(yùn)動(dòng)控制來(lái)做。六軸機(jī)器人聯(lián)動(dòng)要求各軸位置同步精度高我傾向把位置環(huán)放在TwinCAT側(cè)所有軸的插補(bǔ)周期統(tǒng)一同步性更有保障。PDO配置是EtherCAT伺服調(diào)試?yán)镒罾@不開(kāi)的環(huán)節(jié)。PDO就是過(guò)程數(shù)據(jù)對(duì)象決定每個(gè)周期主站和驅(qū)動(dòng)器之間交換哪些數(shù)據(jù)。RPDO接收配置控制字、目標(biāo)位置、目標(biāo)速度、運(yùn)行模式等TxPDO發(fā)送配置狀態(tài)字、實(shí)際位置、實(shí)際速度、報(bào)警代碼等。倍福TwinCAT里配置PDO映射的方法是在I/O設(shè)備下掃描出驅(qū)動(dòng)器后進(jìn)入CoE在線界面找到對(duì)應(yīng)的PDO映射對(duì)象把需要的對(duì)象ID填入PDO映射項(xiàng)。常用CoE對(duì)象我列在下面這些是必須搞清楚的核心參數(shù)對(duì)象索引名稱(chēng)作用0x6040Controlword控制字控制伺服使能、急停0x6041Statusword狀態(tài)字讀取伺服當(dāng)前狀態(tài)0x6060Modes of operation運(yùn)行模式比如位置模式/速度模式0x607ATarget position目標(biāo)位置位置模式下寫(xiě)入0x6080Max motor speed電機(jī)最大轉(zhuǎn)速單位與驅(qū)動(dòng)器定義有關(guān)0x6091Gear ratio電子齒輪比用于電機(jī)與機(jī)械負(fù)載的換算0x607DSoft position limit軟件限位防止機(jī)構(gòu)撞機(jī)0x606CVelocity actual value實(shí)際速度反饋PDO映射規(guī)則因驅(qū)動(dòng)器品牌而異但思路一致先確認(rèn)驅(qū)動(dòng)器支持的PDO長(zhǎng)度再按字節(jié)對(duì)齊原則組合對(duì)象最后把參數(shù)下載到驅(qū)動(dòng)器EEPROM里。2.4 TwinCAT與開(kāi)源生態(tài)的融合方式TwinCAT和外部程序通信的官方通道是ADSAutomation Device Specification。只要在TwinCAT路由里配置好AMSNetId和端口號(hào)外部程序就能用ADS讀寫(xiě)PLC變量像敲鍵盤(pán)一樣方便。具體融合方式有四種。第一種是外部直接讀寫(xiě)符號(hào)變量適合監(jiān)控和調(diào)試第二種是調(diào)用TwinCAT的.NET或C接口把開(kāi)源算法打包成動(dòng)態(tài)庫(kù)供PLC調(diào)用第三種是把算法寫(xiě)在C模塊里直接嵌入TwinCAT實(shí)時(shí)任務(wù)第四種是通過(guò)UDP/TCP走自定義協(xié)議把ROS2和TwinCAT連起來(lái)。我最常用的是第一種和第四種。第一種用于日常調(diào)試第四種用于正式的控制流。羅斯2那邊把規(guī)劃好的關(guān)節(jié)角打包成JSON通過(guò)UDP發(fā)給TwinCAT的通信功能塊PLC負(fù)責(zé)解析并執(zhí)行插補(bǔ)。這樣做的好處是兩邊徹底解耦ROS2崩了PLC還能讓機(jī)器人安全停在當(dāng)前位置。3. 實(shí)操過(guò)程從零搭建一套六軸機(jī)器人控制系統(tǒng)3.1 硬件準(zhǔn)備與選型硬件準(zhǔn)備這部分控制器我推薦倍福的CX系列嵌入式控制器比如CX5120體積小、功耗低適合裝在機(jī)器人電控柜里算力足夠跑TwinCAT實(shí)時(shí)任務(wù)。如果后續(xù)要跑視覺(jué)或者更復(fù)雜的算法可以用C6640這種高性能工業(yè)PC把TwinCAT和Linux虛擬化跑在一起不過(guò)這個(gè)方案復(fù)雜度也上去了。伺服驅(qū)動(dòng)器建議選支持CoE的通用EtherCAT伺服我用過(guò)倍福AX5000也用過(guò)其他品牌的驅(qū)動(dòng)器都能通過(guò)PDO配置接入。電機(jī)按關(guān)節(jié)減速比和額定扭矩選型最好帶絕對(duì)值編碼器這樣上電不需要回零用戶體驗(yàn)差很多。IO模塊用EL系列的輸入輸出端子即可安全回路最好配專(zhuān)用的安全端子或者TwinSAFE方案。3.2 TwinCAT實(shí)時(shí)環(huán)境配置環(huán)境搭建這個(gè)環(huán)節(jié)看似簡(jiǎn)單實(shí)際坑最多。裝好TwinCAT 3 XAE后首先要做的是把EtherCAT網(wǎng)卡的驅(qū)動(dòng)換成TwinCAT專(zhuān)用驅(qū)動(dòng)。在TwinCAT XAE的“Real-Time Ethernet”設(shè)置里找到你準(zhǔn)備用于EtherCAT的網(wǎng)卡把綁定關(guān)系切到TwinCAT驅(qū)動(dòng)這一步做錯(cuò)的話系統(tǒng)根本掃不到設(shè)備。然后是實(shí)時(shí)核的配置。打開(kāi)“Real-Time”設(shè)置把CPU的核分配給TwinCAT實(shí)時(shí)任務(wù)建議至少留出一個(gè)獨(dú)立核給實(shí)時(shí)任務(wù)使用Windows和其他程序跑在剩余核上。BIOS里還要關(guān)掉CPU的C-State節(jié)能和動(dòng)態(tài)頻率調(diào)整否則實(shí)時(shí)任務(wù)周期會(huì)出現(xiàn)明顯抖動(dòng)。完成這些后用TwinCAT的實(shí)時(shí)監(jiān)控窗口測(cè)一下抖動(dòng)值如果能穩(wěn)定在幾十微秒就說(shuō)明環(huán)境合格了。3.3 NC軸與伺服驅(qū)動(dòng)器PDO配置實(shí)操在TwinCAT里創(chuàng)建軸和PDO映射我總結(jié)了幾個(gè)標(biāo)準(zhǔn)動(dòng)作。先把EtherCAT主站設(shè)備添加好在I/O設(shè)備里掃描實(shí)際硬件。掃描到伺服驅(qū)動(dòng)器后雙擊進(jìn)入“Process Data”配置頁(yè)。以常見(jiàn)的CIA402對(duì)象為例RPDO需要映射至少四個(gè)對(duì)象控制字0x6040、目標(biāo)位置0x607A、目標(biāo)速度0x60FF、運(yùn)行模式0x6060對(duì)應(yīng)的PDO項(xiàng)是0x1600到0x1603。TxPDO映射對(duì)應(yīng)的0x1A00到0x1A03包含狀態(tài)字0x6041、實(shí)際位置0x6064、實(shí)際速度0x606C、跟隨誤差等字段。配置無(wú)誤后在“CoE Online”里把PDO配置寫(xiě)入驅(qū)動(dòng)器EEPROM斷電保存。如果PDO映射里的對(duì)象長(zhǎng)度和驅(qū)動(dòng)器內(nèi)部定義不一致設(shè)備狀態(tài)會(huì)在OP和SAFEOP之間反復(fù)跳動(dòng)這個(gè)問(wèn)題后面在故障排查部分細(xì)講。軸參數(shù)配置要去NC界面新建一個(gè)軸對(duì)象并將其鏈接到對(duì)應(yīng)的EtherCAT驅(qū)動(dòng)器。NC軸里要設(shè)置用戶單位換算這個(gè)換算直接決定位置指令準(zhǔn)不準(zhǔn)。以我常用的減速比100:1的關(guān)節(jié)為例電機(jī)編碼器每圈131072個(gè)增量輸出軸旋轉(zhuǎn)一圈需要電機(jī)轉(zhuǎn)100圈用戶單位用“度”那么一個(gè)用戶單位1°對(duì)應(yīng)的編碼器增量個(gè)數(shù)是 131072×100÷360約等于36408.89。在NC軸配置里把這個(gè)比例關(guān)系填進(jìn)去PLC里的軸位置值就變成了直觀的度數(shù)而不是一堆脈沖數(shù)。3.4 用Python和PyADS實(shí)現(xiàn)上位機(jī)監(jiān)控PyADS是開(kāi)源社區(qū)里非常成熟的ADS通信庫(kù)安裝簡(jiǎn)單能直接讀寫(xiě)TwinCAT里的符號(hào)變量。我通常會(huì)寫(xiě)一個(gè)小的Python監(jiān)控腳本用來(lái)讀取機(jī)器人各軸的實(shí)際位置、速度、報(bào)警信息數(shù)據(jù)可以存到本地或者推送到Web界面。import pyads # 連接TwinCAT路由里的PLC plc pyads.Connection(192.168.1.10.1.1, 851) plc.open() # 讀取NC軸的實(shí)際位置符號(hào)名和TwinCAT里一致 pos_axis1 plc.read_by_name(MAIN.nActPosAxis1, pyads.PLCTYPE_LREAL) print(軸1實(shí)際位置: {:.3f} deg.format(pos_axis1)) # 寫(xiě)入目標(biāo)速度 plc.write_by_name(MAIN.nSetVelAxis1, 15.0, pyads.PLCTYPE_LREAL) plc.close()這類(lèi)腳本最大的價(jià)值是調(diào)試效率提升。以前調(diào)機(jī)器人的時(shí)候改一個(gè)位置參數(shù)要反復(fù)在觸摸屏上點(diǎn)現(xiàn)在直接寫(xiě)個(gè)小腳本批量下發(fā)、批量記錄幾輪對(duì)比實(shí)驗(yàn)下來(lái)省非常多時(shí)間。不過(guò)要注意PyADS跑在Windows或Linux的非實(shí)時(shí)側(cè)只能用于監(jiān)控和非實(shí)時(shí)的參數(shù)下發(fā)不能拿來(lái)寫(xiě)實(shí)時(shí)插補(bǔ)邏輯。3.5 在ROS2中做一次軌跡規(guī)劃下發(fā)ROS2這塊我常用的組合是URDF描述機(jī)器人模型MoveIt做運(yùn)動(dòng)規(guī)劃再配合Trac-IK做逆解。先在ROS2里啟動(dòng)機(jī)器人描述和運(yùn)動(dòng)規(guī)劃節(jié)點(diǎn)用MoveIt的Python接口給一個(gè)目標(biāo)末端位姿規(guī)劃結(jié)果是一系列帶時(shí)間戳的關(guān)節(jié)角度軌跡點(diǎn)。把軌跡點(diǎn)通過(guò)UDP或者ROS2的topic橋接傳給TwinCAT側(cè)。TwinCAT里寫(xiě)一個(gè)通信功能塊接收軌跡點(diǎn)并放入緩沖區(qū)然后按固定周期讀取緩沖區(qū)的下一組關(guān)節(jié)角度經(jīng)過(guò)平滑處理后發(fā)給NC軸執(zhí)行。這里要特別注意時(shí)間戳同步問(wèn)題ROS2規(guī)劃的軌跡頻率通??刂频煤芨叩掳l(fā)的數(shù)據(jù)如果延遲太大PLC側(cè)就要自己保證平滑過(guò)渡不能讓機(jī)器人直接跳變到下一個(gè)點(diǎn)。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 故障排查速查表做機(jī)器人控制系統(tǒng)不會(huì)一帆風(fēng)順我直接把最常踩的坑整理成一張表現(xiàn)場(chǎng)調(diào)試時(shí)可以先照著排查。問(wèn)題現(xiàn)象可能原因排查方法EtherCAT從站狀態(tài)在OP和SAFEOP間反復(fù)切換PDO映射長(zhǎng)度配置錯(cuò)誤或者從站廠商代碼不兼容檢查過(guò)程數(shù)據(jù)映射核對(duì)每個(gè)對(duì)象的數(shù)據(jù)類(lèi)型和位數(shù)軸使能后立即報(bào)警無(wú)法運(yùn)動(dòng)驅(qū)動(dòng)器STO安全回路沒(méi)有閉合或限位信號(hào)觸發(fā)檢查安全輸入端子狀態(tài)確認(rèn)急?;芈窂?fù)位軸實(shí)際位置和期望位置偏差很大單位換算比例錯(cuò)誤或者編碼器方向反了用低速點(diǎn)動(dòng)測(cè)試對(duì)比NC指令位置和驅(qū)動(dòng)反饋位置上位機(jī)ADS連接超時(shí)TwinCAT路由沒(méi)有添加客戶端或者防火墻攔截檢查T(mén)winCAT路由配置添加客戶端AMSNetId并放行端口運(yùn)動(dòng)過(guò)程中末端軌跡有抖動(dòng)插補(bǔ)周期不穩(wěn)定或者濾波參數(shù)不合適查看實(shí)時(shí)抖動(dòng)監(jiān)控調(diào)整伺服增益和濾波時(shí)間常數(shù)4.2 實(shí)時(shí)性與抖動(dòng)排查EtherCAT系統(tǒng)的實(shí)時(shí)抖動(dòng)直接表現(xiàn)為軸運(yùn)動(dòng)不流暢、軌跡精度差甚至偶爾報(bào)警。我在TwinCAT“Real-Time”窗口里看過(guò)幾種典型情況抖動(dòng)在50微秒以內(nèi)屬于正常100微秒左右還能接受如果超過(guò)500微秒就要檢查環(huán)境了。最容易引發(fā)抖動(dòng)的是Windows系統(tǒng)層面。電源計(jì)劃要切到高性能模式CPU的Turbo Boost如果會(huì)影響實(shí)時(shí)性也可以關(guān)掉。分給TwinCAT的獨(dú)立CPU核不能有任何其他后臺(tái)任務(wù)搶占包括殺毒軟件、Windows Update這些都得在工控機(jī)上禁用。還有一個(gè)容易忽略的點(diǎn)如果你的EtherCAT主站和上位機(jī)通信用的是同一塊網(wǎng)卡通信量大會(huì)上肯定影響實(shí)時(shí)性最好分開(kāi)兩塊物理網(wǎng)卡。4.3 運(yùn)動(dòng)學(xué)與軌跡問(wèn)題運(yùn)動(dòng)學(xué)相關(guān)的問(wèn)題一般出現(xiàn)在兩個(gè)場(chǎng)景逆解選不出解以及笛卡爾規(guī)劃軌跡經(jīng)過(guò)奇異點(diǎn)時(shí)出問(wèn)題。逆解選解要看關(guān)節(jié)限位和工作空間的匹配同一個(gè)末端位姿可能有多個(gè)逆解控制程序要設(shè)定優(yōu)先級(jí)規(guī)則比如按“軸運(yùn)動(dòng)累計(jì)最小”的原則選解。軌跡經(jīng)過(guò)奇異點(diǎn)時(shí)末端速度會(huì)突然變得很大關(guān)節(jié)角速度可能逼近極限甚至飛車(chē)。我在ROS2里用Trac-IK做規(guī)劃時(shí)會(huì)提前檢查雅可比矩陣的條件數(shù)發(fā)現(xiàn)接近奇異就重新規(guī)劃路徑繞開(kāi)奇異區(qū)域。在TwinCAT側(cè)執(zhí)行時(shí)也要給每個(gè)軸設(shè)置軟件限位和速度限幅作為最后一道安全防線。4.4 開(kāi)源組件與TwinCAT版本兼容問(wèn)題開(kāi)源組件版本迭代快和TwinCAT組合起來(lái)偶爾會(huì)有兼容問(wèn)題。PyADS新版本如果和系統(tǒng)中的TwinCAT版本差了比較多可能出現(xiàn)變量類(lèi)型解析錯(cuò)誤比如PLC的LREAL是64位浮點(diǎn)數(shù)但你在Python里用PLCTYPE_REAL32位去讀讀出來(lái)的值就會(huì)莫名其妙地亂跳。凡是涉及浮點(diǎn)數(shù)據(jù)讀寫(xiě)一定要確認(rèn)好類(lèi)型長(zhǎng)度。ROS2版本和Linux系統(tǒng)的搭配也是個(gè)經(jīng)典問(wèn)題。ROS2的發(fā)行版強(qiáng)依賴Ubuntu版本裝的時(shí)候最好按官方支持矩陣來(lái)不要自己去編源碼硬適配。集成開(kāi)源庫(kù)時(shí)還要注意許可證比如某些GPL協(xié)議的庫(kù)如果動(dòng)態(tài)鏈接可以規(guī)避傳染性但如果直接改源碼進(jìn)你的商業(yè)代碼后續(xù)發(fā)布會(huì)有合規(guī)風(fēng)險(xiǎn)這些在項(xiàng)目啟動(dòng)階段就要想清楚。5. 寫(xiě)在最后一點(diǎn)設(shè)計(jì)心得做完這套系統(tǒng)我最深的體會(huì)是控制系統(tǒng)選型的核心不在“要不要用開(kāi)源”而在搞清楚哪些環(huán)節(jié)必須實(shí)時(shí)、哪些環(huán)節(jié)可以開(kāi)放。把實(shí)時(shí)的活交給TwinCAT這種專(zhuān)業(yè)平臺(tái)把智能的活交給開(kāi)源生態(tài)EtherCAT當(dāng)骨骼ADS當(dāng)血管兩邊各司其職系統(tǒng)才穩(wěn)定又靈活。最后再分享一個(gè)小技巧開(kāi)發(fā)階段別急著接真實(shí)機(jī)器人先用TwinCAT的仿真軸或者離線模型把邏輯跑通再用開(kāi)源EtherCAT主站做一個(gè)虛擬從站做通信測(cè)試整套系統(tǒng)的風(fēng)險(xiǎn)會(huì)大幅降低。等仿真全部通過(guò)再接伺服和機(jī)械本體調(diào)試時(shí)間能縮短一半以上。這個(gè)思路不僅適用于機(jī)器人控制凡是要做多軸運(yùn)動(dòng)控制和開(kāi)源算法融合的項(xiàng)目都可以照這個(gè)框架去搭。本文還有配套的精品資源點(diǎn)擊獲取