2015-01-20 26 views
1

OpenFrameworks라는 그래픽 관련 C++ 오픈 소스 라이브러리를 Matlab/Simlink에 연결하려고합니다.Matlab과 외부 응용 프로그램 간의 통신 (C++)

내가하고 싶은 일은 Matlab을 사용한 신호 처리 후 해당 그래픽 응용 프로그램으로 특정 기능을 시각화하는 것입니다. 따라서 Simlink S-Function에서는 녹음 신호 (예 : 뇌파)가 연속적으로 수행되고 특정 기능을 추출하기위한 계산이 온라인에서 이루어집니다. openFrameworks에 이러한 기능 값을 전달하고 싶습니다. 그런 다음 필자가 작성한 C++ 코드로 시각화합니다.

MEX를 만들어서 Matlab 스크립트 내에서 호출 할 수 있다면 가능할 것이라고 생각했습니다. 나는 그것을 만들었고 실제로 달렸다. 그러나 openFrameworks는 응용 프로그램을 끝낼 때까지 그래픽을 영원히 계속 업데이트하도록 설계되었습니다. 따라서 MEX를 호출 한 후 MEX는 계속 실행 중이었고 Matlab으로 돌아갈 수 없었습니다. MEX를 사용하면 Matlab의 기능을 온라인으로 MEX로 보내고 그래픽을 업데이트하는 것이 어려울 수 있습니다.

이 둘 사이의 통신에는 좋은 방법이 있습니까? MEX가 가능하다면 MEX에 대한 작업을 계속할 것입니다. 나는 Matlab/Simlink와 openFrameworks를 병렬로 실행하고 Matlab에서 UDP를 사용하여 openFrameworks로 필요한 데이터를 보내는 것이 좋은 방법이라고 생각한다.

당신의 의견을 말하고 싶습니다. 내가 응용 프로그램간에 데이터를 전송하는 프로그램에 대해 작업 한 적이 없기 때문에 UDP가 올바른 방법인지는 모르겠다. 그렇다면 행복합니다. 내 생각이 틀린 경우 MEX와 UDP의 측면에서 수정하십시오.

미리 감사드립니다.

+1

mex 파일에서 openFrameWorks로 데이터를 보내는 방법은 무엇입니까? 영구 데이터 (mexMakeArrayPersistent 또는 static)를 사용하여 연결을 유지해야합니다. 그런 다음 데이터를 보내 자마자 mex 파일에서 반환해야합니다. – Navan

답변

0

UDP에 대해 언급 했으므로 MATLAB Central File Exchange에서 무료 TCP/UPD/IP Toolbox를 사용하는 것이 가장 좋은 해결책입니다. 그것은 MATLAB에서 직접 UDP 통신을 허용합니다. MEX 파일을 통해 구현됩니다.

솔루션에는 원하는 데이터를 버퍼에 인코딩 한 다음이 도구 상자를 사용하여 전송하는 것이 포함됩니다. 다른면에서는 시각적 장치를 청취 UDP 소켓이있는 독립 실행 형 응용 프로그램으로 빌드해야합니다.

UDP는 보증되지 않습니다. 비주얼 라이저가 가끔씩 패킷을 잃어 버리는 경우 잘 작동한다면 UDP가 정확한 선택입니다! 그렇지 않은 경우 TCP 대신 사용할 수 있습니다. TCP는 스트림 지향이므로 데이터 단위를 분리하기 위해 자체 패킷 구조를 만들어야합니다.

0

잘못된 코딩 방법을 제안 할 위험이 있습니다. - 자신의 프로토 타이핑 및 연구용 (외부 배포 용이 아님) 용으로 만 프로젝트를 개발하는 경우 일회용 이벤트이므로 가장 간단한 해결책은 다음과 같습니다. 외부 파일에 쓰기 (예 : MATLAB의 dlmwrite 사용) 및 C++ 응용 프로그램에서 파일 수신 대기 (예 : while 루프에서 ifstream 사용).

이 접근 방식에는 몇 가지 문제점이 있습니다 (확실히 최고의 성능은 아닙니다). 소켓은 분명히이를 수행하는 "올바른"방법이지만, MATLAB의 요점은 대개 다음과 같이 빠르게 작동하는 것입니다. 가능한 및 파일 I/O는 밀교 지식을 필요로하지 않는 것입니다.