玩转Franka Panda机器人——libfranka

本文详细介绍了如何在Linux环境下使用C++库libfranka与Franka Panda机器人进行交互,包括源码编译、HelloWorld示例、实时控制、信息读取和非实时指令,如电爪控制和参数设置。libfranka提供了丰富的功能,如关节位置运动生成、阻抗控制等,同时强调了实时通信和控制信号的平滑性。
摘要由CSDN通过智能技术生成

Franka Emika
本文介绍Franka机器人C++代码库——libfranka的使用方法。包含笔者在使用过程中的一点心得体会。笔者基于libfranka 0.8.0 版本进行开发调试,仅限于 Linux 系统。相关介绍也可以参考此文

这里假设读者已具备以下基础知识:

  • C++ 程序设计基础
  • Linux 操作系统基础
  • CMake 工具操作基础

官方资料汇总

安装libfranka

环境要求:

  • 一台Franka Panda机器人(确定已购买科研包)。
  • PC一台作为Workstation,需要以太网口,及网线一根。
  • Linux操作系统,笔者使用的是Ubuntu 16.04(64位)。

Franka机器人的核心功能及开发工具安装流程请参考此文

libfranka基本操作

源码编译

这里首先介绍下libfranka的源码安装编译方法,注意如果已经采用apt-get方法安装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继续。可以看到机器人运动到一个位姿,终端输出通信测试结果。

运动生成与机器人控制

libfranka
Franka机器人控制必须以实时(Real-Time)方式进行,如上图所示。libfranka中,定义了一个名为"franka"的命名空间,其中最重要的是“franka::Robot”类,该类用于与机器人通信(I/O)。libfranka提供多种控制信号输入模式,笛卡尔空间位置、速度,关节空间位置、速度,关节力矩。这些均由一个多态的“franka::Robot::control”方法实现。

控制算法主要通过回调函数实现,官方例程如下,这是一个lambda闭包表达式

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之内执行完成。回调函数有两个参数

通过 franka::Duration 类对象的 toSec() 方法返回时间信息(double,通常是0.001)可以实现插值。上述例程的控制模式为 franka::JointPositions 。结束这个回调函数循环使用 franka::MotionFinished 该函数的输入参数是当前控制模式下最后一个控制指令(如例程中式 franka::JointPositions 类型变量),返回值也是也是该类型指令对象,只不过该指令对象的 motion_finished 属性被赋值为 true。

无论是运动生成还是控制,信号都必须满足关节空间和笛卡尔空间的约束条件。约束条件在FCI文档中给出。如果任一约束条件未能满足,程序将抛出一个错误并终止运动。例如如果用户给定的初始位置与机器人实际当前位置差太远,系统将抛出 start_pose_invalid 错误并终止运动。

运动生成

libfranka提供4种类型的运动生成器,如下图所示:
Control
下面给出一个简单的关节位置运动生成示例,其它类似:

#include <cmath>
#include <iostream>
#include <franka/exception.h>
#include <franka/robot.h>

int main(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值