開(kāi)發(fā)機器人硬件時(shí)面臨的挑戰之一是處理與電機的通信,以及根據實(shí)時(shí)生成的軌跡向其發(fā)送命令。由于接受軌跡的電機應遵守時(shí)間限制,所以電機驅動(dòng)器和控制器之間的無(wú)縫通信變得至關(guān)重要。此外,控制器還應從電機接收最新的關(guān)節狀態(tài)(位置、速度、力)信息,從而能夠驗證軌跡執行情況。然后剩下的最后一項挑戰是實(shí)際生成軌跡并將其發(fā)送給電機驅動(dòng)器。
為了滿(mǎn)足這些要求,ROS(機器人操作系統)框架為我們提供了ROS-control和ROS-Moveit等多款工具。ROS (機器人操作系統)是一種軟件框架,實(shí)施了最先進(jìn)的算法和工具,能夠以最低的工作量簡(jiǎn)化機器人硬件和軟件開(kāi)發(fā)。控制關(guān)節作動(dòng)器的方法可能有多種,例如指定關(guān)節位置、關(guān)節速度或關(guān)節作用力,完全依賴(lài)于應用所需的控制水平。由于速度和扭矩控制環(huán)路等所有低級處理都是在驅動(dòng)硬件內執行的,如果關(guān)節位置直接用于命令執行器,事情就變得比較簡(jiǎn)單。但是,如果使用關(guān)節或關(guān)節作用力命令執行器,那么就必須通過(guò)運行命令設備上的控制環(huán)路來(lái)生成位置接口,在我們的例子中為運行ROS control實(shí)例的linux機器。 ROS-CONTROL ROS-control是一個(gè)ROS package,能夠與以上所述的多種硬件實(shí)例對接。為了實(shí)現以上目的,ROS-control提供對控制環(huán)路實(shí)現的抽象表示,從而可以控制任意電機或執行器,而不必考慮其硬件接口。 根據官方文件,ROS-control可原生支持4種類(lèi)型的硬件接口: 1.關(guān)節命令接口 - 作用力關(guān)節接口
- 速度關(guān)節接口
- 位置關(guān)節接口
2.關(guān)節狀態(tài)接口 【ROS硬件接口存儲器概念圖。來(lái)源:ros_control】從圖中可以看出,ROS control使用存儲器位置與執行器及電機通信。例如,如果必須使用位置接口命令電機,ROS control只需在存儲器位置“pos_cmd_”寫(xiě)入位置要求值,該值將被通過(guò)電機的通信接口傳輸到電機。以帶有Landungsbrücke的TMC4671評估套件為例,這些接口可以是RS232、USB串口或RN171XV/RN42XV無(wú)線(xiàn)模塊。類(lèi)似地,對于速度和作用力接口,要求值也被寫(xiě)入到預先定義的相應存儲器位置,F在,剩下的問(wèn)題是,如何從電機讀取關(guān)節狀態(tài)。與關(guān)節命令接口類(lèi)似,關(guān)節值被讀入到存儲器位置“pos_”、“vel_”和“eff_”,F在,只需以一定的間隔更新這些存儲器位置,即可命令和讀取關(guān)節接口。利用以下的代碼片段很容易解釋這一過(guò)程: class trinamic: public hardware_interface::RobotHW { public: trinamic(); void read(); void write(); }; 這里,可利用構造函數初始化,比如,通信接口(在我們使用Landungsbrücke的實(shí)現中為串口)。更進(jìn)一步,在循環(huán)中定期調用trinamic::read()和trinamic::write()函數,從而以固定間隔更新存儲器位置。 ROS控制器 硬件接口啟動(dòng)并運行后,我們可以生成許多控制器之一,例如position_controllers、velocity_controllers、joint_state_controller、joint_trajectory_controller。這些控制器僅僅是硬件接口作為ROS topics的抽象表示。如上所述,這里可以使用速度關(guān)節接口啟動(dòng)position_controller,使控制環(huán)路在主機上運行。此外,joint_trajectory_controller兼容所有類(lèi)型的關(guān)節命令接口。值得注意的是,我們應始終檢查沖突,確保沒(méi)有兩個(gè)控制器同時(shí)訪(fǎng)問(wèn)相同的硬件接口。 建立ROS CONTROL和TMC4671之間的通信 得益于TMCL API,利用Landungsbrücke可以毫不費力地建立ROS和TMC4671之間的通信。如上所述,通過(guò)USB串口建立通信,支持命令位置(因為我們正在建立硬件接口)和傳輸關(guān)節位置。Landungsbrücke接收到該命令位置后,通過(guò)SPI將該值寫(xiě)入到寄存器0x68, PID_POSITION_TARGET。此外,從寄存器0x6B, PID_POSITION_ACTUAL獲取當前位置并通過(guò)USB串口傳輸。由于所有這些值都是32位有符號整數,數據被編組為4個(gè)單字節無(wú)符號整數進(jìn)行發(fā)送和接收。 如何設置 硬件伺服控制芯片TMC4671配置過(guò)。最初利用TMCL-IDE根據電機設置TMC4671,具體過(guò)程說(shuō)明請觀(guān)看視頻。更新在ROS_control.c中的init_motor()函數中從IDE接收的寄存器設置,F在,在任意工作區下載ROSpackage,并利用啟動(dòng)文件啟動(dòng)硬件接口?梢噪S啟動(dòng)文件中的ROS control節點(diǎn)生成任意兼容的ROS控制器?稍赾ontroller.yaml中配置控制器。使用TMC4671進(jìn)行位置控制時(shí),最重要的部分是調節速度和位置控制環(huán)路的PI增益?墒褂眉拇嫫0x58和0x5A手動(dòng)調節這些環(huán)路。但強烈建議不要這么做。 參考 1. S.Chitta, E. Marder-Eppstein, W. Meeussen, V. Pradeep, A. RodríguezTsouroukdissian, J. Bohren, D. Coleman, B. Magyar, G. Raiola, M. Lüdtke and E. Fernandez Perdomo - “ros_control: A generic and simple control framework for ROS”
|