Franka机械臂代码学习——echo_robot_state.cpp例程

本文主要解读了Franka机械臂的echo_robot_state.cpp例程,该例程用于读取机械臂状态。介绍了franka::RobotState结构体提供的关节空间、笛卡尔空间和接口信号三类状态信息,还提及franka::Robot::readOnce和franka::Robot::read函数,指出读取依靠该结构体,且控制环中也可读取数据。

在第一次运行Franka机械臂的时候,FCI手册上让我们跑的就是echo_robot_state.cpp这个例程。这个例程主要目的是读取机械臂的各个状态,比如关节角之类的。下面我们就来解读一下这个例程:

#include <iostream>
// C++中的输入输出流库
#include <franka/exception.h>
// 包含用于异常处理的类
#include <franka/robot.h>

/**
 * @example echo_robot_state.cpp
 * 一个连续读取机械臂状态的例程
 */

int main(int argc, char** argv) {
  if (argc != 2) {
    std::cerr << "Usage: " << argv[0] << " <robot-hostname>" << std::endl;
    return -1;
  }

  try {   
  // try模块中存放可能出现异常的代码,后面通常有一个或多个catch块
    franka::Robot robot(argv[1]);
    
    // 回调函数
    size_t count = 0;       // size_t类型表示C/C++中任何对象所能达到的最大长度,无符号整数
    robot.read([&count](const franka::RobotState& robot_state) 
    {
      // Printing to std::cout adds a delay. This is acceptable for a read loop such as this, but should not be done in a control loop.
      std::cout << robot_state << std::endl;
      return count++ < 100;
    });

    std::cout << "Done." << std::endl;
  } catch (franka::Exception const& e) {    // catch跟在try后面捕获异常
    std::cout << e.what() << std::endl;     // 抛出异常
    return -1;                              // return -1表示有异常信息,函数失败
  }

  return 0;
}

franka::RobotState 结构体提供了机械臂的状态信息,主要包括三类:

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

对于一个简单的读取操作,可以使用 franka::Robot::readOnce 函数:

franka::RobotState state = robot.readOnce();

franka::Robot:;read 函数的定义如下:

void franka::Robot::read(std::function< bool(const RobotState &)> read_callback)

 实际上,读取依靠的是 franka::RobotState 结构体,即 franka::Robot::read 函数的输入参数。而该参数在 franka::Robot::control 函数中也有,用起来都是当作反映机器人当前状态信息的常量。因此,很多时候并不需要单独使用 franka::Robot::read 函数专门读取数据,在控制环中也可以读取。但是,如前所述,每个控制周期内留个程序执行的时间一般小于300微妙,对于上述例程中用count输出信息的操作在实际控制环路中要尽量避免,使用读取函数就可以接受。

编译时出现 `make` 错误,如 `make[2]: *** [franka_ros/franka_gazebo/CMakeFiles/franka_hw_sim.dir/build.make:76:franka_ros/franka_gazebo/CMakeFiles/franka_hw_sim.dir/src/joint.cpp.o] 错误 1` 以及 `Invoking "make -j24 -l24" failed` ,可尝试以下方法解决: ### 1. 检查依赖项 确保项目所需的所有依赖项都已正确安装。例如,若报错涉及 `gazebo_ros` ,可按如下方法安装相关包(根据不同的 ROS 版本选择指令): ```bash # 对于 Noetic 版本 sudo apt install ros-noetic-gazebo-ros-pkgs # 对于 Kinetic 版本 sudo apt install ros-kinetic-gazebo-ros-pkgs ``` ### 2. 清理构建目录 有时候,旧的构建文件可能会导致编译问题。可删除构建目录并重新编译: ```bash # 进入工作空间 cd ~/your_workspace # 删除 build 和 devel 目录 rm -rf build devel # 重新编译 catkin_make ``` ### 3. 减少并行编译线程数 `make -j24 -l24` 表示使用 24 个线程进行并行编译,可能会因系统资源不足导致编译失败。可尝试减少线程数: ```bash # 使用较少的线程数进行编译 catkin_make -j4 -l4 ``` ### 4. 检查文件路径 若报错涉及文件找不到,如 `No such file or directory: /opt/ros/melodic/share/franka_description/robots/panda_arm_hand.urdf.xacro` ,需确保相关文件确实存在于指定路径,或者更新文件路径配置 [^3]。 ### 5. 检查动作客户端连接 若报错包含 `Action client not connected` ,需确保动作客户端已正确连接。例如,对于 `franka_state_controller/follow_joint_trajectory` ,需检查相关控制器和节点是否正常运行 [^1]。 ### 6. 查看详细错误日志 查看 `catkin_make` 生成的详细日志文件,通常位于 `~/your_workspace/logs` 目录下,从中获取更详细的错误信息,以定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵鱼爱吃小猫咪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值