本文總結了筆者在學習使用Franka Panda機器人時的一些方法和經驗總結。
文章目錄
從零開始
準備:
- 一臺Franka Panda機器人(確定已購買科研包)。
- 一臺運行Linux系統的PC。
- 一根儘可能好的以太網線。
基礎知識:
- 機器人學基礎。
- C++編程基礎。
- Linux操作系統基礎。
- ROS系統基礎。
更多使用方法請參考FCI手冊。
搭建好你的工作空間後,可以考慮先用機器人自帶的Desk界面先試用一下。首先用以太網線連接工作站(臺式機或筆記本,這裏簡稱工作站)和機器人。注意Franka機器人有兩個以太網口,一個在機器人底座上,一個在控制櫃上。二者是不同的,但是都可以使用。
- 如果連接到機器人底座,此時機器人是server模式,可以通過“robot.franka.de”訪問desk。
- 如果連接到控制櫃,此時機器人是client模式,只能通過ip地址訪問desk。
Desk的用法十分簡單,此時不做介紹。
軟件安裝
強烈推薦使用Linux系統,這樣可以省去很多麻煩。Franka編程一般時兩種模式,即使用ROS或者直接調用API。這裏假設兩種方法全都需要。
筆者使用的操作系統是 Ubuntu 16.04 (64位)。
首先安裝ROS
筆者安裝的是 Kinetic Kame 版本。Franka官網其實也支持 Ubuntu 18.04 以及對應的ROS版本 Melodic Morenia。ROS的安裝十分簡單,ROS wiki中有詳細敘述,此處從略。
安裝franka_ros
有兩種安裝方式,即直接使用binary package安裝和從source搭建。通常情況下前一種方式就足夠了。
sudo apt-get install ros-kinetic-libfranka ros-kinetic-franka-ros
安心等待安裝完即可,這個過程有點費時。
注意以上方法安裝完成後,libfranka會被安裝到ROS的目錄下,且安裝的不一定是最新版本。如果要使用最新版本,需要使用源碼編譯,下文中介紹libfranka和franka_ros時會提到。
編譯real-time內核
使用Franka需要實時內核。這與一般的機器人如UR是有區別的。linux的實時內核的構建方法有多種,這裏給出筆者的方法。更多方法請參考其它參考部分。
首先查看當前系統的Linux內核版本,方法是在終端輸入:uname -r
隨後終端會提示當前Linux內核的版本,筆者的是4.15.0-generic。注意這不是實時內核,我們需要自行安裝編譯實時內核。選擇實時內核的版本沒有什麼推薦,自己選一個就好。可以安裝多個內核並在高級啓動時自行切換。
內核的安裝編譯方法可參考Franka FCI手冊,但是該方法在網絡連接不暢時極其慢,不推薦使用。筆者採用的是此文的方法。選擇的內核版本是4.19.82-rt30。注意:選擇實時內核版本時,不必選擇與自帶內核號一致的版本。也可以安裝對應的generic內核,這是非必要的。有時候甚至可能出現在某一版本內核下編譯出錯,換一個內核卻可以的情況。
編譯過程非常費時,完成後需要調整默認的內核啓動系統才能自行進入實時內核。對於沒有安裝雙系統的用戶PC啓動時可能不會出現高級啓動選項。解決方法是在啓動PC並彈出品牌logo時狂按右邊的shift鍵,隨後黑屏時按住右邊的shift鍵不放手。隨後系統會進入高級啓動選項。
注意:有些時候可能會無法進入所選內核,系統提示“vmlinuz-… invalid signiture”,解決方案是在BIOS裏面關閉Secure boot功能。
系統啓動後別忘了用uname -r
或者uname -a
檢查內核是否已經正確切換到實時內核。
注意:內核是安裝在系統的boot分區下的,因此務必保證該分區空間充足,如何希望保存兩個內核( generic 和 rt 內核)的話,建議boot分區大於4G,以便後續內核更新不會出現問題。
禁用CPU節能策略
爲了安全性和性能起見,建議配置完成後關閉系統的CPU頻率調整功能。
首先安裝工具cpufrquentiles:
sudo apt install cpufrequtils
完成後,運行cpufreq-info查看當前CPU狀態,當前“governor”屬性可能是“powersave”模式,我們需要將其修改爲“performance”模式。
cpufreq-info
修改方法有多種,可以採用indicator-cpufreq工具在UI界面手動修改。也可通過指令修改,運行如下指令:
sudo systemctl disable ondemand
sudo systemctl enable cpufrequtils
sudo sh -c 'echo "GOVERNOR=performance" > /etc/default/cpufrequtils'
sudo systemctl daemon-reload && sudo systemctl restart cpufrequtils
使用過程中遇到的其它問題可參考FCI手冊中Troubleshooting欄目。
libfranka使用指南
如果只是單純開環控制機器人,對反饋信號等沒有要求,使用libfranka提供的C++ API是一種更方便的編程方法。該方法同樣也適用於Windows系統。
爲了節省頁面,libfranka 的詳細使用方法請參考此文。 本文中不做詳細介紹,僅探討基本思想。
源碼編譯
這裏首先介紹下libfranka的源碼安裝編譯方法,注意如果已經採用上述方法安裝ros-kinetic-libfranka,那麼此步驟可以跳過,libfranka已經被默認安裝在ROS目錄下(/opt/ros/kinetic/)。但是,如果想要安裝最新版本的libfranka,必須採用源碼編譯,且在此之前必須刪除之前安裝的libfranka和franka_ros以防衝突。
sudo apt remove "*libfranka*"
第1步,刪除完成後,首先安裝依賴庫:
sudo apt install build-essential cmake git libpoco-dev libeigen3-dev
第2步,找到一個合適的位置,從Github下載源碼,並進入libfranka源文件夾:
git clone --recursive https://github.com/frankaemika/libfranka
cd libfranka
第3步,在源文件夾下創造一個名爲build的路徑,並在其中啓動CMake編譯:
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
HelloWorld
libfranka自帶的例程對於理解libfrank非常有效,本節簡單介紹下例程的使用方法。機器人上電後,首先通過瀏覽器進入Desk界面,此時機器人是鎖定狀態(黃色燈亮),在Desk界面接觸鎖定,進入準備運動模式(藍色燈亮)。
以Linux系統(Ubuntu 16.04)爲例,首先找到libfranka文件夾所在路徑。如果讀者是採用apt-get install安裝的,那麼去/opt/ros/kinetic/下找;如果讀者採用源碼編譯,那麼去保持源碼的路徑下找。
在libfranka路徑下首先找到 examples 文件夾,該文件夾下保存了所有的示例C++代碼。如要運行,在libfranka/build/examples/ 路徑下已有生成的可執行文件。此時保持機器人控制櫃與計算機工作站連接,且機器人處於準備運動模式(藍色燈亮),執行如下指令:
./communication_test "172.16.0.2"
這裏以通信測試爲例,其它類似,注意第一個參數是機器人的IP地址。官方推薦使用機器人控制櫃與計算機工作站連接,當然連接機器人底座亦可,只不過IP地址要換成hostname,筆者不曾嘗試過。開始運行時例程會提示保持急停按鈕在操作者手中,並按Enter繼續。可以看到機器人運動到一個位姿,終端輸出通信測試結果。
機器人控制
Franka機器人控制必須以實時(Real-Time)方式進行,如上圖所示。libfranka中,定義了一個名爲"franka"的命名空間,其中最重要的是“franka::Robot”類,該類用於與機器人通信(I/O)。libfranka提供多種控制信號輸入模式,笛卡爾空間位置、速度,關節空間位置、速度,關節力矩。這些均由一個多態的“franka::Robot::control”方法實現。
控制算法主要通過回調函數實現,官方例程如下:
double time = 0.0;
auto control_callback = [&time](const franka::RobotState& robot_state,
franka::Duration time_step) -> franka::JointPositions {
time += time_step.toSec(); // Update time at the beginning of the callback.
franka::JointPositions output = getJointPositions(time);
if (time >= max_time) {
// Return MotionFinished at the end of the trajectory.
return franka::MotionFinished(output);
}
return output;
}
注意Franka機器人工作頻率是1kHz,也就是說回調函數必須在1ms之內執行完成(注意這1ms指的是整個控制週期,包括通信部分,實際留給回調函數的通常不到300um)。回調函數有兩個參數
- franka::RobotState:結構體,內含機器人的各種狀態,如關節角。
- franka::Duration:類,毫秒級時間。
通過 franka::Duration 類對象的 toSec() 方法返回時間信息(double,通常是0.001)可以實現插值。上述例程的控制模式爲 franka::JointPositions 。結束這個回調函數循環使用 franka::MotionFinished 該函數的輸入參數是當前控制模式下最後一個控制指令(如例程中式 franka::JointPositions 類型變量),返回值也是也是該類型指令對象,只不過該指令對象的 motion_finished 屬性被賦值爲 true。
如下圖所示,使用 franka::Robot::control 方法可以實現兩類實時功能:
- 運動生成
- 機器人控制
libfranka提供4種類型的運動生成器,如下圖所示:
具體操作及其它功能可參考官方文檔及例程。
libfranka運動生成器和控制器的作用機理可參考下圖:
控制機器人的信號實際上是帶有下標d的信號(desired),用戶可以實時獲取該信號來檢查信號被濾波或者是否有丟包現象。
信息輸出
Franka 自帶重點摩擦補償機制。由於有關節力矩傳感器,使得其零力控制性能相對於UR之類的機器人更加靈敏順暢。打開示教模式(白色燈亮),用戶可以通過機器人末端的Pilot實現拖動示教,並記錄一些信息。libfranka中,機器人狀態由 franka::RobotState 結構體管理,實時讀取的頻率也是1kHz,讀取數據由 franka::Robot::read 函數管理。
franka::RobotState 結構體提供了豐富的信息,主要包括三類:
- 關節空間信息:如關節角度、角速度、關節力矩、估計出的外部力矩、碰撞/接觸狀態等。
- 笛卡爾空間信息:末端參數、末端位置、速度、估計出的外部扭矩等。
- 接口信號:最後一個控制信號和期望信號等。
機器人模型庫
模型庫可以提供運動學與動力學參數,包括:
- 前向運動學。
- 雅可比矩陣。
- 動力學參數:質量矩陣、科氏力和向心力向量、重力向量。
使用機器人模型庫讀者可以計算任意姿態下的參數,不必是機器人當前姿態下的參數。具體用法可參考例程。
電爪控制
Franka 自帶的電爪可以做很多事情,使用非常方便。電爪的控制是非實時(blocking)的,如下圖所示。
電爪的控制由 franka::Gripper 類管理。
franka_ros使用指南
franka_ros是基於libfranka開發的ROS套件,包含了libfranka的主要功能。
源碼編譯
如果讀者已經按照第1節中使用apt-get安裝完成franka_ros,可以跳過此步驟。注意,如果讀者執行了上一節中libfranka源碼編譯過程,那麼此時對於franka_ros需要重新源碼編譯。
第1步,找到一個合適的位置,建立catkin工作空間,這個過程與普通ROS工作空間的建立沒什麼區別:
mkdir -p catkin_ws/src
cd catkin_ws
source /opt/ros/kinetic/setup.sh
catkin_init_workspace src
第2步,從Github下載franka_ros:
git clone --recursive https://github.com/frankaemika/franka_ros src/franka_ros
第3步,安裝依賴庫:
rosdep install --from-paths src --ignore-src --rosdistro kinetic -y --skip-keys libfranka
第4步,採用catkin_make編譯catkin工作空間,注意調整libfranka的路徑:
catkin_make -DCMAKE_BUILD_TYPE=Release -DFranka_DIR:PATH=/path/to/libfranka/build
source devel/setup.sh
以上就是franka_ros的源碼編譯流程。
(未完待續……)
Moveit!
使用Moveit規劃控制Franka是非常的容易,因爲Moveit官網教程就是用Franka作爲例子進行講解的。Moveit具體的安裝、配置、使用方法官網教程十分詳細,此處從略。
(持續更新中……)
CoppeliaSim仿真
CoppeliaSim(原名:V-REP)是一個非常方便的開源仿真工具,其特性請參考官網。4.0.0版的CoppeliaSim自帶Franka機器人的模型,非常方便。不過該模型沒有帶官方的電爪。
(持續更新中……)
其它參考
Emika Franka 官方資料
如何構建實時內核