/***************************************************************************** ****************************************************************************** Function Name : init_test_task Date : Dec. 1997 Remarks: initialization for task ****************************************************************************** Paramters: (i/o = input/output) none *****************************************************************************/ static int init_test_task(void) { int j,i; int ans; get_int("Which axis?",ax,&ax); freezeBase(TRUE); ans = 999; while (ans == 999) { if (!get_int("Enter 1 to start or anthing else to abort ...",ans,&ans)) return FALSE; } if (ans != 1) return FALSE; task_time = 0.0; start_time = task_servo_time; return TRUE; }
HInvDynExample::HInvDynExample() : config_file_("HInvDynExampleConfig.cf"), contact_helper_(config_file_), hinvdyn_solver_(kinematics_, momentum_helper_, contact_helper_, endeff_kinematics_), dyn_eqs_(hinvdyn_solver_), cog_ctrl_(hinvdyn_solver_), left_foot_constr_(hinvdyn_solver_), right_foot_constr_(hinvdyn_solver_), joint_ctrl_(hinvdyn_solver_), left_frc_reg_(hinvdyn_solver_), right_frc_reg_(hinvdyn_solver_){ // stop data collection to avoid crashes stopcd(); freezeBase(false); //set the endeffector constraints for double support std::cout << "N_ENDEFFS : " << N_ENDEFFS << std::endl; for(int i=1; i<=N_ENDEFFS; ++i){ endeff_constraints_[i] = endeff[i]; for(int j=1; j<=6; ++j) endeff_constraints_[i].c[j] = 1; } for(int j=1; j<=6; ++j) endeff_constraints_[0].c[j] = 0; for (int i = 1; i < N_DOFS; ++i) { std::cout << "joint_names " << joint_names[i] << " " << i << std::endl; } // initialize our helpers kinematics_.initialize(joint_state, base_state, base_orient,endeff_constraints_); momentum_helper_.initialize(); contact_helper_.initialize(&kinematics_); hinvdyn_solver_.initialize(); // read simulation parameters if(!read_parameter_pool_double(config_file_.c_str(),"push_force",&push_force_)) assert(false && "reading parameter push_force failed"); if(!read_parameter_pool_double(config_file_.c_str(),"push_dur",&push_dur_)) assert(false && "reading parameter push_dur failed"); // read ranks from config file if(!read_parameter_pool_int(config_file_.c_str(),"foot_constr_rank",&foot_constr_rank_)) assert(false && "reading parameter foot_constr_rank failed"); if(!read_parameter_pool_int(config_file_.c_str(),"joint_ctrl_rank",&joint_ctrl_rank_)) assert(false && "reading parameter joint_ctrl_rank failed"); if(!read_parameter_pool_int(config_file_.c_str(),"cog_ctrl_rank",&cog_ctrl_rank_)) assert(false && "reading parameter cog_ctrl_rank failed"); //if(!read_parameter_pool_int(config_file_.c_str(),"frc_reg_rank",&frc_reg_rank_)) //assert(false && "reading parameter frc_reg_rank failed"); // read PD gains from config file double buffer[N_DOFS+6+1]; if(!read_parameter_pool_double_array(config_file_.c_str(),"COG_P_GAINS",3,buffer)) assert(false && "reading parameter COG_P_GAINS failed"); cog_p_gains_ = Eigen::Map<Eigen::Vector3d>(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"COG_D_GAINS",3,buffer)) assert(false && "reading parameter COG_D_GAINS failed"); cog_d_gains_ = Eigen::Map<Eigen::Vector3d>(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"POSTURE_P_GAINS",N_DOFS+6,buffer)) assert(false && "reading parameter POSTURE_P_GAINS failed"); posture_p_gains_ = Eigen::Map<Eigen::Matrix<double, N_DOFS+6,1> >(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"POSTURE_D_GAINS",N_DOFS+6,buffer)) assert(false && "reading parameter POSTURE_D_GAINS failed"); posture_d_gains_ = Eigen::Map<Eigen::Matrix<double, N_DOFS+6,1> >(&buffer[1]); // read weights from config file if(!read_parameter_pool_double_array(config_file_.c_str(),"FOOT_CONSTR_WEIGHT", 6, buffer)) assert(false && "reading parameter FOOT_CONSTR_WEIGHT failed"); foot_constr_weight_ = Eigen::Map<Eigen::Matrix<double, 6,1> >(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"COG_CTRL_WEIGHT", 6, buffer)) assert(false && "reading parameter COG_CTRL_WEIGHT failed"); cog_ctrl_weight_ = Eigen::Map<Eigen::Matrix<double, 6,1> >(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"FRC_REG_WEIGHT", 6, buffer)) assert(false && "reading parameter FRC_REG_WEIGHT failed"); frc_reg_weight_ = Eigen::Map<Eigen::Matrix<double, 6,1> >(&buffer[1]); if(!read_parameter_pool_double_array(config_file_.c_str(),"JOINT_CTRL_WEIGHT", N_DOFS+6, buffer)) assert(false && "reading parameter JOINT_CTRL_WEIGHT failed"); joint_ctrl_weight_ = Eigen::Map<Eigen::Matrix<double, N_DOFS+6,1> >(&buffer[1]); // setup task composers dyn_eqs_.initialize(0); right_foot_constr_.initialize(foot_constr_rank_, link2endeffmap[RIGHT_FOOT]); right_foot_constr_.weightingMat() = foot_constr_weight_.asDiagonal(); left_foot_constr_.initialize(foot_constr_rank_, link2endeffmap[LEFT_FOOT]); left_foot_constr_.weightingMat() = foot_constr_weight_.asDiagonal(); cog_ctrl_.initialize(cog_ctrl_rank_); cog_ctrl_.weightingMat() = cog_ctrl_weight_.asDiagonal(); joint_ctrl_.initialize(joint_ctrl_rank_); joint_ctrl_.weightingMat() = joint_ctrl_weight_.asDiagonal(); right_frc_reg_.initialize(frc_reg_rank_, RIGHT_FOOT, true); right_frc_reg_.weightingMat() = frc_reg_weight_.asDiagonal(); left_frc_reg_.initialize(frc_reg_rank_, LEFT_FOOT, true); left_frc_reg_.weightingMat() = frc_reg_weight_.asDiagonal(); // subscribe our controllers and constraints to the hierarchical solver hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&dyn_eqs_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&joint_ctrl_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&cog_ctrl_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&right_foot_constr_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&left_foot_constr_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&right_frc_reg_)); hinvdyn_solver_.sub_cost_composers_.push_back( static_cast<HierarchAffineCost*>(&left_frc_reg_)); // get some initial states of the robot for tracking cog_des_ = kinematics_.cog(); default_posture_ = kinematics_.generalizedJointPositions(); for(int i=1; i<=N_DOFS; ++i){ joint_des_state[i].th = joint_default_state[i].th; default_posture_[i-1] = joint_default_state[i].th; std::string varname = std::string(joint_names[i]); varname.append("_ref_th"); std::cout << "adding variable " << varname << std::endl; addVarToCollect((char *)&(default_posture_[i-1]), varname.c_str(),"rad",DOUBLE,TRUE); } // register variables for data collection addVarToCollect((char *)&(cog_des_[0]), "cog_des_x","m",DOUBLE,TRUE); addVarToCollect((char *)&(cog_des_[1]), "cog_des_y","m",DOUBLE,TRUE); addVarToCollect((char *)&(cog_des_[2]), "cog_des_z","m",DOUBLE,TRUE); addVarToCollect((char *)&(cog_ref_[0]), "cog_ref_ddx","m/s^2",DOUBLE,TRUE); addVarToCollect((char *)&(cog_ref_[1]), "cog_ref_ddy","m/s^2",DOUBLE,TRUE); addVarToCollect((char *)&(cog_ref_[2]), "cog_ref_ddz","m/s^2",DOUBLE,TRUE); // update SL data collection and start collecting data updateDataCollectScript(); scd(); std::cout << "Initialization done." << std::endl; task_start_time_ = task_servo_time; for(int i=1; i<=N_DOFS; ++i){ init_joint_state_uff_[i-1] = joint_des_state[i].uff; init_joint_state_th_[i-1] = joint_des_state[i].th; init_joint_state_thd_[i-1] = joint_des_state[i].thd; init_joint_state_thdd_[i-1] = joint_des_state[i].thdd; } }