Skip to content

IndySDK 실행 방법

IndySDK 구성 요소

기본적으로 IndySDK 사용자는 조인트 컨트롤러 (Joint Controller) 를 대체하는 컴포넌트와 태스크 컨트롤러(Task Controller)를 대체하는 컴포넌트를 빌드 후 실행할 수 있습니다.

    Component
    Deploy Name in JSON
    Description
    Joint Controller (MoveJ)
    CustomJointController
  • 목표 관절각도를 기반으로 각 관절에 대한 명령 토크 계산
    • Task Controller (MoveL)
      CustomTaskController
  • 목표 작업공간위치를 기반으로 각 관절에 대한 명령 토크 계산
  • 참고

    토크 계산 함수는 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 파일에 컴포넌트 이름이 기재되어 있어야 합니다.

    - home/user/release/IndyConfigurations
       └─ Cobot
            ├─ ...
            ├─ Plugins
            │    └─ Components.json
            └─ ...    
    

    Components.json

    {
        "JointController": "CustomJointControlCreator",
        "TaskController": "CustomTaskControlCreator"
    }
    

    여기서 JointController에 할당된 컴포넌트는 조인트컨트롤러 (MoveJ)를 대체하는 컴포넌트가 되고, TaskController에 할당된 컴포넌트는 태스크컨트롤러 (MoveL)를 대체하게 됩니다.

    이처럼 사용자는 직접빌드한 컴포넌트를 /home/user/release/IndyDeployment/PluginComponents 디렉토리에 복사 후 Components.json에 대체하고자 하는 제어 컴포넌트를 작성하여 이를 사용할 수 있습니다.

    로봇 소프트웨어 재시작

    사용자 정의 컨트롤러를 변경한 후 로봇 소프트웨어를 재시작하십시오. 두 가지 주요 방법이 있습니다:

    방법 1:

    1. 다음 명령어를 사용하여 로봇 소프트웨어 종료:
      sudo killall –g UDEVMonitor
      
    2. deployment 디렉토리로 이동:
      cd /home/user/release/IndyDeployment/
      
    3. 로봇 소프트웨어 시작:
      sudo python3 indy_run.py
      
      수동으로 시작된 소프트웨어를 종료하려면 CTRL+C 를 누릅니다.

    방법 2:

    1. 다음 명령어를 사용하여 컨트롤 박스를 재부팅:
      sudo reboot
      

    IndyDCP3를 사용하여 컨트롤러 활성화

    • 활성화는 IndyDCP3 를 사용하여 다음과 같이 수행할 수 있습니다:
    • 이를 통해 Conty 또는 Indy API를 통해 실제 로봇 또는 시뮬레이션 로봇을 제어할 수 있습니다.

    참고

    로봇이 Idle 상태일 때에는 기본제어기가 구동이 되며 Conty 또는 Indy API를 통한 MoveJ, MoveL 모션 실행 시 사용자 제어기에 의해 동작이 됩니다. MoveJ, MoveL의 경우 Conty의 "이동" 탭 상에서 조그모션을 할 때에도 실행이 되며, Conty의 "프로그램" 상 MoveJ 또는 MoveL 커맨드 추가를 통해 실행이 가능합니다. 동작모션과 관련된 자세한 사항은 Conty 매뉴얼과 IndyAPI 매뉴얼을 참고해주시기 바랍니다.