函数主体
try {
franka::Robot robot(argv[1]);
size_t count = 0;
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会增加延迟。对于这样的读取循环是可以接受的,但不应该在控制循环中完成。
std::cout << robot_state << std::endl;
return count++ < 100;
});
std::cout << "Done." << std::endl;
} catch (franka::Exception const& e) {
std::cout << e.what() << std::endl;
return -1;
}
代码中较为重要函数是robot.read()
,主要功能为:
函数:
void franka::Robot::read(std::function<bool (const franka::RobotState &)> read_callback)
功能描述: Starts a loop for reading the current robot state.Cannot be executed while a control or motion generator loop is running.
参数:read_callback
– Callback function for robot state reading.
通过描述可以看到robot.read()
函数的主要功能是读取当前机器人的状态,接收的参数是bool
型,为true
则读取。
执行结果
{
"O_T_EE": [0.998578,0.0328747,-0.0417381,0,0.0335224,-0.999317,0.0149157,0,-0.04122,-0.016294,
-0.999017,0,0.305468,-0.00814133,0.483198,1],
"O_T_EE_d": [0.998582,0.0329548,-0.041575,0,0.0336027,-0.999313,0.0149824,0,-0.0410535,
-0.0163585,-0.999023,0,0.305444,-0.00810967,0.483251,1],
"F_T_EE": [0.7071,-0.7071,0,0,0.7071,0.7071,0,0,0,0,1,0,0,0,0.1034,1],
"EE_T_K": [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],
"m_ee": 0.73,
"F_x_Cee": [-0.01,0,0.03],
"I_ee": [0.001,0,0,0,0.0025,0,0,0,0.0017],
"m_load": 0,
"F_x_Cload": [0,0,0],
"I_load": [0,0,0,0,0,0,0,0,0],
"m_total": 0.73,
"F_x_Ctotal": [-0.01,0,0.03],
"I_total": [0.001,0,0,0,0.0025,0,0,0,0.0017],
"elbow": [-0.0207622,-1],
"elbow_d": [-0.0206678,-1],
"tau_J": [-0.00359774,-5.08582,0.105732,21.8135,0.63253,2.18121,-0.0481953],
"tau_J_d": [0,0,0,0,0,0,0],
"dtau_J": [-54.0161,-18.9808,-64.6899,-64.2609,14.1561,28.5654,-11.1858],
"q": [0.0167305,-0.762614,-0.0207622,-2.34352,-0.0305686,1.53975,0.753872],
"dq": [0.00785939,0.00189343,0.00932415,0.0135431,-0.00220327,-0.00492024,0.00213604],
"q_d": [0.0167347,-0.762775,-0.0206678,-2.34352,-0.0305677,1.53975,0.753862],
"dq_d": [0,0,0,0,0,0,0],
"joint_contact": [0,0,0,0,0,0,0],
"cartesian_contact": [0,0,0,0,0,0],
"joint_collision": [0,0,0,0,0,0,0],
"cartesian_collision": [0,0,0,0,0,0],
"tau_ext_hat_filtered": [0.00187271,-0.700316,0.386035,0.0914781,-0.117258,-0.00667777,
-0.0252562],
"O_F_ext_hat_K": [-2.06065,0.45889,-0.150951,-0.482791,-1.39347,0.109695],
"K_F_ext_hat_K": [-2.03638,-0.529916,0.228266,-0.275938,0.434583,0.0317351],
"theta": [0.01673,-0.763341,-0.0207471,-2.34041,-0.0304783,1.54006,0.753865],
"dtheta": [0,0,0,0,0,0,0],
"current_errors": [],
"last_motion_errors": [],
"control_command_success_rate": 0,
"robot_mode": "Idle",
"time": 3781435
}
可以看到robot_state
中包含了机器人状态中大多数数据(如末端执行器在极坐标下的齐次变换矩阵、各关节的扭矩、角度以及它们的微分等等)。