首页 > 编程语言 >Franka Robot 夹爪控制示例(grasp_object.cpp)

Franka Robot 夹爪控制示例(grasp_object.cpp)

时间:2024-07-10 18:51:49浏览次数:11  
标签:std Franka gripper 示例 object 抓取 grasp include

// Copyright (c) 2023 Franka Robotics GmbH
// Use of this source code is governed by the Apache-2.0 license, see LICENSE
#include <iostream>
#include <sstream>
#include <string>
#include <thread>

#include <franka/exception.h>
#include <franka/gripper.h>

/**
 * @example grasp_object.cpp
 * An example showing how to control FRANKA's gripper.
 */
/**
 * @example grasp_object.cpp
 * 控制Franka夹爪的示例
 * ./grasp_object gripper123 true 0.05
 * gripper123 是抓取器的主机名。
 × true 表示程序将在抓取前执行归位操作。
 × 0.05 表示目标物体的宽度为 5 厘米。
 */
int main(int argc, char** argv) {
  if (argc != 4) {
    std::cerr << "Usage: ./grasp_object <gripper-hostname> <homing> <object-width>" << std::endl;
    return -1;
  }

  try {
    franka::Gripper gripper(argv[1]); // 使用IP初始化夹爪 
    double grasping_width = std::stod(argv[3]);// 获取夹爪宽度  目标物体的宽度 0.05 表示目标物体的宽度为 5 厘米

    std::stringstream ss(argv[2]);
    bool homing;
    if (!(ss >> homing)) {// 动作前 是否归位
      std::cerr << "<homing> can be 0 or 1." << std::endl;
      return -1;
    }

    if (homing) {// 动作前, 进行归位操作。
      // Do a homing in order to estimate the maximum grasping width with the current fingers.
      gripper.homing();
    }

    // Check for the maximum grasping width.
    franka::GripperState gripper_state = gripper.readOnce();// 读取夹爪状态
    if (gripper_state.max_width < grasping_width) {// 如果抓取器的最大开口宽度小于目标抓取宽度, 则报错
      std::cout << "Object is too large for the current fingers on the gripper." << std::endl;
      return -1;
    }

    // Grasp the object.
    if (!gripper.grasp(grasping_width, 0.1, 60)) {// 使用0.1 代表抓取速度, 60代表抓取力度
      std::cout << "Failed to grasp object." << std::endl;
      return -1;
    }

    // Wait 3s and check afterwards, if the object is still grasped.
    std::this_thread::sleep_for(std::chrono::duration<double, std::milli>(3000));// 延迟3s

    gripper_state = gripper.readOnce();//读取一次夹爪状态
    if (!gripper_state.is_grasped) {// 判断是否仍然抓取物体 丢失则报错
      std::cout << "Object lost." << std::endl;
      return -1;
    }

    std::cout << "Grasped object, will release it now." << std::endl;
    gripper.stop(); // 停止抓取动作, 撤销施加的力
  } catch (franka::Exception const& e) {
    std::cout << e.what() << std::endl;
    return -1;
  }

  return 0;
}

这段代码是一个使用 Franka Robotics GmbH 的夹爪控制库(franka::Gripper)的示例程序。让我来解释一下主要的部分:

  1. 命令行参数解析

    • argv[1]:表示夹爪的主机名或者 IP 地址,用于初始化 franka::Gripper 对象。
    • argv[2]:表示是否进行归位操作的标志,可以是 truefalse,在代码中通过 std::stod 转换为 bool 类型的 homing 变量。
    • argv[3]:表示目标物体的宽度,这里使用 std::stod 转换为 double 类型的 grasping_width 变量,单位可能是米或者厘米,这取决于你的具体设置。
  2. 归位操作

    • 如果 homingtrue,则调用 gripper.homing() 进行夹爪的归位操作,以确保准备好进行抓取。
  3. 检查夹爪能力

    • 使用 gripper.readOnce() 读取夹爪的状态,其中 gripper_state.max_width 表示夹爪的最大开口宽度。如果目标物体的宽度 grasping_width 大于夹爪的最大开口宽度,程序会输出错误信息并返回 -1
  4. 抓取操作

    • 调用 gripper.grasp(grasping_width, 0.1, 60) 进行抓取操作,其中 0.1 可能代表抓取的速度,60 可能代表抓取时施加的力度或者其他参数,具体取决于你的夹爪和库的实现。
  5. 等待和检查抓取

    • 使用 std::this_thread::sleep_for 延迟 3 秒,然后再次调用 gripper.readOnce() 检查是否仍然成功抓取物体。
  6. 停止抓取

    • 最后调用 gripper.stop() 停止抓取动作,释放施加的力,表明抓取操作结束。

