Skip to content

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<typename _Type = double>
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<typename _Type = double>
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

[::FilterLeadLag]

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

NRMKFoundation::FilterLeadLag::setParam

  • 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<int _SIZE, typename _Type = double>
class FilterMovingAverage : public Filter<_SIZE - 1, _Type>
{
  ...
};

NRMKFoundation::FilterLeadLag::FilterMovingAverage

 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]

NRMKFramework::ShmemManager::readMemory

  • 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)

NRMKFramework::ShmemManager::getPtrObjByAddr

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

template <typename T>
inline T const * getPtrObjByAddr (uint32_t address) const

NRMKFramework::ShmemManager::getRefObjByAddr

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

template <typename T>
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 출력 값