本文总结了笔者在学习使用Franka Panda机器人时的一些方法和经验总结。
基础知识:
更多使用方法请参考FCI手册。
搭建好你的工作空间后,可以考虑先用机器人自带的Desk界面先试用一下。首先用以太网线连接工作站(台式机或笔记本,这里简称工作站)和机器人。注意Franka机器人有两个以太网口,一个在机器人底座上,一个在控制柜上。二者是不同的,但是都可以使用。
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提供的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 .
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 方法可以实现两类实时功能:
具体操作及其它功能可参考官方文档及例程。
libfranka运动生成器和控制器的作用机理可参考下图:
控制机器人的信号实际上是带有下标d的信号(desired),用户可以实时获取该信号来检查信号被滤波或者是否有丢包现象。
Franka 自带重点摩擦补偿机制。由于有关节力矩传感器,使得其零力控制性能相对于UR之类的机器人更加灵敏顺畅。打开示教模式(白色灯亮),用户可以通过机器人末端的Pilot实现拖动示教,并记录一些信息。libfranka中,机器人状态由 franka::RobotState 结构体管理,实时读取的频率也是1kHz,读取数据由 franka::Robot::read 函数管理。
franka::RobotState 结构体提供了丰富的信息,主要包括三类:
模型库可以提供运动学与动力学参数,包括:
使用机器人模型库读者可以计算任意姿态下的参数,不必是机器人当前姿态下的参数。具体用法可参考例程。
Franka 自带的电爪可以做很多事情,使用非常方便。电爪的控制是非实时(blocking)的,如下图所示。
电爪的控制由 franka::Gripper 类管理。
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是非常的容易,因为Moveit官网教程就是用Franka作为例子进行讲解的。Moveit具体的安装、配置、使用方法官网教程十分详细,此处从略。
(持续更新中……)
CoppeliaSim(原名:V-REP)是一个非常方便的开源仿真工具,其特性请参考官网。4.0.0版的CoppeliaSim自带Franka机器人的模型,非常方便。不过该模型没有带官方的电爪。
(持续更新中……)
Emika Franka 官方资料
如何构建实时内核