從零開始玩轉Franka Panda機器人

本文總結了筆者在學習使用Franka Panda機器人時的一些方法和經驗總結。

從零開始

Franka Package
準備:

  • 一臺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

如果只是單純開環控制機器人,對反饋信號等沒有要求,使用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::Duration 類對象的 toSec() 方法返回時間信息(double,通常是0.001)可以實現插值。上述例程的控制模式爲 franka::JointPositions 。結束這個回調函數循環使用 franka::MotionFinished 該函數的輸入參數是當前控制模式下最後一個控制指令(如例程中式 franka::JointPositions 類型變量),返回值也是也是該類型指令對象,只不過該指令對象的 motion_finished 屬性被賦值爲 true。

如下圖所示,使用 franka::Robot::control 方法可以實現兩類實時功能:

  1. 運動生成
  2. 機器人控制

libfranka提供4種類型的運動生成器,如下圖所示:
Control

具體操作及其它功能可參考官方文檔及例程

libfranka運動生成器和控制器的作用機理可參考下圖:
RT
控制機器人的信號實際上是帶有下標d的信號(desired),用戶可以實時獲取該信號來檢查信號被濾波或者是否有丟包現象。

信息輸出

Franka 自帶重點摩擦補償機制。由於有關節力矩傳感器,使得其零力控制性能相對於UR之類的機器人更加靈敏順暢。打開示教模式(白色燈亮),用戶可以通過機器人末端的Pilot實現拖動示教,並記錄一些信息。libfranka中,機器人狀態由 franka::RobotState 結構體管理,實時讀取的頻率也是1kHz,讀取數據由 franka::Robot::read 函數管理。

franka::RobotState 結構體提供了豐富的信息,主要包括三類:

  • 關節空間信息:如關節角度、角速度、關節力矩、估計出的外部力矩、碰撞/接觸狀態等。
  • 笛卡爾空間信息:末端參數、末端位置、速度、估計出的外部扭矩等。
  • 接口信號:最後一個控制信號和期望信號等。

機器人模型庫

模型庫可以提供運動學與動力學參數,包括:

  • 前向運動學。
  • 雅可比矩陣。
  • 動力學參數:質量矩陣、科氏力和向心力向量、重力向量。

使用機器人模型庫讀者可以計算任意姿態下的參數,不必是機器人當前姿態下的參數。具體用法可參考例程

電爪控制

Franka 自帶的電爪可以做很多事情,使用非常方便。電爪的控制是非實時(blocking)的,如下圖所示。
Hand
電爪的控制由 franka::Gripper 類管理。

franka_ros使用指南

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!

Rviz
使用Moveit規劃控制Franka是非常的容易,因爲Moveit官網教程就是用Franka作爲例子進行講解的。Moveit具體的安裝、配置、使用方法官網教程十分詳細,此處從略。

(持續更新中……)

CoppeliaSim仿真

CoppeliaSim
CoppeliaSim(原名:V-REP)是一個非常方便的開源仿真工具,其特性請參考官網。4.0.0版的CoppeliaSim自帶Franka機器人的模型,非常方便。不過該模型沒有帶官方的電爪。

(持續更新中……)

其它參考

Emika Franka 官方資料

如何構建實時內核

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章