3

私は触覚ロボットとアイトラッカーのインターフェースに取り組んでいます。したがって、どちらにも独自のプログラミング要件があります。つまり、アイトラッカーソフトウェアはPythonに基づいており、私がプログラミングしている主要言語です。私たちの触覚ロボットはCでAPIを持っているので、Cでラッパーを記述し、それをDLLとしてコンパイルし、Pythonでctypesを使用して関数をロードする必要がありました。

DLLをMATLABでテストしましたが、すべて問題なく動作します。ただし、Pythonクラスでのctypesの実装に関する何かが、ロボットの位置座標を照会したときに期待される戻り値を提供していません。

ここにコードを投稿し、下部に問題のより明確な説明を投稿します。

DLLラッパーのCソースコード:

#include <QHHeadersGLUT.h>
using namespace std;
class myHapClass{
public:
void InitOmni()
{
    DeviceSpace* Omni = new DeviceSpace; //Find a the default phantom
}
double GetCoord(int index)
{
    HDdouble hapPos[3];
    hdGetDoublev(HD_CURRENT_POSITION,hapPos);
    return hapPos[index];
}
};

extern "C" {
int index = 1;
__declspec(dllexport) myHapClass* myHap_new(){ return new myHapClass();}
__declspec(dllexport) void myHapInit(myHapClass* myHapObj){ myHapObj->InitOmni();}
__declspec(dllexport) double myHapCoord(myHapClass* myHapObj){ double nowCoord = myHapObj->GetCoord(index); return nowCoord;}
}

このコードの理論は、python / ctypesと互換性のある3つの利用可能なC(C ++ではない)呼び出しを持つことです。

  1. myHap_new()は、クラスのインスタンスへのポインタを返します
  2. myHapInitはハプティクスデバイスを初期化します
  3. myHapCoordは、intIndexによって参照される軸の現在の位置のdoubleを返します。

Pythonクラスは次のとおりです。

import sreb
from ctypes import cdll
lib = cdll.LoadLibrary('C:\Documents and Settings\EyeLink\My Documents\Visual Studio 2010\Projects\myHapDLLSolution\Debug\myHapDLL.dll')

class CustomClassTemplate(sreb.EBObject):
def __init__(self):
    sreb.EBObject.__init__(self)
    self.pyMyHapObj = pyMyHap()
    self.coordval=2.0

def setCoordval(self,c):
    self.coordval = c
    pass

def getCoordval(self):
    return self.coordval

def initOmni(self):
    self.pyMyHapObj.pyHapInit()
    pass

def getCoord(self):
    self.coordval = self.pyMyHapObj.pyHapCoord()
    return self.coordval

class pyMyHap(object):
def __init__(self):
    self.obj = lib.myHap_new()
    self.coord = 1.0

def pyHapInit(self):
        lib.myHapInit(self.obj)

    def pyHapCoord(self):
    self.coord = lib.myHapCoord(self.obj)
    return self.coord

Pythonカスタムクラスの理論は、ロードされたDLLクラスのオブジェクト(self.pyMyHapObj = pyMyHap())をインスタンス化することです。関数「initOmni」を呼び出すとロボットが正常に初期化されますが、「getCoord」を呼び出すと期待値が返されません。実際、「getCoord」から得られる結果は1です(1.0ではなく1としてリストされているため、doubleではなく整数を返していると思います)。

MATLABでは、DLLライブラリを使用しており、myHapInit関数とmyHapCoord関数の両方が機能し、ロボットを初期化して位置座標を正常に照会できます。

では、ctypesがDLLのmyHapCoordから適切な値を返さない原因となっているPythonクラスについてはどうでしょうか。

どんな助けでもいただければ幸いです。ありがとう

編集:Pythonバージョン2.3、それが重要な場合...私はそのバージョンに固執しています。

4

1 に答える 1

5

戻り値のデフォルトは。ですint。次のようなものを使用します:

lib.myHapCoord.restype = ctypes.c_double

関数を呼び出して戻り値を正しく解釈する前に。

于 2012-05-11T03:00:21.530 に答える