コード例 #1
0
ファイル: Irp6otmM2J.cpp プロジェクト: snyzcalm/irp6_robot
void Irp6otmM2J::updateHook() {
  if (RTT::NewData == port_desired_motor_position_.read(motor_position_)) {
    mp2i(&motor_position_(0), &joint_position_(0));
    port_joint_position_.write(joint_position_);
    desired_motor_pos_initiated_ = true;
  } else if ((!desired_motor_pos_initiated_)
      && (RTT::NewData == port_motor_position_.read(motor_position_))) {
    mp2i(&motor_position_(0), &joint_position_(0));
    port_joint_position_.write(joint_position_);
  }
}
コード例 #2
0
ファイル: irp6p_servo.cpp プロジェクト: Laciaty/irp6_robot
bool IRP6pServo::startHook()
{
    try
    {
        for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
            hi_.insertSetValue(i, 0);
        hi_.readWriteHardware();

        if (hi_.isRobotSynchronized())
        {
            for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
                motor_pos_old_[i] = ((double)hi_.getPosition(i) / (ENC_RES[i]/(2*M_PI)));

            if(!checkMotorPosition(motor_pos_old_))
                std::cout << "current motor state out of range !!!" << std::endl;

            mp2i(motor_pos_old_, joint_pos_);

            for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
            {
                dsrJntPos_[i] = joint_pos_[i];

            }
            cmdJntPos_ = dsrJntPos_;
            state_ = SERVOING;
        }
        else
        {
            std::cout << "robot not synchronized" << std::endl;

            if(autoSynchronize_)
            {
                std::cout << "synchronizing .. " << std::endl;
                synchro_state_ = MOVE_TO_SYNCHRO_AREA;
                state_ = SYNCHRONIZING;
                synchro_drive_ = 0;
            } else
            {
                state_ = NOT_SYNCHRONIZED;
            }
        }
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
        return false;
    }

    for(unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
    {
        reg_[i].reset();
        pos_inc_[i] = 0.0;
    }
    return true;
}
コード例 #3
0
void SarkofagM2J::updateHook() {
  if (RTT::NewData == port_motor_position_.read(motor_position_)) {
    mp2i(&motor_position_(0), &joint_position_(0));
    port_joint_position_.write(joint_position_);
  }
}
コード例 #4
0
ファイル: irp6p_servo.cpp プロジェクト: Laciaty/irp6_robot
void IRP6pServo::updateHook()
{
    double motor_pos[NUMBER_OF_DRIVES];
    double pwm[NUMBER_OF_DRIVES];

    switch (state_)
    {
    case NOT_SYNCHRONIZED :
        for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
            pos_inc_[i] = 0.0;
        break;
    case SERVOING :
        if (dsrJntPos_port_.read(dsrJntPos_) == RTT::NewData)
        {

            double joint_pos_new[NUMBER_OF_DRIVES];
            double motor_pos_new[NUMBER_OF_DRIVES];

            for(unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
                joint_pos_new[i] = dsrJntPos_[i];

            if(i2mp(joint_pos_new, motor_pos_new))
            {
                for(unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
                {
                    pos_inc_[i] = (motor_pos_new[i] - motor_pos_old_[i]) * ((double)ENC_RES[i]/(2*M_PI));
                    motor_pos_old_[i] = motor_pos_new[i];
                }

            } else
            {
                std::cout << "setpoint out of motor range !!! " << std::endl;
                for(unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
                    pos_inc_[i] = 0.0;
            }
            cmdJntPos_ = dsrJntPos_;
        }
        else
        {
            for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
                pos_inc_[i] = 0.0;
        }
        break;
    case SYNCHRONIZING :
        switch (synchro_state_)
        {
        case MOVE_TO_SYNCHRO_AREA :
            if (hi_.isInSynchroArea(synchro_drive_))
            {
                std::cout << "[servo " << synchro_drive_ << " ] MOVE_TO_SYNCHRO_AREA cmp" << std::endl;
                pos_inc_[synchro_drive_] = 0.0;
                delay_ = 500;
                synchro_state_ = STOP;
                std::cout << "[servo " << synchro_drive_ << " ] STOP start" << std::endl;
            }
            else
            {
                pos_inc_[synchro_drive_] = SYNCHRO_STEP_COARSE[synchro_drive_] * (ENC_RES[synchro_drive_]/(2*M_PI));
            }
            break;
        case STOP :
            if(delay_-- < 0)
            {
                std::cout << "[servo " << synchro_drive_ << " ] STOP cmp" << std::endl;
                synchro_state_ = MOVE_FROM_SYNCHRO_AREA;
                hi_.startSynchro(synchro_drive_);
                std::cout << "[servo " << synchro_drive_ << " ] MOVE_FROM_SYNCHRO_AREA start" << std::endl;
            }
            break;
        case MOVE_FROM_SYNCHRO_AREA :
            if (hi_.isImpulseZero(synchro_drive_) && isInSynchroArea(synchro_drive_))
            {
                std::cout << "[servo " << synchro_drive_ << " ] MOVE_FROM_SYNCHRO_AREA cmp " << std::endl;
                hi_.finishSynchro(synchro_drive_);
                hi_.resetPosition(synchro_drive_);
                reg_[synchro_drive_].reset();
                pos_inc_[synchro_drive_] = 0.0;
                motor_pos_old_[synchro_drive_] = ((double)hi_.getPosition(synchro_drive_) / (ENC_RES[synchro_drive_]/(2*M_PI)));

                if(++synchro_drive_ < NUMBER_OF_DRIVES)
                {
                    synchro_state_ = MOVE_TO_SYNCHRO_AREA;
                } else
                {
                    synchro_state_ = SYNCHRO_END;
                }
            }
            else
            {
                pos_inc_[synchro_drive_] = SYNCHRO_STEP_FINE[synchro_drive_] * (ENC_RES[synchro_drive_]/(2*M_PI));
            }
            break;
        case SYNCHRO_END:
            if(!checkMotorPosition(motor_pos_old_))
                std::cout << "current motor state out of range !!!" << std::endl;

            mp2i(motor_pos_old_, joint_pos_);

            for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
            {
                dsrJntPos_[i] = joint_pos_[i];
            }

            state_ = SERVOING;
            break;
        }
        break;
    }

    for(unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
    {
        int64_t increment = hi_.getIncrement(i);
        if(abs(increment) > 400)
        {
            std::cout << "!!!! increment > 400 !!!!" << std::endl;
            increment = 0;
        }

        if(fabs(pos_inc_[i]) > 400)
        {
            std::cout << "!!!! pos_inc > 400 !!!!" << std::endl;
            pos_inc_[i] = 0;
        }

        pwm[i] = reg_[i].doServo(pos_inc_[i], increment);
    }

    try
    {
        for(unsigned int i = 0; i < 6; i++)
            hi_.insertSetValue(i, pwm[i]);
        hi_.readWriteHardware();
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    if(state_ == SERVOING)
    {
        for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
            motor_pos[i] = ((double)hi_.getPosition(i) / (ENC_RES[i]/(2*M_PI)));

        if(!checkMotorPosition(motor_pos))
            std::cout << "current motor state out of range !!!" << std::endl;

        mp2i(motor_pos, joint_pos_);

        for (unsigned int i = 0; i < NUMBER_OF_DRIVES; i++)
        {
            msrJntPos_[i] = joint_pos_[i];
        }

        msrJntPos_port_.write(msrJntPos_);
        cmdJntPos_port_.write(cmdJntPos_);

    }

}
コード例 #5
0
void Irp6otmM2J::updateHook() {
  port_motor_position_.read(motor_position_);
  mp2i(&motor_position_(0), &joint_position_(0));
  port_joint_position_.write(joint_position_);
}