Esempio n. 1
0
float Motor::update() {
  float pos = getPosition();

  // Velocity calculation should happen independent of mode
  float error = fmodf_mpi_pi(pos - setpoint);
  float posCtrlVal = pd.update(error);

  // In position mode, update the motor command
  if (mode == POSITION_MODE)
    val = posCtrlVal;
  // In open-loop mode, val has been set and nothing else needs to be done

  // Send command, but don't modify "val" (set by user)
  correctedVal = mapVal(val + barrier.calculate(pos));

  // send the command
  sendOpenLoop(correctedVal);

  // Return the command so that the slave can do the same thing
  return correctedVal;
}
Esempio n. 2
0
void PidDlg::onSend()
{
    Pid newPid;
    MotorTorqueParameters newMotorTorqueParams;

    switch (ui->tabMain->currentIndex()) {
    case TAB_POSITION:
        newPid.kp = ui->tablePosition->item(POSITION_KP,1)->text().toDouble();
        newPid.kd = ui->tablePosition->item(POSITION_KD,1)->text().toDouble();
        newPid.ki = ui->tablePosition->item(POSITION_KI,1)->text().toDouble();
        newPid.scale = ui->tablePosition->item(POSITION_SCALE,1)->text().toDouble();
        newPid.offset = ui->tablePosition->item(POSITION_OFFSET,1)->text().toDouble();
        newPid.stiction_up_val = ui->tablePosition->item(POSITION_STICTIONUP,1)->text().toDouble();
        newPid.max_output = ui->tablePosition->item(POSITION_MAXOUTPUT,1)->text().toDouble();
        newPid.stiction_down_val = ui->tablePosition->item(POSITION_STICTIONDW,1)->text().toDouble();
        newPid.max_int = ui->tablePosition->item(POSITION_MAXINT,1)->text().toDouble();
        sendPositionPid(jointIndex,newPid);
        break;
    case TAB_VELOCITY:
        newPid.kp = ui->tableVelocity->item(VELOCITY_KP, 1)->text().toDouble();
        newPid.kd = ui->tableVelocity->item(VELOCITY_KD, 1)->text().toDouble();
        newPid.ki = ui->tableVelocity->item(VELOCITY_KI, 1)->text().toDouble();
        newPid.scale = ui->tableVelocity->item(VELOCITY_SCALE, 1)->text().toDouble();
        newPid.offset = ui->tableVelocity->item(VELOCITY_OFFSET, 1)->text().toDouble();
        newPid.stiction_up_val = ui->tableVelocity->item(VELOCITY_STICTIONUP, 1)->text().toDouble();
        newPid.max_output = ui->tableVelocity->item(VELOCITY_MAXOUTPUT, 1)->text().toDouble();
        newPid.stiction_down_val = ui->tableVelocity->item(VELOCITY_STICTIONDW, 1)->text().toDouble();
        newPid.max_int = ui->tableVelocity->item(VELOCITY_MAXINT, 1)->text().toDouble();
        sendVelocityPid(jointIndex, newPid);
        break;
    case TAB_TORQUE:
        newPid.kp = ui->tableTorque->item(TORQUE_KP,1)->text().toDouble();
        newPid.kff = ui->tableTorque->item(TORQUE_KFF,1)->text().toDouble();
        newPid.kd = ui->tableTorque->item(TORQUE_KD,1)->text().toDouble();
        newMotorTorqueParams.bemf = ui->tableTorque->item(TORQUE_BEMFGAIN,1)->text().toDouble();
        newMotorTorqueParams.bemf_scale = ui->tableTorque->item(TORQUE_BEMFSCALE,1)->text().toDouble();
        newMotorTorqueParams.ktau = ui->tableTorque->item(TORQUE_KTAUGAIN,1)->text().toDouble();
        newMotorTorqueParams.ktau_scale = ui->tableTorque->item(TORQUE_KTAUSCALE,1)->text().toDouble();
        newPid.ki = ui->tableTorque->item(TORQUE_KI,1)->text().toDouble();
        newPid.scale = ui->tableTorque->item(TORQUE_SCALE,1)->text().toDouble();
        newPid.offset = ui->tableTorque->item(TORQUE_OFFSET,1)->text().toDouble();
        newPid.stiction_up_val = ui->tableTorque->item(TORQUE_STITCTIONUP,1)->text().toDouble();
        newPid.max_output = ui->tableTorque->item(TORQUE_MAXOUTPUT,1)->text().toDouble();
        newPid.stiction_down_val = ui->tableTorque->item(TORQUE_STICTIONDW,1)->text().toDouble();
        newPid.max_int = ui->tableTorque->item(TORQUE_MAXINT,1)->text().toDouble();
        sendTorquePid(jointIndex,newPid,newMotorTorqueParams);
        break;
    case TAB_STIFF:{
        double desiredStiff = ui->tableStiffness->item(0,3)->text().toDouble();
        double desiredDamp = ui->tableStiffness->item(1,3)->text().toDouble();
        double desiredForce = ui->tableStiffness->item(2,3)->text().toDouble();
        sendStiffness(jointIndex,desiredStiff,desiredDamp,desiredForce);
        break;
    }
    case TAB_OPENLOOP:{
        int desiredOpenLoop = ui->tableOpenloop->item(0,1)->text().toDouble();
        sendOpenLoop(jointIndex,desiredOpenLoop);
        break;
    }
    case TAB_CURRENT:{
        newPid.kp = ui->tableCurrent->item(CURRENT_KP, 1)->text().toDouble();
        newPid.kd = ui->tableCurrent->item(CURRENT_KD, 1)->text().toDouble();
        newPid.ki = ui->tableCurrent->item(CURRENT_KI, 1)->text().toDouble();
        newPid.scale = ui->tableCurrent->item(CURRENT_SCALE, 1)->text().toDouble();
        newPid.offset = ui->tableCurrent->item(CURRENT_OFFSET, 1)->text().toDouble();
        newPid.max_output = ui->tableCurrent->item(CURRENT_MAXOUTPUT, 1)->text().toDouble();
        newPid.max_int = ui->tableCurrent->item(CURRENT_MAXINT, 1)->text().toDouble();
        sendCurrentPid(jointIndex, newPid);
        break;
    }
    case TAB_VARIABLES:{
        // Remote Variables
        int rows = ui->tableVariables->rowCount();
        for (int i = 0; i < rows; i++)
        {
            std::string key = ui->tableVariables->item(i, 0)->text().toStdString();
            std::string val = ui->tableVariables->item(i, 1)->text().toStdString();
            yarp::os::Bottle valb(val);
            sendSingleRemoteVariable(key, valb);
        }
        updateAllRemoteVariables();
        break;
    }
    default:
        break;
    }


}