# Indy Tools

IndySDK에서는 필터, 필터 미분 및 공유메모리 등을 제공하여 사용자가 저수준 제어기를 구성함에 있어서 사용할 수 있는 툴을 제공한다.

## 필터

필터는 Util/Filter.h 에 작성된 라이브러리를 추가함으로써 사용할 수 있므며 NRMKFoundation 의 명칭공간(namespace)으로 정의되어 있다.

### [::Filter]

• Filter class is a parent class of LowPassFilter, FilteredDerivative, FilterLeadLag, and FilterMovingAverage classes
• Filter class includes "filter" and "setTransferFunction"

NRMKFoundation::Filter::filter (refine the signal)

 1 void filter(Type const & raw, Type & filtered); 

Parameters:

• raw: Raw signal to be filtered
• filtered: Filtered signal

NRMKFoundation::Filter::setTransferFunction (set the type of the filter)

 1 void setTransferFunction(CoeffVec const & den, CoeffVec const & num) 

Parameters:

• den: Denominator polynomial coefficients (i.e., den[0] + den[1]*(1/z) + den[2]*(1/z^2)...)
• num: Numerator polynominal coefficients (i.e., num[0] + num[1]*(1/z) + num[2]*(1/z^2)...)

### [::LowPassFilter]

 1 2 3 4 5 template class FilterLowPass : public Filter<1, _Type> { ... }; 

NRMKFoundation::LowpassFilter::setParam

• Lowpass filter implementing \begin{align} \frac{w}{s+w}, \end{align} where $w$ is the cutoff frequency of lowpass filter.
 1 void setParam(double sampFreq, double cutOffFreq); 

Parameters:

• sampFreq: Sampling frequency of the control system
• cutOffFreq: Cutoff frequency of the lowpass filter

### [::FilteredDerivative]

 1 2 3 4 5 template class FilterDerivative : public Filter<1, _Type> { ... }; 

NRMKFoundation::FilteredDerivative::setParam

• Derivative filter implementing \begin{align} \frac{w s}{s+w}, \end{align} where $w$ is the cutoff frequency of the filter.
 1 void setParam(double sampFreq, double cutOffFreq); 

Parameters:

• sampFreq: Sampling frequency of the control system
• cutOffFreq: Cutoff frequency of the filter

 1 2 3 4 5 template class FilterLeadLag : public Filter<2, _Type> { ... }; 

• lead-lag filter implementing \begin{align} \frac{(w_2 w_3/w_1)(s+w_1)}{(s+w_2)(s+w_3)}, \end{align} where \begin{align} w_1 = 2 \pi f_1, \quad w_2=2 \pi f_2, \quad\text{and}\quad w_3 = 2 \pi f_3. \end{align}
 1 void setParam(double sampFreq, double f1, double f2, double f3); 

Parameters:

• sampFreq: Sampling frequency of control system
• f1, f2, f3: Filtering frequencies defined above

### [::FilterMovingAverage]

 1 2 3 4 5 template class FilterMovingAverage : public Filter<_SIZE - 1, _Type> { ... }; 

  1 2 3 4 5 6 7 8 9 10 FilterMovingAverage() { _b[0] = 1.0/_SIZE; for (int i = 1; i <= _SIZE; i++) { _a[i] = 0; _b[i] = _b[0]; } } 

Parameters:

• _a, _b: Denominator and nominator polynominal coefficients, respectively

## 공유메모리

공유메모리는 NRMKFramework::ShmemManager 클래스를 이용하여 다룰 수 있다. Robot에 관한 데이터를 공유메모리로 다루기 위해서는 NRMKFramework/Indy/Sharedmemory/SharedData.h에 작성된 라이브러리를 추가 함으로써 사용할 수 있으며 명칭공간 NRMKIndy::SharedData에 구조체로 정의되어 있다. 공유메모리에 대한 자세한 사항은 공유메모리 챕터를 참고하기 바란다.

### [::ShmemManager]

• Copy a certain size of shared memory (starting from a specific address) to the memory indicated by the pointer (ptrData)
 1 bool readMemory(uint32_t address, uint32_t size, void * ptrData) 

