[ros-users] Problem in compiling the code for kinect driver

Mr cnn lakshmen cnnlakshmen_2000 at yahoo.com
Mon Jun 6 08:30:52 UTC 2011


Hi guys, 

I need you help. I written a code for the Kinect driver. I do not intend to plot 
the image out that is why i have not included the OpenGL header files. I can 
compile but i can't seem to link the file.I get a lot of errors when i link.Do 
anyone of know what the error? Any Help will be appreciated.
#include "libfreenect.h"
#include "libfreenect.hpp"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <cmath>
#include <vector>
#include <fstream>
#include <pthread.h>

class Mutex {
public:
    Mutex() {
        pthread_mutex_init( &m_mutex, NULL );
    }
    void lock() {
        pthread_mutex_lock( &m_mutex );
    }
    void unlock() {
        pthread_mutex_unlock( &m_mutex );
    }

    class ScopedLock
    {
        Mutex & _mutex;
    public:
        ScopedLock(Mutex & mutex)
            : _mutex(mutex)
        {
            _mutex.lock();
        }
        ~ScopedLock()
        {
            _mutex.unlock();
        }
    };
private:
    pthread_mutex_t m_mutex;
};

class FreenectDevice;
Freenect::Freenect freenect;
Freenect::FreenectDevice::FreenectDevice* device;
freenect_video_format requested_format(FREENECT_VIDEO_RGB);

class FreenectDevice : public Freenect::FreenectDevice {
public:
    FreenectDevice(freenect_context *_ctx, int _index)
        : Freenect::FreenectDevice(_ctx, _index), 
m_buffer_depth(freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, 
FREENECT_VIDEO_RGB).bytes),m_buffer_video(freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM,
 FREENECT_VIDEO_RGB).bytes), m_gamma(2048), m_new_depth_frame(false)
    {
        float m_depth[2048];
        for( unsigned int i = 0 ; i < 2048 ; i++) {
            const float k1 = 1.1863; 
            const float k2 = 2842.5; 
            const float k3 = 0.1236; 
                       m_depth[i] = k3 * tan(i/k2 + k1); 
        }
    }
virtual void DepthCallback(void* _depth, uint32_t timestamp) {
        Mutex::ScopedLock lock(m_depth_mutex);
        uint16_t* depth = static_cast<uint16_t*>(_depth);
        m_new_depth_frame = true;
    }
    bool getDepth(std::vector<uint8_t> &buffer) {
        Mutex::ScopedLock lock(m_depth_mutex);
        if (!m_new_depth_frame)
            return false;
        buffer.swap(m_buffer_depth);
        m_new_depth_frame = false;
        return true;
    }
private:
    std::vector<uint8_t> m_buffer_depth;
    std::vector<uint8_t> m_buffer_video;
    std::vector<uint16_t> m_gamma; 
    Mutex m_depth_mutex;
    bool m_new_depth_frame;
 virtual void VideoCallback(void *video, uint32_t timestamp);
//virtual void DepthCallback(void *depth, uint32_t timestamp) = 0;

};    

int g_argc;
char **g_argv;

int main(int argc, char **argv) {  
    using namespace std;
        device = &freenect.createDevice<FreenectDevice>(0);
    uint16_t m_depth[640*480]; // depth data from Kinect in a 1-D array
    float x[480*640]; // point cloud x values
    float y[480*640]; // point cloud y values
    float z[480*640]; // point cloud z values
    float cx = 320.0; // center of projection
    float cy = 240.0; // center of projection
    float fx = 600.0; // focal length in pixels
    float fy = 600.0; // focal length in pixels
    float minDistance = -10;
    float scaleFactor = 0.0021;
    device->startDepth();
    for (int v=0, n=0 ; v<480 ; v++) 
        {
            for ( int u=0 ; u<640 ; u++, n++)
            {
        // note that values will be in meters, with the camera at the origin, 
and the Kinect has a minimum range of ~0.5 meters
                x[n] = (u - cx) * (z[n]+ minDistance) * scaleFactor * (cx/cy);
                y[n] = (v - cy) * (z[n]+ minDistance) * scaleFactor;
                z[n] = m_depth[n];
            }
        }
        
          ofstream outf("Sample.dat");
        for (int v=0  ; v<480 ; v++) 
        {
            for ( int n=0 ; n<640 ; n++)
            {
                                outf << z[n];
            }
            outf << endl;
        }
    device->stopDepth();    
return 0;
};

