IndySDK 실행 방법
IndySDK 구성 요소
기본적으로 IndySDK 사용자는 조인트 컨트롤러 (Joint Controller) 를 대체하는 컴포넌트와 태스크 컨트롤러(Task Controller)를 대체하는 컴포넌트를 빌드 후 실행할 수 있습니다.
|
|
|
---|---|---|
|
|
|
|
|
참고
토크 계산 함수는 Indy Framework 내의 모든 실시간 사이클마다 호출됩니다. 이 함수의 계산 시간이 사이클 시간을 초과하지 않도록 하는 것이 중요합니다.
자세한 정보는 해당 경로의 파일을 확인하세요.
src_cpp/NRMKFramework/AbstractComponent/ControlAlgorithm.h
template<typename RobotType>
class ControlAlgorithm : public AlgorithmHolder
{
protected:
typedef NRMKConfig::ControlGains<RobotType::JOINT_DOF> ControlGains;
typedef NRMKConfig::CustomControlGains<RobotType::JOINT_DOF> CustomControlGains;
typedef NRMKMotion::MotionDataPack<RobotType::JOINT_DOF> MotionData;
typedef NRMKControl::ControlDataPack<RobotType::JOINT_DOF> ControlData;
public:
typedef RobotType ROBOT;
typedef typename ROBOT::JointVec JointVec;
typedef typename ROBOT::JointMat JointMat;
virtual ~ControlAlgorithm() = default;
virtual void initialize(ROBOT & robot, double delt) = 0;
virtual void setGains(const ControlGains &gains) {} // non-pure virtual function
virtual void reset() {}; // non-pure virtual function
virtual void reset(ROBOT & robot) {} // non-pure virtual function
virtual void reset(int index) { reset(); }
virtual void setMode(uint64_t& mode) { _controlMode = mode;}
virtual uint64_t& getMode() { return _controlMode;} /**< integer control modes for custom controller variations | 0: default controller, 1~: reserved for custom controller */
virtual void compute(ROBOT &robot, const LieGroup::Vector3D &gravDir, const MotionData &motionData,
ControlData &controlData) = 0;
virtual void setCustomGains(const CustomControlGains & gains) {
for (int i = 0; i < RobotType::JOINT_DOF; ++i) {
gain0[i] = gains.customGains.gain0[i];
gain1[i] = gains.customGains.gain1[i];
gain2[i] = gains.customGains.gain2[i];
gain3[i] = gains.customGains.gain3[i];
gain4[i] = gains.customGains.gain4[i];
gain5[i] = gains.customGains.gain5[i];
gain6[i] = gains.customGains.gain6[i];
gain7[i] = gains.customGains.gain7[i];
gain8[i] = gains.customGains.gain8[i];
gain9[i] = gains.customGains.gain9[i];
}
}
protected:
JointVec gain0, gain1, gain2, gain3, gain4, gain5, gain6, gain7, gain8, gain9;
private:
uint64_t _controlMode = 0U;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
Abstract Component: Control Algorithm
Joint Control
Joint Control 구성 요소는 관절공간에서 관절의 타겟 위치, 속도, 가속도 등의 정보와 기구학/동역학 정보를 바탕으로 각 관절에 입력되는 토크를 인가할 수 있도록 합니다. 계산된 조인트 토크는 직접 관절의 모터 드라이브로 전송됩니다.
각 관절 별 타겟 위치, 속도, 가속도는 아래 구조체를 통해 확인이 가능합니다.
const JointVec &qDes = motionData.motionPoint.qd;
const JointVec &qdotDes = motionData.motionPoint.qdotd;
const JointVec &qddotDes = motionData.motionPoint.qddotd;
Task Control
Task Control 구성 요소는 6차원 공간에서 타겟 위치 및 실제 로봇 위치 정보를 바탕으로 각 관절 목표 토크를 계산하여 인가할 수 있도록 합니다. 계산된 조인트 토크는 직접 관절의 모터 드라이브로 전송됩니다.
작업 공간에서 타겟 위치, 속도, 가속도는 아래 구조체를 통해 확인이 가능합니다.
const JointVec &pDes = motionData.motionPoint.pd;
const JointVec &pdotDes = motionData.motionPoint.pdotd;
const JointVec &pddotDes = motionData.motionPoint.pddotd;
플러그인 컴포넌트 적용
사용자는 IndySDK를 통해 플러그인 컴포넌트를 직접빌드하여 실행할 수 있습니다. 본 장에서는 사전 설치된 플러그인 컴포넌트를 적용하는 방법을 안내합니다.
플러그인 컴포넌트 경로
컨트롤박스에 SSH를 통해 접속하여 아래 경로에 컴포넌트 파일이 설치되어 있는지 확인할 수 있습니다.
- home/user/release/IndyDeployment
└─ PluginComponents
├─ CustomJointControllerCreator.comp
└─ CustomTaskControlCreator.comp
그리고 아래 경로의 Components.json
파일에 컴포넌트 이름이 기재되어 있어야 합니다.
Components.json
여기서 JointController
에 할당된 컴포넌트는 조인트컨트롤러 (MoveJ)를 대체하는 컴포넌트가 되고, TaskController
에 할당된 컴포넌트는 태스크컨트롤러 (MoveL)를 대체하게 됩니다.
이처럼 사용자는 직접빌드한 컴포넌트를 /home/user/release/IndyDeployment/PluginComponents
디렉토리에 복사 후 Components.json
에 대체하고자 하는 제어 컴포넌트를 작성하여 이를 사용할 수 있습니다.
로봇 소프트웨어 재시작
사용자 정의 컨트롤러를 변경한 후 로봇 소프트웨어를 재시작하십시오. 두 가지 주요 방법이 있습니다:
방법 1:
- 다음 명령어를 사용하여 로봇 소프트웨어 종료:
- deployment 디렉토리로 이동:
- 로봇 소프트웨어 시작:
수동으로 시작된 소프트웨어를 종료하려면
CTRL+C
를 누릅니다.
방법 2:
- 다음 명령어를 사용하여 컨트롤 박스를 재부팅:
IndyDCP3를 사용하여 컨트롤러 활성화
- 활성화는 IndyDCP3 를 사용하여 다음과 같이 수행할 수 있습니다:
- 이를 통해 Conty 또는 Indy API를 통해 실제 로봇 또는 시뮬레이션 로봇을 제어할 수 있습니다.
참고
로봇이 Idle 상태일 때에는 기본제어기가 구동이 되며 Conty 또는 Indy API를 통한 MoveJ, MoveL 모션 실행 시 사용자 제어기에 의해 동작이 됩니다. MoveJ, MoveL의 경우 Conty의 "이동" 탭 상에서 조그모션을 할 때에도 실행이 되며, Conty의 "프로그램" 상 MoveJ 또는 MoveL 커맨드 추가를 통해 실행이 가능합니다. 동작모션과 관련된 자세한 사항은 Conty 매뉴얼과 IndyAPI 매뉴얼을 참고해주시기 바랍니다.