从零开始玩转Franka Panda机器人

本文总结了笔者在学习使用Franka Panda机器人时的一些方法和经验总结。

文章目录

  • 从零开始
  • 软件安装
  • libfranka使用指南
    • 源码编译
    • HelloWorld
    • 机器人控制
    • 信息输出
    • 机器人模型库
    • 电爪控制
  • franka_ros使用指南
    • 源码编译
  • Moveit!
  • CoppeliaSim仿真
  • 其它参考

从零开始

从零开始玩转Franka Panda机器人_第1张图片
准备:

  • 一台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使用指南

从零开始玩转Franka Panda机器人_第2张图片

如果只是单纯开环控制机器人,对反馈信号等没有要求,使用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 方法可以实现两类实时功能:

  1. 运动生成
  2. 机器人控制

libfranka提供4种类型的运动生成器,如下图所示:
从零开始玩转Franka Panda机器人_第3张图片

具体操作及其它功能可参考官方文档及例程。

libfranka运动生成器和控制器的作用机理可参考下图:
从零开始玩转Franka Panda机器人_第4张图片
控制机器人的信号实际上是带有下标d的信号(desired),用户可以实时获取该信号来检查信号被滤波或者是否有丢包现象。

信息输出

Franka 自带重点摩擦补偿机制。由于有关节力矩传感器,使得其零力控制性能相对于UR之类的机器人更加灵敏顺畅。打开示教模式(白色灯亮),用户可以通过机器人末端的Pilot实现拖动示教,并记录一些信息。libfranka中,机器人状态由 franka::RobotState 结构体管理,实时读取的频率也是1kHz,读取数据由 franka::Robot::read 函数管理。

franka::RobotState 结构体提供了丰富的信息,主要包括三类:

  • 关节空间信息:如关节角度、角速度、关节力矩、估计出的外部力矩、碰撞/接触状态等。
  • 笛卡尔空间信息:末端参数、末端位置、速度、估计出的外部扭矩等。
  • 接口信号:最后一个控制信号和期望信号等。

机器人模型库

模型库可以提供运动学与动力学参数,包括:

  • 前向运动学。
  • 雅可比矩阵。
  • 动力学参数:质量矩阵、科氏力和向心力向量、重力向量。

使用机器人模型库读者可以计算任意姿态下的参数,不必是机器人当前姿态下的参数。具体用法可参考例程。

电爪控制

Franka 自带的电爪可以做很多事情,使用非常方便。电爪的控制是非实时(blocking)的,如下图所示。
从零开始玩转Franka Panda机器人_第5张图片
电爪的控制由 franka::Gripper 类管理。

franka_ros使用指南

从零开始玩转Franka Panda机器人_第6张图片
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!

从零开始玩转Franka Panda机器人_第7张图片
使用Moveit规划控制Franka是非常的容易,因为Moveit官网教程就是用Franka作为例子进行讲解的。Moveit具体的安装、配置、使用方法官网教程十分详细,此处从略。

(持续更新中……)

CoppeliaSim仿真

从零开始玩转Franka Panda机器人_第8张图片
CoppeliaSim(原名:V-REP)是一个非常方便的开源仿真工具,其特性请参考官网。4.0.0版的CoppeliaSim自带Franka机器人的模型,非常方便。不过该模型没有带官方的电爪。

(持续更新中……)

其它参考

Emika Franka 官方资料

  • Franka Control Interface
  • libfranka - GitHub
  • libfranka - github io

如何构建实时内核

  • HOWTO; Install Real-Time Linux Kernel
  • Install RT Linux patch for Ubuntu - StackOverflow

你可能感兴趣的:(ROS,Code,and,IDE,机器人)