NRMKFramework::ShmemManager::writeMemory

• Copy a certain size of memory indicated by the point (ptrData) to the shared memory (starting from a specific address)
 1 bool writeMemory(uint32_t address, uint32_t size, void const * ptrData) 

NRMKFramework::ShmemManager::getPtr

• Return the void-type pointer which indicates the absolute address of the relative address defined for a certain data
 1 void * getPtr(uint32_t address) 

• Return T-type pointer which indicates the absolute address of the relative address defined for a certain data
 1 2 3 4 5 template T * getPtrObjByAddr(uint32_t address) template inline T const * getPtrObjByAddr (uint32_t address) const 

• Copy the value pointed to by the pointer to a variable defined by reference
 1 2 3 4 5 template inline T & getRefObjByAddr(uint32_t address) template inline T const & getRefObjByAddr (uint32_t address) const 

NRMKFramework::ShmemManager::resetMemory

• Set all data stored in the shared memory to zero
 1 void resetMemory() 

### [::SharedData]

공유메모리를 이용해서 사용할 수 있는 데이터의 구조체 항목은 다음과 같다. 자세한 사항은 공유메모리 챕터를 참조하기 바란다.

• RobotRTSharedData: 로봇의 실시간 데이터와 EtherCAT 정보
• RobotControlSharedData: 로봇의 상태변수 (위치, 속도, 토크 등)
• RobotStateSharedData: 로봇 소프트웨어 프로그램의 상태정보
• RobotControlStatusSharedData: 로봇의 제어 상태
• RobotConfigSharedData: 로봇의 설정 값
• RobotEmergencySharedData: 로봇의 최근 에러 데이터
• SmartDIOSharedData: 컨트롤 박스(CB)의 Digital I/O포트에 대한 데이터
• SmartAIOSharedData: 컨트롤 박스(CB)의 Analog I/O포트에 대한 데이터
• EndToolDOSharedData: 엔드툴(EndTool)의 Digital 출력포트에 대한 데이터
• ExtraIOData: 컨트롤 박스의 CAN포트를 통해 획득된 (로보터스사의) F/T 센서 데이터

데이터 전송 및 획득을 위해서 제공되는 라이브러리들은 다음과 같다.

NRMKIndy::SharedData::getDataFunction

 1 2 3 void getDataFunction(NRMKFramework::ShmemManager & indyShm, DataType & Data) DataType getDataFunction(NRMKFramework::ShmemManager & indyShm) 

Parameters:

• getDataFunction: 데이터 획득에 사용되는 함수의 명칭 (e.g., getControlData: 로봇의 상태변수를 포함하는 구조체의 객체를 획득, getSmartAIO: 컨트롤 박스(CB)의 Analog I/O 포트에 대한 데이터 획득)
• DataType: "ShredData.h"에 정의된 데이터 구조체

NRMKIndy::SharedData::getPtrDataFunction

 1 2 void getPtrDataFunction(NRMKFramework::ShmemManager & indyShm, DataType ** ptrEndtoolDo) 

Parameters:

• getPtrDataFunction: 데이터 획득에 사용되는 함수의 명칭 (e.g., getPtrSmartAIO, getPtrSmartDIO)
• DataType: "SharedData.h"에 정의된 데이터 구조체, DataType에 대한 포인터 변수를 입력을 받고 해당 데이터를 포함하는 공유메모리의 주소를 할당한다.

NRMKIndy::SharedData::setSmartDO

 1 2 3 void setSmartDO(NRMKFramework::ShmemManager & indyShm, int doNum, bool doVal) void setSmartDO(NRMKFramework::ShmemManager & indyShm, const bool * smartDO) 

Parameters:

• doNum: Digital 출력 포트 번호
• doVal: Digital 출력 값, true/false 값으로 설정
• smartDO: 8개 포트에 대한 Digital 출력 값을 나타내는 메모리의 주소 값

NRMKIndy::SharedData::setSmartAO

 1 void setSmartAO(NRMKFramework::ShmemManager & indyShm, int aoNum, uint16_t aoVal) 

Parameters:

• aoNum: Analog 출력 포트 번호
• aoVal: Analog 출력 값