Exemple #1
0
bool Animation::getIK(BVHNode* node)
{
  QString jointName=node->name();

  if(jointName=="lHand" ||
     jointName=="lForeArm" ||
     jointName=="lShldr" ||
     jointName=="lCollar")
  {
    return getIK(IK_LHAND);
  }
  else if(jointName=="rHand" ||
          jointName=="rForeArm" ||
          jointName=="rShldr" ||
          jointName=="rCollar")
  {
    return getIK(IK_RHAND);
  }
  else if(jointName=="lThigh" ||
          jointName=="lShin" ||
          jointName=="lFoot")
  {
    return getIK(IK_LFOOT);
  }
  else if(jointName=="rThigh" ||
          jointName=="rShin" ||
          jointName=="rFoot")
  {
    return getIK(IK_RFOOT);
  }
  return false;
}
RTC::ReturnCode_t HockeyArmController::onExecute(RTC::UniqueId ec_id)
{
  ;

  // output the arm position
  static signed long prevArmX = 0;
  static signed long prevArmY = 0;
  signed long armX = g_posController[0].getEncCount();
  signed long armY = g_posController[1].getEncCount();
  if (armX != prevArmX  ||  armY != prevArmY) {
      coil::TimeValue tm(coil::gettimeofday());
      m_ArmXY_out.tm.sec  = tm.sec();
      m_ArmXY_out.tm.nsec = tm.usec() * 1000;

      CvPoint2D64f th = {
          pulse2rad((armX-INIT_ENC_X)/MOTOR_X_RATIO, 2500*ENCODER_EVAL) + M_PI/2.0,
          pulse2rad((armY-INIT_ENC_Y)/MOTOR_Y_RATIO, 2500*ENCODER_EVAL)
      };

      CvPoint2D64f xy = getFK(th, ARM_1LEN, ARM_2LEN);
      m_ArmXY_out.data[0] = xy.x;
      m_ArmXY_out.data[1] = xy.y - ARM_OFFSET - HKY_H/2.0;

      m_ArmXY_outOut.write();
  }

  if (!m_armXY_inIn.isNew()) return RTC::RTC_OK;
  m_armXY_inIn.read();

  CvPoint2D64f xy = {
      m_armXY_in.data[0],
      m_armXY_in.data[1] + ARM_OFFSET + HKY_H/2.0
  };
  if (!isArmMovable(xy, ARM_1LEN*0.97, ARM_2LEN*0.97, HKY_W, ARM_MLT_R*1.03, ARM_OFFSET))
      return RTC::RTC_OK;

  CvPoint2D64f th = getIK(xy, ARM_1LEN, ARM_2LEN, true);
  g_posController[0].moveTo(rad2pulse(th.x - M_PI/2, 2500*ENCODER_EVAL) * MOTOR_X_RATIO + INIT_ENC_X, 1000);
  g_posController[1].moveTo(rad2pulse(th.y         , 2500*ENCODER_EVAL) * MOTOR_Y_RATIO + INIT_ENC_Y, 800);

  //std::cout << m_armXY_in.data[0] << ", " << m_armXY_in.data[1] << std::endl;

  return RTC::RTC_OK;
}
Exemple #3
0
//==============================================================================
const std::shared_ptr<InverseKinematics>& JacobianNode::getOrCreateIK()
{
  return getIK(true);
}
#include <opencv2/opencv.hpp>

#include "HockeyDefinitions.hpp"
#include "PositionController.hpp"
#include "DeviceManager.hpp"
#include "MyMath.hpp"

/* --- グローバル変数 --- */
static unsigned char g_opened[2] = {0x00, 0x00}; // A-IOボードのオープンフラグ
PositionController g_posController[2]; // 位置決め制御クラスのインスタンス
// アームの初期位置
//const CvPoint2D64f g_initXY = {0.0, ARM_1LEN + ARM_2LEN - 50};
//const CvPoint2D64f g_initXY = {0.0, 280+203};
const CvPoint2D64f g_initXY = {0.0, 300+203};
const CvPoint2D64f g_initTh = getIK(g_initXY, ARM_1LEN, ARM_2LEN);


static void clearEncoderCountWithZ(PositionController &p1, PositionController &p2)
{
    p1.encoderInit(false); usleep(100000);
    p2.encoderInit(false); usleep(100000);
    fprintf(stderr, "Z clear OK!\n");

    p1.moveTo(INIT_ENC_X, 500);
    p2.moveTo(INIT_ENC_Y, 500);
//    while (!p1.isMoved() || !p2.isMoved()) { usleep(100); }
//
//    p1.servoOff(); p2.servoOff();
//    p1.encoderInit(true);
//    p2.encoderInit(true);