整体来说,这个程序展示了如何使用 Franka Robotics 的夹爪库来实现抓取物体的功能,并包含了一些基本的错误处理和状态检查。

标签:std,Franka,gripper,示例,object,抓取,grasp,include
From: https://www.cnblogs.com/ai-ldj/p/18294809

相关文章

  • Franka Robot demo 力控 force_control.cpp
    //Copyright(c)2023FrankaRoboticsGmbH//UseofthissourcecodeisgovernedbytheApache-2.0license,seeLICENSE#include<array>#include<iostream>#include<Eigen/Core>#include<franka/duration.h>#include<franka/......
  • Franka Robot 齐次变换矩阵 robot_state.O_T_EE
    O_T_EE 是一个4x4的齐次变换矩阵,用于描述末端执行器在机器人基座坐标系下的位置和姿态。这个矩阵的结构如下:[r11r12r13tx][r21r22r23ty][r31r32r33tz][0001]其中:r11到r33表示末端执行器的旋转矩阵tx、ty、tz表示末端执行器在机器人基座坐标系......
  • 递归示例-指定数字以内的所有排列组合(Base)
    指定数字以内的所有排列组合:定义名称版:=pmtB(指定数字)=LAMBDA(x,IF(x=1,1,VSTACK(pmtB(x-1),SUBSTITUTE(BASE(SEQUENCE(x^x)-1,x,x),0,x))))不定义名称版:=LET(fx,LAMBDA(npmtB,x,IF(x=1,1,VSTACK(npmtB(npmtB,x-1),SUBSTITUTE(BASE(SEQUENCE(x^x)-1,x,x),0,x)))),fx......
  • 设计模式使用场景实现示例及优缺点(创建型模式——单例模式、建造者模式、原型模式)
    创建型模式单例模式(SingletonPattern)单例模式(SingletonPattern)在Java中的使用场景与在其他编程语言中类似,其主要目的是确保一个类只有一个实例,并提供一个全局的访问点。以下是单例模式的一些常见使用场景及详细讲解:使用场景控制资源的使用:数据库连接池:数据库连接是......
  • 设计模式使用场景实现示例及优缺点(结构型模式——代理模式、外观模式)
    结构型模式代理模式(ProxyPattern)代理模式(ProxyPattern)是一种结构型设计模式,它通过引入一个代理对象来控制对另一个对象的访问。这个代理对象可以为被代理的对象提供额外的功能,例如访问控制、延迟初始化、日志记录、或网络访问等。适用场景远程代理:为一个对象在不同......
  • UML图书管理系统用例图示例
    新书速览|《UML2.5基础、建模与设计实践》新书速览|《UML2.5基础、建模与设计实践【例4.4】图书管理系统用例图。图书管理系统按其业务功能分成借阅者管理、图书管理、借书、还书和用户管理等几部分,这些职能对应于系统的不同组织部门。1)系统参与者图书管理系统针对的对象......
  • Franka Robot 多上位机控制控制方案
    Franka机器人来说,多个上位机可以同时对机器人进行控制,但需要遵循一些原则和注意事项:协作控制模式:多个上位机同时控制Franka机器人需要采用协作控制模式。在这种模式下,各个上位机向机器人发送的指令会被协调合并,避免指令冲突。访问权限管理:通常会对上位机的访问权限......
  • Franka Robot cmake demo
    cmake_minimum_required(VERSION3.4)#指定CMake的最低版本要求为3.4project(libfranka-examplesCXX)#定义项目名称为libfranka-examples,并指定语言为C++list(INSERTCMAKE_MODULE_PATH0${CMAKE_CURRENT_LIST_DIR}/../cmake)#将父目录的`cmake`子目录添加到......
  • Franka Robot 测试网络性能的示例(communication_test.cpp)
    //Copyright(c)2023FrankaRoboticsGmbH//UseofthissourcecodeisgovernedbytheApache-2.0license,seeLICENSE#include<chrono>#include<iostream>#include<thread>#include<franka/active_control.h>#include<frank......
  • Franka Robot setZeroForceTorque 设置零力矩
    在FrankaEmika机器人中,可以使用setZeroForceTorque()函数来设置机器人的零力矩。这个函数可以让机器人保持在零力矩状态,即不施加任何额外的力矩。这种状态下,机器人关节会保持"放松"的状态,可以被外力轻易地移动。以下是一个示例代码:#include<franka/robot.h>intmain()......