開發機器人硬體時面臨的挑戰之一是處理與電機的通訊,以及根據即時生成的軌跡向其發送命令。由於接受軌跡的電機應遵守時間限制,所以電機驅動器和控制器之間的無縫通訊變得至關重要。此外,控制器還應從電機接收最新的關節狀態(位置、速度、力)資訊,從而能夠驗證軌跡執行情況。然後剩下的最後一項挑戰是實際生成軌跡並將其發送給電機驅動器。
為了滿足這些要求,ROS(機器人作業系統)框架為我們提供了ROS-control和ROS-Moveit等多款工具。ROS (機器人作業系統)是一種軟體框架,實施了最先進的演算法和工具,能夠以最低的工作量簡化機器人硬體和軟體開發。
控制關節作動器的方法可能有多種,例如指定關節位置、關節速度或關節作用力,完全依賴於套用所需的控制水平。由於速度和扭矩控制環路等所有低階處理都是在驅動硬體內執行的,如果關節位置直接用於命令執行器,事情就變得比較簡單。但是,如果使用關節或關節作用力命令執行器,那麽就必須透過執行命令裝置上的控制環路來生成位置介面,在我們的例子中為執行ROS control例項的linux機器。
ROS-CONTROLROS-control是一個ROS package,能夠與以上所述的多種硬體例項對接。為了實作以上目的,ROS-control提供對控制環路實作的抽象表示,從而可以控制任意電機或執行器,而不必考慮其硬體介面。
根據官方檔,ROS-control可原生支持4種型別的硬體介面:
1.關節命令介面
2.關節狀態介面
從圖中可以看出,ROS control使用記憶體位元置與執行器及電機通訊。例如,如果必須使用位置介面命令電機,ROS control只需在記憶體位元置「pos_cmd_」寫入位置要求值,該值將被透過電機的通訊介面傳輸到電機。以帶有Landungsbrücke的TMC4671評估套件為例,這些介面可以是RS232、USB串口或RN171XV/RN42XV無線模組。類似地,對於速度和作用力介面,要求值也被寫入到預先定義的相應記憶體位元置。現在,剩下的問題是,如何從電機讀取關節狀態。與關節命令介面類似,關節值被讀入到記憶體位元置「pos_」、「vel_」和「eff_」。現在,只需以一定的間隔更新這些記憶體位元置,即可命令和讀取關節介面。利用以下的程式碼片段很容易解釋這一過程:
class trinamic: public hardware_interface::RobotHW{ public: trinamic(); void read(); void write();};
這裏,可利用建構函式初始化,比如,通訊介面(在我們使用Landungsbrücke的實作中為串口)。更進一步,在迴圈中定期呼叫trinamic::read()和trinamic::write()函式,從而以固定間隔更新記憶體位元置。
ROS控制器硬體介面啟動並執行後,我們可以生成許多控制器之一,例如position_controllers、velocity_controllers、joint_state_controller、joint_trajectory_controller。這些控制器僅僅是硬體介面作為ROS topics的抽象表示。如上所述,這裏可以使用速度關節介面啟動position_controller,使控制環路在主機上執行。此外,joint_trajectory_controller相容所有型別的關節命令介面。值得註意的是,我們應始終檢查沖突,確保沒有兩個控制器同時存取相同的硬體介面。
建立ROS CONTROL和TMC4671之間的通訊得益於TMCL API,利用Landungsbrücke可以毫不費力地建立ROS和TMC4671之間的通訊。如上所述,透過USB串口建立通訊,支持命令位置(因為我們正在建立硬體介面)和傳輸關節位置。Landungsbrücke接收到該命令位置後,透過SPI將該值寫入到寄存器0x68, PID_POSITION_TARGET。此外,從寄存器0x6B, PID_POSITION_ACTUAL獲取當前位置並透過USB串口傳輸。由於所有這些值都是32位元有符號整數,數據被編組為4個單字節無符號整數進行發送和接收。