GripperRosControl(const std::vector<std::string>& actr_names, const std::vector<std::string>& jnt_names,
                    const std::vector<std::string>& controller_names, const std::vector<double>& reducers)
    : actr_names_(actr_names)
    , jnt_names_(jnt_names)
    , controller_names_(controller_names)
  {
    for (int i = 0; i < jnt_names_.size(); i++)
    {
      std::string actr = actr_names_[i];
      std::string jnt = jnt_names_[i];

      // Get transmission
      boost::shared_ptr<transmission_interface::SimpleTransmission> t_ptr(
          new transmission_interface::SimpleTransmission(reducers[i]));
      trans_.push_back(t_ptr);

      // Initialize and wrap raw current data
      actr_curr_data_[actr].position.push_back(&actr_curr_pos_[actr]);
      actr_curr_data_[actr].velocity.push_back(&actr_curr_vel_[actr]);
      actr_curr_data_[actr].effort.push_back(&actr_curr_eff_[actr]);
      jnt_curr_data_[jnt].position.push_back(&jnt_curr_pos_[jnt]);
      jnt_curr_data_[jnt].velocity.push_back(&jnt_curr_vel_[jnt]);
      jnt_curr_data_[jnt].effort.push_back(&jnt_curr_eff_[jnt]);

      // Initialize and wrap raw command data
      actr_cmd_data_[actr].position.push_back(&actr_cmd_pos_[actr]);
      jnt_cmd_data_[jnt].position.push_back(&jnt_cmd_pos_[jnt]);

      // Register transmissions to each interface
      actr_to_jnt_state_.registerHandle(transmission_interface::ActuatorToJointStateHandle(
          actr + "_trans", trans_[i].get(), actr_curr_data_[actr], jnt_curr_data_[jnt]));
      jnt_to_actr_pos_.registerHandle(transmission_interface::JointToActuatorPositionHandle(
          jnt + "_trans", trans_[i].get(), actr_cmd_data_[actr], jnt_cmd_data_[jnt]));

      // Connect and register the joint state handle
      hardware_interface::JointStateHandle state_handle(jnt, &jnt_curr_pos_[jnt], &jnt_curr_vel_[jnt],
                                                        &jnt_curr_eff_[jnt]);
      jnt_state_interface_.registerHandle(state_handle);

      // Connect and register the joint position handle
      hardware_interface::JointHandle pos_handle(jnt_state_interface_.getHandle(jnt), &jnt_cmd_pos_[jnt]);
      pos_jnt_interface_.registerHandle(pos_handle);

      // ROS publishers and subscribers
      actr_cmd_pub_[actr] = nh_.advertise<std_msgs::Float64>("dxl/" + controller_names_[i] + "/command", 5);
      actr_state_sub_[actr] =
          nh_.subscribe("dxl/" + controller_names_[i] + "/state", 1, &GripperRosControl::actrStateCallback, this);
    }

    // Register interfaces
    registerInterface(&jnt_state_interface_);
    registerInterface(&pos_jnt_interface_);

    // Start spinning
    nh_.setCallbackQueue(&subscriber_queue_);
    subscriber_spinner_.reset(new ros::AsyncSpinner(1, &subscriber_queue_));
    subscriber_spinner_->start();
  }
