extern crate optima;
use optima::robot_modules::robot_configuration_module::{ContiguousChainMobilityMode, RobotConfigurationModule};
use optima::robot_set_modules::robot_set::RobotSet;
use optima::robot_set_modules::robot_set_configuration_module::RobotSetConfigurationModule;
use optima::utils::utils_robot::robot_module_utils::RobotNames;
use optima::utils::utils_se3::optima_se3_pose::{OptimaSE3Pose, OptimaSE3PoseType};
fn main() {
let mut robot_set_configuration_module = RobotSetConfigurationModule::new_empty();
let mut ur5_configuration = RobotConfigurationModule::new_from_names(RobotNames::new_base("ur5")).expect("error");
ur5_configuration.set_mobile_base(ContiguousChainMobilityMode::PlanarTranslation {
x_bounds: (-2.0, 2.0),
y_bounds: (-2.0, 2.0)
}).expect("error");
robot_set_configuration_module.add_robot_configuration(ur5_configuration).expect("error");
let mut sawyer_configuration = RobotConfigurationModule::new_from_names(RobotNames::new_base("sawyer")).expect("error");
sawyer_configuration.set_base_offset(&OptimaSE3Pose::new_from_euler_angles(0.,0.,0., 0., 1., 0., &OptimaSE3PoseType::ImplicitDualQuaternion)).expect("error");
sawyer_configuration.set_dead_end_link(2).expect("error");
robot_set_configuration_module.add_robot_configuration(sawyer_configuration).expect("error");
robot_set_configuration_module.save_robot_set_configuration_module("test_configuration").expect("error");
let loaded_robot_set_configuration_module = RobotSetConfigurationModule::new_from_set_name("test_configuration").expect("error");
let robot_set = RobotSet::new_from_robot_set_configuration_module(loaded_robot_set_configuration_module);
robot_set.print_summary();
robot_set.robot_set_configuration_module().print_summary();
robot_set.robot_set_joint_state_module().print_dof_summary();
}