The error is laksh.o: In function 
`Freenect::FreenectDevice::FreenectDevice(_freenect_context*, int)':
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x35): undefined reference to `freenect_open_device'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x12e): undefined reference to `freenect_set_user'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x149): undefined reference to `freenect_find_video_mode'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x184): undefined reference to `freenect_set_video_mode'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x19f): undefined reference to `freenect_find_depth_mode'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x1da): undefined reference to `freenect_set_depth_mode'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x1f0): undefined reference to `freenect_set_depth_callback'
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceC2EP17_freenect_contexti[Freenect::FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x206): undefined reference to `freenect_set_video_callback'
laksh.o: In function `Freenect::FreenectDevice::~FreenectDevice()':
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceD2Ev[Freenect::FreenectDevice::~FreenectDevice()]+0x1b):
 undefined reference to `freenect_close_device'
laksh.o: In function `Freenect::FreenectDevice::~FreenectDevice()':
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceD1Ev[Freenect::FreenectDevice::~FreenectDevice()]+0x1b):
 undefined reference to `freenect_close_device'
laksh.o: In function `Freenect::FreenectDevice::~FreenectDevice()':
laksh.cpp:(.text._ZN8Freenect14FreenectDeviceD0Ev[Freenect::FreenectDevice::~FreenectDevice()]+0x1b):
 undefined reference to `freenect_close_device'
laksh.o: In function `Freenect::FreenectDevice::startDepth()':
laksh.cpp:(.text._ZN8Freenect14FreenectDevice10startDepthEv[Freenect::FreenectDevice::startDepth()]+0x13):
 undefined reference to `freenect_start_depth'
laksh.o: In function `Freenect::FreenectDevice::stopDepth()':
laksh.cpp:(.text._ZN8Freenect14FreenectDevice9stopDepthEv[Freenect::FreenectDevice::stopDepth()]+0x13):
 undefined reference to `freenect_stop_depth'
laksh.o: In function 
`Freenect::FreenectDevice::freenect_depth_callback(_freenect_device*, void*, 
unsigned int)':
laksh.cpp:(.text._ZN8Freenect14FreenectDevice23freenect_depth_callbackEP16_freenect_devicePvj[Freenect::FreenectDevice::freenect_depth_callback(_freenect_device*,
 void*, unsigned int)]+0xd): undefined reference to `freenect_get_user'
laksh.o: In function 
`Freenect::FreenectDevice::freenect_video_callback(_freenect_device*, void*, 
unsigned int)':
laksh.cpp:(.text._ZN8Freenect14FreenectDevice23freenect_video_callbackEP16_freenect_devicePvj[Freenect::FreenectDevice::freenect_video_callback(_freenect_device*,
 void*, unsigned int)]+0xd): undefined reference to `freenect_get_user'
laksh.o: In function `Freenect::Freenect::Freenect()':
laksh.cpp:(.text._ZN8Freenect8FreenectC1Ev[Freenect::Freenect::Freenect()]+0x38):
 undefined reference to `freenect_init'
laksh.cpp:(.text._ZN8Freenect8FreenectC1Ev[Freenect::Freenect::Freenect()]+0x141):
 undefined reference to `pthread_create'
laksh.o: In function `Freenect::Freenect::~Freenect()':
laksh.cpp:(.text._ZN8Freenect8FreenectD1Ev[Freenect::Freenect::~Freenect()]+0x92):
 undefined reference to `pthread_join'
laksh.cpp:(.text._ZN8Freenect8FreenectD1Ev[Freenect::Freenect::~Freenect()]+0x9f):
 undefined reference to `freenect_shutdown'
laksh.o: In function `Freenect::Freenect::operator()()':
laksh.cpp:(.text._ZN8Freenect8FreenectclEv[Freenect::Freenect::operator()()]+0x17):
 undefined reference to `freenect_process_events'
laksh.o: In function `FreenectDevice::FreenectDevice(_freenect_context*, int)':
laksh.cpp:(.text._ZN14FreenectDeviceC1EP17_freenect_contexti[FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x29): undefined reference to `vtable for FreenectDevice'
laksh.cpp:(.text._ZN14FreenectDeviceC1EP17_freenect_contexti[FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0x53): undefined reference to `freenect_find_video_mode'
laksh.cpp:(.text._ZN14FreenectDeviceC1EP17_freenect_contexti[FreenectDevice::FreenectDevice(_freenect_context*,
 int)]+0xc8): undefined reference to `freenect_find_video_mode'
collect2: ld returned 1 exit status



More information about the ros-users mailing list