#实时 #panda #linux-kernel #franka #emika #libfranka

libfranka-rs

用于控制Franka Emika机器人的库

4个版本

0.9.0 2022年4月1日
0.8.0-alpha-22021年6月18日
0.8.0-alpha-12021年5月4日

#70机器人

27 每月下载量
franka-interface 中使用

EUPL-1.2

335KB
6.5K SLoC

crates.io GitHub Workflow Status crates.io crates.io docs.rs

libfranka-rs

libfranka-rs是使用Rust编写的libfranka的非官方端口。该库可以与Franka Emika机器人的研究版本交互。该库旨在为研究人员提供在实时机器人应用中实验Rust的可能性。

控制机器人时,务必随时准备好停止按钮!

特性

  • 机器人的实时控制
  • 类似于libfranka的API
  • 与Preempt_RT或标准Linux内核一起使用
  • 使用夹具
  • 使用机器人模型
  • 下载机器人模型以供离线使用
  • 将libfranka示例端口移植以帮助您入门
  • 示例_commons的功能直接包含在库中,因此您无需将这些文件复制到您的项目中
  • 直接将nalgebra (Eigen3等效)类型转换为libfranka控制类型(JointPositions、CartesianPose、...)
  • 使用Result类型进行适当的错误处理

TODO

  • 在Linux x86_64以外的任何地方使用模型

不支持

  • Windows(macOS可能可以工作,但我没有测试过)
  • 真空夹具(我们没有这些,因此无法测试它们)

示例

一个控制关节位置的小示例。您可以在示例文件夹中找到更多。

use franka::{FrankaResult, JointPositions, MotionFinished, Robot, RobotState};
use std::f64::consts::PI;
use std::time::Duration;
fn main() -> FrankaResult<()> {
  let mut robot = Robot::new("robotik-bs.de", None, None)?;
  robot.set_default_behavior()?;
  println!("WARNING: This example will move the robot! Please make sure to have the user stop button at hand!");
  println!("Press Enter to continue...");
  std::io::stdin().read_line(&mut String::new()).unwrap();

  // Set additional parameters always before the control loop, NEVER in the control loop!
  // Set collision behavior.
  robot.set_collision_behavior(
      [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0],
      [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0],
      [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0],
      [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0],
      [20.0, 20.0, 20.0, 25.0, 25.0, 25.0],
      [20.0, 20.0, 20.0, 25.0, 25.0, 25.0],
      [20.0, 20.0, 20.0, 25.0, 25.0, 25.0],
      [20.0, 20.0, 20.0, 25.0, 25.0, 25.0],
  )?;

  let q_goal = [0., -PI / 4., 0., -3. * PI / 4., 0., PI / 2., PI / 4.];
  robot.joint_motion(0.5, &q_goal)?;
  println!("Finished moving to initial joint configuration.");
  let mut initial_position = JointPositions::new([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
  let mut time = 0.;
  let callback = |state: &RobotState, time_step: &Duration| -> JointPositions {
      time += time_step.as_secs_f64();
      if time == 0. {
          initial_position.q = state.q_d;
      }
      let mut out = JointPositions::new(initial_position.q);
      let delta_angle = PI / 8. * (1. - f64::cos(PI / 2.5 * time));
      out.q[3] += delta_angle;
      out.q[4] += delta_angle;
      out.q[6] += delta_angle;
      if time >= 5.0 {
          println!("Finished motion, shutting down example");
          return out.motion_finished();
      }
      out
  };
  robot.control_joint_positions(callback, None, None, None)
}

如何开始

作为直接端口,您可能会发现Franka控制接口文档很有帮助。

零Rust知识

如果您是第一次使用Rust,我建议您阅读Rust Book

如果您已经安装了Rust并只想玩示例,您也可以运行

cargo install libfranka-rs --examples --version 0.9.0
generate_joint_position_motion <ip_of_your_robot>

如果您已经熟悉原始的libfranka示例。我建议您查看示例文件夹。名称类似于原始libfranka示例的示例是尽可能接近原始示例的端口,希望这可以使您进入Rust世界的过程尽可能顺利。

零libfranka知识

Franka控制接口文档(点击查看)还包括设置指南。由于您将使用libfranka-rs,因此可以跳过libfranka的安装。请查阅文档和示例文件夹。您应该运行communication_test示例以验证您的设置是否正确。

如何使用libfranka-rs

如果您想在项目中使用libfranka-rs,您需要在Cargo.toml文件中添加以下内容:

libfranka-rs = "0.9.0"

libfranka-rs的版本号结构为MAJOR.MINOR.PATCH。主版本和次要版本与原始libfranka版本号匹配。这意味着对于0.8,您的机器人至少需要运行在固件4.0.0上。libfranka-rs不支持旧版本的固件。有关系统更新的更多信息,请参阅此处

许可证

本库版权所有 © 2021 Marco Boneberger

根据欧盟公共授权协议(EUPL),版本1.2或——一旦获得欧盟委员会批准——后续版本的EUPL(“许可证”);

您只能按照许可证的规定使用本作品。您可以在以下地址获得许可证副本:

https://joinup.ec.europa.eu/software/page/eupl

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。

有关许可证下管理权限和限制的具体语言,请参阅许可证。

依赖关系

~7.5MB
~148K SLoC