// Set up the data for ros_controllers
int32_t VigirHumanoidHWInterface::init_robot_controllers(boost::shared_ptr<vigir_control::VigirRobotModel>& robot_model, //boost::shared_ptr< std::vector<std::string> >& joint_list,
                                                         boost::shared_ptr<ros::NodeHandle>& behavior_control_nh,
                                                         boost::shared_ptr<ros::NodeHandle>& joint_control_nh,
                                                         boost::shared_ptr<ros::NodeHandle>& private_nh)
{
    ROS_INFO(" Initialize the generic humanoid HW interfaces ...");
    // Store the list of controlled joints
    joint_names_ = robot_model->joint_names_;
    try {
        // State inputs
        std::cout << "Initialize HW interface for " << joint_names_->size() << " joints!" << std::endl;
        joint_state_positions_      = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);//.resize( joint_names_->size());
        joint_state_velocities_     = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);//.resize(joint_names_->size());
        joint_state_accelerations_  = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);//.resize(joint_names_->size());
        joint_state_efforts_        = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);//.resize(joint_names_->size());

        // Control outputs
        joint_command_positions_              = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_command_velocities_             = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_command_accelerations_          = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_command_control_                = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_command_efforts_                = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_command_friction_compensation_  = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);

        joint_position_errors_        = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_velocity_errors_        = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);
        joint_effort_errors_          = vigir_control::VectorNd::Constant(joint_names_->size(), 0.0);

    }
    catch(...)
    {
        std::cerr << "Failed to allocate memory for controllers!" << std::endl;
        return ROBOT_CONTROLLERS_FAILED_TO_INITIALIZE;
    }

    for (size_t i = 0; i < joint_names_->size(); ++i){

      hardware_interface::JointStateHandle state_handle(joint_names_->at(i), &joint_state_positions_[i], &joint_state_velocities_[i], &joint_state_efforts_[i]);
      joint_state_interface_.registerHandle(state_handle);

      hardware_interface::JointHandle pos_handle(joint_state_interface_.getHandle(joint_names_->at(i)), &joint_command_positions_[i]);
      position_joint_interface_.registerHandle(pos_handle);

      hardware_interface::JointHandle vel_handle(joint_state_interface_.getHandle(joint_names_->at(i)), &joint_command_velocities_[i]);
      velocity_joint_interface_.registerHandle(vel_handle);

      hardware_interface::JointHandle effort_handle(joint_state_interface_.getHandle(joint_names_->at(i)), &joint_command_efforts_[i]);
      effort_joint_interface_.registerHandle(effort_handle);

      hardware_interface::PosVelAccJointHandle pos_vel_acc_handle (joint_state_interface_.getHandle(joint_names_->at(i)),
                                                                   &joint_command_positions_[i], &joint_command_velocities_[i], &joint_command_accelerations_[i]);
      pos_vel_acc_joint_interface_.registerHandle(pos_vel_acc_handle);

      hardware_interface::PosVelAccErrHumanoidJointHandle handle (joint_state_interface_.getHandle(joint_names_->at(i)),
                                                                  &joint_command_positions_[i], &joint_command_velocities_[i], &joint_command_accelerations_[i],
                                                                  &joint_position_errors_[i], &joint_velocity_errors_[i]);

      pos_vel_acc_err_humanoid_joint_interface_.registerHandle(handle);

    }

    try {
        ROS_INFO(" Load the whole robot controller handle ...");

        hardware_interface::VigirHumanoidControllerHandle controller_handle(std::string("controller_handle"),
                                                                    &joint_state_positions_,
                                                                    &joint_state_velocities_,
                                                                    &joint_state_accelerations_,
                                                                    &joint_state_efforts_,
                                                                    &joint_command_positions_,             //!< desired position
                                                                    &joint_command_velocities_,            //!< desired velocity
                                                                    &joint_command_accelerations_,         //!< desired acceleration
                                                                    &joint_command_efforts_,               //!< desired effort
                                                                    &joint_command_control_,               //!< desired control command (acceleration)
                                                                    &joint_command_friction_compensation_, //!< effort to compensate for friction
                                                                    &joint_position_errors_,
                                                                    &joint_velocity_errors_,
                                                                    &joint_effort_errors_,
                                                                    &robot_l_foot_wrench_,
                                                                    &robot_r_foot_wrench_,
                                                                    &robot_l_hand_wrench_,
                                                                    &robot_r_hand_wrench_,
                                                                    &robot_pose_,
                                                                    robot_model);
        humanoid_controller_interface_.registerHandle(controller_handle);

        ROS_INFO(" Register the controller interface...");
        registerInterface(&humanoid_controller_interface_);
    }
    catch(...)
    {
        ROS_ERROR("Exception: could not initialize the Atlas pelvis control interface");
        return ROBOT_EXCEPTION_CONTROLLERS_FAILED_TO_INITIALIZE;
    }

    registerInterface(&joint_state_interface_);
    registerInterface(&position_joint_interface_);
    registerInterface(&velocity_joint_interface_);
    registerInterface(&effort_joint_interface_);
    registerInterface(&pos_vel_acc_joint_interface_);
    registerInterface(&pos_vel_acc_err_humanoid_joint_interface_);

    ROS_INFO(" Done initializing the base HWInterface class for the humanoid controller ...");
    return ROBOT_INITIALIZED_OK;
}
  HRESULT DensoRobotHW::Initialize()
  {
    ros::NodeHandle nh;

    if (!nh.getParam("robot_name", m_robName)) {
      ROS_WARN("Failed to get robot_name parameter.");
    }

    if (!nh.getParam("robot_joints", m_robJoints)) {
      ROS_WARN("Failed to get robot_joints parameter.");
    }

    for (int i = 0; i < m_robJoints; i++) {
      std::stringstream ss;
      ss << "joint_" << i+1;

      if (!nh.getParam(ss.str(), m_type[i])) {
        ROS_WARN("Failed to get joint_%d parameter.", i+1);
        ROS_WARN("It was assumed revolute type.");
        m_type[i] = 1;
      }

      hardware_interface::JointStateHandle state_handle(ss.str(),
          &m_pos[i], &m_vel[i], &m_eff[i]);
      m_JntStInterface.registerHandle(state_handle);

      hardware_interface::JointHandle pos_handle(
          m_JntStInterface.getHandle(ss.str()), &m_cmd[i]);
      m_PosJntInterface.registerHandle(pos_handle);
    }

    int armGroup = 0;
    if (!nh.getParam("arm_group", armGroup)) {
      ROS_INFO("Use arm group 0.");
      armGroup = 0;
    }

    int format = 0;
    if(nh.getParam("send_format", format)) {
      m_sendfmt = format;
    }

    format = 0;
    if(nh.getParam("recv_format", format)) {
      m_recvfmt = format;
    }
    switch(m_recvfmt & DensoRobotRC8::RECVFMT_POSE) {
      case DensoRobotRC8::RECVFMT_POSE_J:
      case DensoRobotRC8::RECVFMT_POSE_PJ:
      case DensoRobotRC8::RECVFMT_POSE_TJ:
        break;
      default:
	ROS_WARN("Recieve format has to contain joint.");
	m_recvfmt = ((m_recvfmt & ~DensoRobotRC8::RECVFMT_POSE)
	  | DensoRobotRC8::RECVFMT_POSE_J);
        break;
    }

    registerInterface(&m_JntStInterface);
    registerInterface(&m_PosJntInterface);

    HRESULT hr = m_eng->Initialize();
    if(FAILED(hr)) {
      ROS_ERROR("Failed to connect real controller. (%X)", hr);
      return hr;
    }

    m_ctrl = m_eng->get_Controller();

    DensoRobot_Ptr pRob;
    hr = m_ctrl->get_Robot(DensoBase::SRV_ACT, &pRob);
    if(FAILED(hr)) {
      ROS_ERROR("Failed to connect real robot. (%X)", hr);
      return hr;
    }

    m_rob = boost::dynamic_pointer_cast<DensoRobotRC8>(pRob);

    hr = CheckRobotType();
    if(FAILED(hr)) {
      ROS_ERROR("Invalid robot type.");
      return hr;
    }

    m_rob->ChangeArmGroup(armGroup);

    hr = m_rob->ExecCurJnt(m_joint);
    if(FAILED(hr)) {
      ROS_ERROR("Failed to get current joint. (%X)", hr);
      return hr;
    }

    hr = m_ctrl->AddVariable("@ERROR_CODE");
    if(SUCCEEDED(hr)) {
      hr =  m_ctrl->get_Variable("@ERROR_CODE", &m_varErr);
    }
    if(FAILED(hr)) {
      ROS_ERROR("Failed to get @ERROR_CODE object. (%X)", hr);
      return hr;
    }

    {
      // Clear Error
      VARIANT_Ptr vntVal(new VARIANT());
      vntVal->vt = VT_I4; vntVal->lVal = 0L;
      hr = m_varErr->ExecPutValue(vntVal);
      if(FAILED(hr)) {
        ROS_ERROR("Failed to clear error. (%X)", hr);
        return hr;
      }
    }

    hr = m_rob->AddVariable("@SERVO_ON");
    if(SUCCEEDED(hr)) {
      DensoVariable_Ptr pVar;
      hr = m_rob->get_Variable("@SERVO_ON", &pVar);
      if(SUCCEEDED(hr)) {
        VARIANT_Ptr vntVal(new VARIANT());
        vntVal->vt = VT_BOOL;
        vntVal->boolVal = VARIANT_TRUE;
        hr = pVar->ExecPutValue(vntVal);
      }
    }
    if(FAILED(hr)) {
      ROS_ERROR("Failed to motor on. (%X)", hr);
      return hr;
    }

    m_rob->put_SendFormat(m_sendfmt);
    m_sendfmt = m_rob->get_SendFormat();

    m_rob->put_RecvFormat(m_recvfmt);
    m_recvfmt = m_rob->get_RecvFormat();

    m_subChangeMode = nh.subscribe<Int32>(
        "ChangeMode", 1, &DensoRobotHW::Callback_ChangeMode, this);
    m_pubCurMode = nh.advertise<Int32>("CurMode", 1);
    
    hr = ChangeModeWithClearError(DensoRobotRC8::SLVMODE_SYNC_WAIT
	| DensoRobotRC8::SLVMODE_POSE_J);
    if(FAILED(hr)) {
      ROS_ERROR("Failed to change to slave mode. (%X)", hr);
      return hr;
    }

    return S_OK;
  }