설치 및 설정
판매정책
IndySDK는 연구소 및 대학과 같은 비영리 조직에만 제공됩니다. IndySDK는 뉴로메카와의 합의를 통해 사용자 라이선스를 받은 후에 사용할 수 있습니다. 자세한 정보는 메일을 통해 문의해주시기 바랍니다 (technical-support@neuromeka.com).
설치하기
아래 링크를 통해 설치 파일을 순서대로 다운로드 받으신 후 순서대로 설치해주시기 바랍니다. STEP2 사용자와 STEP3 사용자의 설치환경과 Windows, Linux 사용자의 설치환경이 다르기 때문에 사용하는 제어기와 개발PC의 OS에 맞추어 설치를 진행해주시기 바랍니다.
1. PlatformSDK 설치
2. IndyFramework 설치
3. IndySDK 설치
- 설치파일 라이센스 발급자에게 별도 제공
다운로드 받은 파일을 차례로 설치를 하면 필요한 SDK 설치가 완료됩니다.
실행하기
사용자는 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
에 대체하고자 하는 제어 컴포넌트를 작성하여 이를 사용할 수 있습니다.
로봇 실행
로봇 실행은 컨트롤박스를 재부팅하면 자동으로 실행이 되며, 수동실행은 아래 명령을 통해 수행할 수 있습니다.
참고
로봇이 Idle 상태일 때에는 기본제어기가 구동이 되며 Conty 또는 Indy API를 통한 MoveJ, MoveL 모션 실행 시 사용자 제어기에 의해 동작이 됩니다. MoveJ, MoveL의 경우 Conty의 "이동" 탭 상에서 조그모션을 할 때에도 실행이 되며, Conty의 "프로그램" 상 MoveJ 또는 MoveL 커맨드 추가를 통해 실행이 가능합니다. 동작모션과 관련된 자세한 사항은 Conty 매뉴얼과 IndyAPI 매뉴얼을 참고해주시기 바랍니다.
컴포넌트 활성화
실행된 로봇이 컴포넌트를 사용하기 위해 gRPC 프로토콜(IndyDCP3)를 이용하여 활성화를 해주어야 합니다.
컴포넌트 사용이 활성화되지 않은 경우는 일반적인 로봇 사용과 동일하며 뉴로메카에서 제공하는 제어기가 구동됩니다. 이를 활성화해주면 사용자 빌드 컴포넌트 제어기가 실행됩니다. 컴포넌트 활성화를 위한 IndyDCP3의 gRPC 프로토콜은 아래와 같습니다.
예제 코드 다운로드
IndySDK 활성화
- 뉴로메카에 SDK 라이선스를 문의하여 license_key와 expire_date를 입력해야 합니다.
- SDK가 활성화되지 않으면 SetCustomControlMode() 를 사용하실 수 없습니다.
from interfaces.control_socket_client import ControlSocketClient from interfaces.config_socket_client import ConfigSocketClient ip = '192.168.0.1' # <- Your Robot IP address control = ControlSocketClient(ip) config = ConfigSocketClient(ip) _license_key = '' # <- You can get the license key from neuromeka _expire_date = '' # <- And also you can get the expire date from neuromeka control.ActivateIndySDK(license_key=_license_key, expire_date=_expire_date)
Gain Tuning
- Custom controller 를 사용할 때, 제어 게인은 기본적으로 0으로 설정되어 있습니다.
- SetCustomControlGain() 함수를 통해 게인 값 설정 후 로봇을 사용하셔야 합니다.
Custom Controller 활성화
- 사용자 제어기 활성화를 위해서는 SetCustomControlMode(mode=1) 을 통해 사용할 수 있습니다.
제어 모드 확인
- 사용자 제어기가 실행되었다는 것을 확인하기 위해 GetCustomControlMode() 를 사용할 수 있습니다.
- 0은 기본 로봇 제어기 실행, 1은 사용자 로봇 제어기 실행을 의미합니다.
Default Controller 활성화
- 사용자 제어기를 비활성화하고, 기본 로봇 제어기로 변경하기 위해 SetCustomControlMode(mode=0) 을 사용합니다.
Python IndyDCP3를 통해 아래와 같이 활성화를 할 수 있습니다.
이를 통해 실제 로봇 또는 시뮬레이션 로봇을 Conty 또는 Indy API를 통해 제어할 수 있습니다.
IndySDK 구성 요소
기본적으로 IndySDK 사용자는 조인트 컨트롤러 (Joint Controller) 를 대체하는 컴포넌트와 태스크 컨트롤러(Task Controller)를 대체하는 컴포넌트를 빌드 후 실행할 수 있습니다.
|
|
|
---|---|---|
|
|
|
|
|
참고
토크 계산 함수는 Indy Framework 내의 모든 실시간 사이클마다 호출됩니다. 이 함수의 계산 시간이 사이클 시간을 초과하지 않도록 하는 것이 중요합니다.
자세한 정보는 다음 ControlAlgorithm
추상 구성 요소를 확인하세요.
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
조인트 컨트롤
조인트 컨트롤 구성 요소는 관절공간에서 관절의 타겟 위치, 속도, 가속도 등의 정보와 기구학/동역학 정보를 바탕으로 각 관절에 입력되는 토크를 인가할 수 있도록 합니다. 계산된 조인트 토크는 직접 관절의 모터 드라이브로 전송됩니다.
각 관절 별 타겟 위치, 속도, 가속도는 아래 구조체를 통해 확인이 가능합니다.
const JointVec &qDes = motionData.motionPoint.qd;
const JointVec &qdotDes = motionData.motionPoint.qdotd;
const JointVec &qddotDes = motionData.motionPoint.qddotd;
태스크 컨트롤
태스크 컨트롤 구성 요소는 6차원 공간에서 타겟 위치 및 실제 로봇 위치 정보를 바탕으로 각 관절 목표 토크를 계산하여 인가할 수 있도록 합니다. 계산된 조인트 토크는 직접 관절의 모터 드라이브로 전송됩니다.
작업 공간에서 타겟 위치, 속도, 가속도는 아래 구조체를 통해 확인이 가능합니다.