pub use franka::Matrix7;
pub use franka::Vector7;
use franka::{Finishable, Matrix6x7};
use nalgebra::{Isometry3, Vector6};
#[derive(Debug)]
pub struct RobotState {
pub joint_positions_d: Vector7,
pub joint_positions: Vector7,
pub joint_velocities: Vector7,
pub joint_velocities_d: Vector7,
pub joint_torques: Vector7,
pub end_effector_pose_c: Isometry3<f64>,
pub end_effector_pose: Isometry3<f64>,
pub end_effector_pose_d: Isometry3<f64>,
pub end_effector_velocity_d: Vector6<f64>,
pub jacobian: Matrix6x7,
pub mass_matrix: Matrix7,
pub coriolis: Vector7,
pub gravity: Vector7,
pub control_command_success_rate: f64,
}
pub struct GripperState {
pub gripper_width: f64,
pub closed: bool,
}
pub struct Torques {
pub torques: Vector7,
pub is_finished: bool,
}
impl From<franka::Torques> for Torques {
fn from(t: franka::Torques) -> Self {
let is_finished = t.is_finished();
Torques {
torques: Vector7::from_column_slice(&t.tau_J),
is_finished,
}
}
}
impl From<Torques> for franka::Torques {
fn from(t: Torques) -> Self {
let is_finished = t.is_finished;
let mut out = franka::Torques::new(t.torques.into());
out.set_motion_finished(is_finished);
out
}
}
impl From<Vector7> for Torques {
fn from(vec: Vector7) -> Self {
Torques {
torques: vec,
is_finished: false,
}
}
}
pub struct JointPositions {
pub joint_positions: Vector7,
pub is_finished: bool,
}
impl From<franka::JointPositions> for JointPositions {
fn from(t: franka::JointPositions) -> Self {
let is_finished = t.is_finished();
JointPositions {
joint_positions: Vector7::from_column_slice(&t.q),
is_finished,
}
}
}
impl From<JointPositions> for franka::JointPositions {
fn from(t: JointPositions) -> Self {
let is_finished = t.is_finished;
let mut out = franka::JointPositions::new(t.joint_positions.into());
out.set_motion_finished(is_finished);
out
}
}
impl From<Vector7> for JointPositions {
fn from(vec: Vector7) -> Self {
JointPositions {
joint_positions: vec,
is_finished: false,
}
}
}
pub struct CartesianPose {
pub pose: Isometry3<f64>,
pub is_finished: bool,
}
impl From<franka::CartesianPose> for CartesianPose {
fn from(pose: franka::CartesianPose) -> Self {
CartesianPose {
pose: franka::utils::array_to_isometry(&pose.O_T_EE),
is_finished: pose.is_finished(),
}
}
}
impl From<CartesianPose> for franka::CartesianPose {
fn from(pose: CartesianPose) -> Self {
let is_finished = pose.is_finished;
let mut out: franka::CartesianPose = pose.pose.into();
out.set_motion_finished(is_finished);
out
}
}
impl From<Isometry3<f64>> for CartesianPose {
fn from(pose: Isometry3<f64>) -> Self {
CartesianPose {
pose,
is_finished: false,
}
}
}
impl From<franka::RobotState> for RobotState {
fn from(state: franka::RobotState) -> Self {
RobotState {
joint_positions_d: Vector7::from_column_slice(&state.q_d),
joint_positions: Vector7::from_column_slice(&state.q),
joint_velocities: Vector7::from_column_slice(&state.dq),
joint_velocities_d: Vector7::from_column_slice(&state.dq),
joint_torques: Vector7::from_column_slice(&state.tau_J),
end_effector_pose_c: franka::utils::array_to_isometry(&state.O_T_EE_c),
end_effector_pose_d: franka::utils::array_to_isometry(&state.O_T_EE_d),
end_effector_pose: franka::utils::array_to_isometry(&state.O_T_EE),
end_effector_velocity_d: state.O_dP_EE_d.into(),
jacobian: Matrix6x7::zeros(),
mass_matrix: Matrix7::zeros(),
coriolis: Vector7::zeros(),
gravity: Vector7::zeros(),
control_command_success_rate: state.control_command_success_rate,
}
}
}
impl From<franka::GripperState> for GripperState {
fn from(state: franka::GripperState) -> Self {
GripperState {
gripper_width: state.width,
closed: state.is_grasped,
}
}
}
#[cfg(test)]
mod tests {
use crate::types::{Torques, Vector7};
#[test]
pub fn convert_torques() {
let vec = Vector7::from_column_slice(&[0., 1., 2., 3., 4., 5., 6.]);
let torque = Torques::from(vec.clone());
let franka_torque: franka::Torques = torque.into();
let orig_torque: Torques = franka_torque.into();
let orig_vec: Vector7 = orig_torque.torques;
for i in 0..7 {
assert_eq!(orig_vec[i], vec[i]);
}
}
}