python和ctypes cdll,没有得到预期的函数返回

时间:2012-05-11 02:25:26

标签: python ctypes robotics

我正在努力连接触觉机器人和眼动仪。因此,两者都有自己的编程要求,即眼动仪软件基于python,是我编程的主要语言。我们的触觉机器人在C中有一个API,所以我必须在C中编写一个包装器,将其编译为DLL,并在python中使用ctypes来加载函数。

我用MATLAB测试了我的DLL,一切正常。但是,当我查询机器人的位置坐标时,我在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;}
}

这段代码的理论只是让3个可用的C(而不是C ++)调用与python / ctypes兼容:

  1. myHap_new()返回指向类
  2. 实例的指针
  3. myHapInit初始化触觉设备
  4. myHapCoord返回int index引用的轴的当前位置的双精度。
  5. 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,而不是1.0,所以我认为它返回一个整数,而不是它应该的双倍。)

    在MATLAB中,我使用了DLL库,myHapInit和myHapCoord函数都可以工作,我可以初始化机器人并成功查询位置坐标。

    那么我的python类是什么导致ctypes没有从我的DLL中从myHapCoord返回的正确值?

    任何帮助将不胜感激。 感谢

    编辑:Python 2.3版,如果重要......我坚持使用那个版本。

1 个答案:

答案 0 :(得分:5)

返回值默认为int。使用类似的东西:

lib.myHapCoord.restype = ctypes.c_double

在调用函数以正确解释返回值之前。