Revision: 8250 http://playerstage.svn.sourceforge.net/playerstage/?rev=8250&view=rev Author: gbiggs Date: 2009-09-08 01:47:22 +0000 (Tue, 08 Sep 2009)
Log Message: ----------- Applied patch #2839064: New Swissranger driver Modified Paths: -------------- code/player/trunk/server/drivers/mixed/CMakeLists.txt Added Paths: ----------- code/player/trunk/server/drivers/mixed/swissranger/ code/player/trunk/server/drivers/mixed/swissranger/CMakeLists.txt code/player/trunk/server/drivers/mixed/swissranger/swissranger.cc Modified: code/player/trunk/server/drivers/mixed/CMakeLists.txt =================================================================== --- code/player/trunk/server/drivers/mixed/CMakeLists.txt 2009-09-08 01:43:42 UTC (rev 8249) +++ code/player/trunk/server/drivers/mixed/CMakeLists.txt 2009-09-08 01:47:22 UTC (rev 8250) @@ -17,4 +17,5 @@ ADD_SUBDIRECTORY (rflex) ADD_SUBDIRECTORY (robotino) ADD_SUBDIRECTORY (sr3000) +ADD_SUBDIRECTORY (swissranger) ADD_SUBDIRECTORY (wbr) Added: code/player/trunk/server/drivers/mixed/swissranger/CMakeLists.txt =================================================================== --- code/player/trunk/server/drivers/mixed/swissranger/CMakeLists.txt (rev 0) +++ code/player/trunk/server/drivers/mixed/swissranger/CMakeLists.txt 2009-09-08 01:47:22 UTC (rev 8250) @@ -0,0 +1,4 @@ +PLAYERDRIVER_OPTION (swissranger build_swissranger ON) +PLAYERDRIVER_REQUIRE_HEADER_CPP (swissranger build_swissranger libMesaSR.h) +PLAYERDRIVER_ADD_DRIVER (swissranger build_swissranger LINKFLAGS "-lmesasr" SOURCES swissranger.cc) + Added: code/player/trunk/server/drivers/mixed/swissranger/swissranger.cc =================================================================== --- code/player/trunk/server/drivers/mixed/swissranger/swissranger.cc (rev 0) +++ code/player/trunk/server/drivers/mixed/swissranger/swissranger.cc 2009-09-08 01:47:22 UTC (rev 8250) @@ -0,0 +1,706 @@ +/* + * Player - One Hell of a Robot Server + * Copyright (C) 2006 Radu Bogdan Rusu (r...@cs.tum.edu) (SR3000) and + * Patrick Beeson (pbee...@traclabs.com) (SR4000 and SR3000 merge) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* + * $Id $ + */ + +/** @ingroup drivers */ +/** @{ */ +/** @defgroup driver_swissranger swissranger + * @brief SWISSRANGER + +The swissranger driver controls the Swiss Ranger SR4000 and SR3000 cameras. A broad range of +camera option parameters are supported, via the libmesasr library. The driver +provides a @ref interface_pointcloud3d interface and two @ref interface_camera +interfaces for both distance and intensity images, *or* a @ref interface_stereo +interface. + + +...@par Compile-time dependencies + +- libmesaSR.so and libMesaSR.h +- This version of the driver works for SR3000 and SR4000 using libmesa v1.0.12-583 (http://www.mesa-imaging.ch/drivers.php) + +...@par Provides + +- @ref interface_pointcloud3d : the 3d point cloud generated by the SWISSRANGER +- @ref interface_camera : snapshot images (both distance and intensity) taken by + the SWISSRANGER +- @ref interface_stereo : intensity and distance images as left and right + channels, and the 3d point cloud generated by the SWISSRANGER + +...@par Requires + +- none + +...@par Supported configuration requests + + - none + +...@par Properties provided + + - auto_exposure (integer): Set to 1 to turn auto exposure on. + + - integration_time (integer): Integration time. + - SR3k (integration_time+1)*0.200 ms + - SR4k 0.300ms+(integration_time)*0.100 ms + - Note auto exposure adapts integration time online + + - modulation_freq (integer): The devices employ the following values: + 0 == 40MHz, SR3k: maximal range 3.75m + 1 == 30MHz, SR3k, SR4k: maximal range 5m + 2 == 21MHz, SR3k: maximal range 7.14m + 3 == 20MHz, SR3k: maximal range 7.5m + 4 == 19MHz, SR3k: maximal range 7.89m + 5 == 60MHz, SR4k: maximal range 2.5m + 6 == 15MHz, SR4k: maximal range 10m + 7 == 10MHz, SR4k: maximal range 15m + 8 == 29MHz, SR4k: maximal range 5.17m + 9 == 31MHz, SR4k: maximal range 4.84m + 10 == 14.5MHz, SR4k: maximal range 10.34m + 11 == 15.5MHz, SR4k: maximal range 9.68m + + - amp_threshold (integer): Amplification threshold. + - Setting this value will set all distance values to 0 if their amplitude is lower than the amplitude threshold + +...@par Configuration file options + + - model (string) + - "SR3000" or + - "SR4000" (default) + + - cycle_freq (integer) + - cycle rate (in Hertz) (default is 30 Hz) + + - also see Properties above + +...@par Example + +...@verbatim +driver +( + name "swissranger" + + provides ["pointcloud3d:0" "distance:::camera:0" "intensity:::camera:1"] + + # OR ... + + provides ["stereo:0"] +) +...@endverbatim + +...@author Patrick Beeson (based on sr3000 driver by Radu Bogdan Rusu) + */ +/** @} */ + +#include <unistd.h> +#include <stdlib.h> +#include <libplayercore/playercore.h> +#include <libMesaSR.h> + +#define SR4K_MODE (AM_COR_FIX_PTRN|AM_CONV_GRAY|AM_DENOISE_ANF) +#define SR3K_MODE (AM_COR_FIX_PTRN|AM_MEDIAN) +#define CAM_ROWS 144 +#define CAM_COLS 176 + +class SWISSRANGER:public ThreadedDriver +{ + public: + // constructor + SWISSRANGER (ConfigFile* cf, int section); + ~SWISSRANGER (); + + int MainSetup (); + void MainQuit (); + + // MessageHandler + virtual int ProcessMessage (QueuePointer &resp_queue, + player_msghdr * hdr, + void * data); + + private: + + // Camera MessageHandler + int ProcessMessageCamera (QueuePointer &resp_queue, + player_msghdr * hdr, + void * data, + player_devaddr_t); + virtual void Main (); + void RefreshData (); + + // device identifier + CMesaDevice* srCam; + + // SR specific values + unsigned int rows, cols, inr; + + bool use_SR4k; + + ImgEntry* imgEntryArray; + float *buffer, *xp, *yp, *zp; + + // device bookkeeping + player_devaddr_t stereo_addr, pcloud_addr, d_cam_addr, i_cam_addr; + + player_pointcloud3d_data_t pcloud_data; + player_camera_data_t d_cam_data, i_cam_data; + player_stereo_data_t stereo_data; + + int cycle_freq; + + protected: + // Properties + IntProperty auto_exposure, integration_time, modulation_freq, amp_threshold; + + bool providePCloud, provideDCam, provideICam, provideStereo; +}; + +//////////////////////////////////////////////////////////////////////////////// +//Factory creation function. This functions is given as an argument when +// the driver is added to the driver table +Driver* + SWISSRANGER_Init (ConfigFile* cf, int section) +{ + return ((Driver*)(new SWISSRANGER (cf, section))); +} + +//////////////////////////////////////////////////////////////////////////////// +//Registers the driver in the driver table. Called from the +// player_driver_init function that the loader looks for +void + swissranger_Register (DriverTable* table) +{ + table->AddDriver ("swissranger", SWISSRANGER_Init); +} + +//////////////////////////////////////////////////////////////////////////////// +// Constructor. Retrieve options from the configuration file and do any +// pre-Setup() setup. +SWISSRANGER::SWISSRANGER (ConfigFile* cf, int section) + : ThreadedDriver (cf, section), + auto_exposure ("auto_exposure", -1, 0), + integration_time ("integration_time", -1, 0), + modulation_freq ("modulation_freq", -1, 0), + amp_threshold ("amp_threshold", -1, 0) +{ + memset (&this->stereo_addr, 0, sizeof (player_devaddr_t)); + memset (&this->pcloud_addr, 0, sizeof (player_devaddr_t)); + memset (&this->d_cam_addr, 0, sizeof (player_devaddr_t)); + memset (&this->i_cam_addr, 0, sizeof (player_devaddr_t)); + + this->RegisterProperty ("auto_exposure", &this->auto_exposure, cf, section); + this->RegisterProperty ("integration_time", &this->integration_time, cf, section); + this->RegisterProperty ("modulation_freq", &this->modulation_freq, cf, section); + this->RegisterProperty ("amp_threshold", &this->amp_threshold, cf, section); + + cycle_freq = cf->ReadInt(section, "cycle_freq", 30); + PLAYER_MSG1(2,"Running at %d Hz", cycle_freq); + + use_SR4k=true; + + const char* model = cf->ReadString(section, "model", "SR4000"); + if (!strcmp(model,"SR3000")) + use_SR4k=false; + + if (use_SR4k) + PLAYER_MSG0(2,"Using SR4000 device"); + else PLAYER_MSG0(2,"Using SR3000 device"); + + + providePCloud = FALSE; provideDCam = FALSE; provideICam = FALSE; provideStereo = FALSE; + + if (cf->ReadDeviceAddr (&(this->stereo_addr), section, "provides", + PLAYER_STEREO_CODE, -1, NULL) == 0) + { + if (this->AddInterface (this->stereo_addr) != 0) + { + this->SetError (-1); + return; + } + provideStereo = TRUE; + } + else + { + // Outgoing pointcloud interface + if (cf->ReadDeviceAddr (&(this->pcloud_addr), section, "provides", + PLAYER_POINTCLOUD3D_CODE, -1, NULL) == 0) + { + if (this->AddInterface (this->pcloud_addr) != 0) + { + this->SetError (-1); + return; + } + providePCloud = TRUE; + } + + // Outgoing distance::camera:0 interface + if (cf->ReadDeviceAddr (&(this->d_cam_addr), section, "provides", + PLAYER_CAMERA_CODE, -1, "distance") == 0) + { + if (this->AddInterface (this->d_cam_addr) != 0) + { + this->SetError (-1); + return; + } + provideDCam = TRUE; + } + + // Outgoing intensity::camera:1 interface + if (cf->ReadDeviceAddr (&(this->i_cam_addr), section, "provides", + PLAYER_CAMERA_CODE, -1, "intensity") == 0) + { + if (this->AddInterface (this->i_cam_addr) != 0) + { + this->SetError (-1); + return; + } + provideICam = TRUE; + } + + provideStereo = FALSE; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor. +SWISSRANGER::~SWISSRANGER () +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Set up the device. Return 0 if things go well, and -1 otherwise. +int + SWISSRANGER::MainSetup () +{ + int res; + // ---[ Open the camera ]--- + res = SR_OpenUSB (&srCam, 0); //returns the device ID used in other calls + + PLAYER_MSG0 (1, "> Connecting to SWISSRANGER... [done]"); + + if (auto_exposure == 1) { + if (use_SR4k) { + if (SR_SetAutoExposure (srCam, 1, 150, 5, 70)>=0) + PLAYER_MSG0(2,"Turned on auto exposure mode"); + else PLAYER_MSG0(2,"Could not change auto exposure mode"); + } + else { + if (SR_SetAutoExposure (srCam, 2, 255, 10, 45)>=0) + PLAYER_MSG0(2,"Turned on auto exposure mode"); + else PLAYER_MSG0(2,"Could not change auto exposure mode"); + } + } + else + if (auto_exposure == 0) { + if (SR_SetAutoExposure (srCam, 255, 0, 0, 0)>=0) + PLAYER_MSG0(2,"Turned off auto exposure mode"); + else PLAYER_MSG0(2,"Could not change auto exposure mode"); + } + else PLAYER_MSG0(2,"Not changing current auto exposure mode"); + + if (integration_time >= 0 && integration_time <= 255) + if (SR_SetIntegrationTime (srCam, integration_time)>=0) + PLAYER_MSG1(2,"Set integration time to %d", integration_time.GetValue()); + else PLAYER_MSG0(2,"Could not set integration time"); + else PLAYER_MSG0(2,"Not changing current integration time"); + + if (modulation_freq >= 0 && modulation_freq <= 11) + if (SR_SetModulationFrequency (srCam, (ModulationFrq)(modulation_freq.GetValue()))>=0) { + PLAYER_MSG1(2,"Set modulation frequency to mode %d", modulation_freq.GetValue()); + } + else PLAYER_MSG0(2,"Could not set modulation frequency"); + else PLAYER_MSG0(2,"Not changing current modulation frequency"); + PLAYER_MSG1(2,"Modulation Frequency: %d",(int)SR_GetModulationFrequency(srCam)); + + + if (amp_threshold >= 0) + if (SR_SetAmplitudeThreshold (srCam, amp_threshold)>=0) + PLAYER_MSG1(2,"Set amplitude threshold to %d", amp_threshold.GetValue()); + else PLAYER_MSG0(2,"Could not set amplitude threshold"); + else PLAYER_MSG0(2,"Not changing current amplitude threshold"); + + + // ---[ Get the number of rows, cols, ... ]--- + rows = SR_GetRows (srCam); + cols = SR_GetCols (srCam); + inr = SR_GetImageList (srCam, &imgEntryArray); + modulation_freq = SR_GetModulationFrequency (srCam); + integration_time = SR_GetIntegrationTime (srCam); + + + if ( (cols != CAM_COLS) || (rows != CAM_ROWS) || (inr < 1) || (imgEntryArray == 0) ) + { + PLAYER_ERROR ("> Error while connecting to camera!"); + SR_Close (srCam); + return (-1); + } + + // ---[ Set the acquisition mode ]--- + if (use_SR4k) + SR_SetMode (srCam, SR4K_MODE); + else SR_SetMode (srCam, SR3K_MODE); + + // Points array + size_t buffer_size = rows * cols * 3 * sizeof (float); + buffer = (float*)malloc (buffer_size); + memset (buffer, 0xaf, buffer_size); + + xp = buffer; + yp = &xp[rows*cols]; + zp = &yp[rows*cols]; + + PLAYER_MSG0(2, ">> Ready"); + + return (0); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Shutdown the device +void + SWISSRANGER::MainQuit () +{ + StopThread (); + + // ---[ Close the camera ]--- + int res = SR_Close (srCam); + + PLAYER_MSG1 (1, "> SWISSRANGER driver shutting down... %d [done]", res); + + // ---[ Free the allocated memory buffer ]--- + free (buffer); + +} + +//////////////////////////////////////////////////////////////////////////////// +// Process messages from/for a camera interface +int + SWISSRANGER::ProcessMessageCamera (QueuePointer &resp_queue, + player_msghdr * hdr, + void * data, + player_devaddr_t stereo_addr) +{ + int res; + + // Check for properties + if (Message::MatchMessage (hdr, PLAYER_MSGTYPE_REQ, PLAYER_SET_INTPROP_REQ, stereo_addr)) + { + player_intprop_req_t req = *reinterpret_cast<player_intprop_req_t*> (data); + if (auto_exposure.KeyIsEqual (req.key)) + { + // ---[ Set Autoexposure + if (req.value == 1) { + if (use_SR4k) + res = SR_SetAutoExposure (srCam, 1, 150, 5, 70); + else + res = SR_SetAutoExposure (srCam, 5, 255, 10, 45); + } + else + res = SR_SetAutoExposure (srCam, 255, 0, 0, 0); + + // Check the error code + if (res >= 0) + { + auto_exposure = req.value; + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + else + { + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + return (0); + } + else if (integration_time.KeyIsEqual (req.key)) + { + // ---[ Set integration time + res = SR_SetIntegrationTime (srCam, req.value); + + // Check the error code + if (res >= 0) + { + integration_time = req.value; + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + else + { + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + return (0); + } + else if (modulation_freq.KeyIsEqual (req.key)) + { + // ---[ Set modulation frequency + if (req.value >= 0 && req.value <= 11) + res = SR_SetModulationFrequency (srCam, (ModulationFrq)req.value); + else res=1; + + // Check the error code + if (res >= 0) + { + modulation_freq = req.value; + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + else + { + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + return (0); + } + else if (amp_threshold.KeyIsEqual (req.key)) + { + // ---[ Set amplitude threshold + res = SR_SetAmplitudeThreshold (srCam, req.value); + + // Check the error code + if (res >= 0) + { + amp_threshold = req.value; + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + else + { + Publish (stereo_addr, resp_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_SET_INTPROP_REQ, NULL, 0, NULL); + } + return (0); + } + return (-1); // Let the default property handling handle it + } + else if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, PLAYER_GET_INTPROP_REQ, device_addr)) + { + player_intprop_req_t req = *reinterpret_cast<player_intprop_req_t*> (data); + if (modulation_freq.KeyIsEqual (req.key)) + { + // ---[ Get modulation frequency + modulation_freq.SetValue (SR_GetModulationFrequency (srCam)); + modulation_freq.GetValueToMessage (reinterpret_cast<void*> (&req)); + Publish (device_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_GET_INTPROP_REQ, reinterpret_cast<void*> (&req), sizeof(player_intprop_req_t), NULL); + return (0); + } + else if (integration_time.KeyIsEqual (req.key)) + { + // ---[ Get integration time + integration_time.SetValue (SR_GetIntegrationTime (srCam)); + integration_time.GetValueToMessage (reinterpret_cast<void*> (&req)); + Publish (device_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_GET_INTPROP_REQ, reinterpret_cast<void*> (&req), sizeof(player_intprop_req_t), NULL); + return (0); + } + return (-1); // Let the default property handling handle it + } + + return (0); +} + +//////////////////////////////////////////////////////////////////////////////// +// ProcessMessage +int SWISSRANGER::ProcessMessage (QueuePointer &resp_queue, + player_msghdr * hdr, + void * data) +{ + assert (hdr); + + if (provideStereo) + ProcessMessageCamera (resp_queue, hdr, data, stereo_addr); + else + { + ProcessMessageCamera (resp_queue, hdr, data, d_cam_addr); + ProcessMessageCamera (resp_queue, hdr, data, i_cam_addr); + } + + return (0); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void SWISSRANGER::Main () +{ + + double duration_usecs = 1000000.0 / cycle_freq; + + memset (&stereo_data, 0, sizeof (stereo_data)); + memset (&pcloud_data, 0, sizeof (pcloud_data)); + memset (&d_cam_data, 0, sizeof (d_cam_data )); + memset (&i_cam_data, 0, sizeof (i_cam_data )); + + double start_time; + GlobalTime->GetTimeDouble(&start_time); // start of initial cycle + + for (;;) + { + // handle commands and requests/replies -------------------------------- + pthread_testcancel (); + ProcessMessages (); + + // get data ------------------------------------------------------------ + if ((rows != 1) && (cols != 1)) + RefreshData (); + + double now; + GlobalTime->GetTimeDouble(&now); + + double elapsed_usecs = (now - start_time) * 1000000.0; + + if (elapsed_usecs < duration_usecs) + while (duration_usecs - elapsed_usecs >= 500) { + + useconds_t delay=(useconds_t) (duration_usecs - elapsed_usecs - 499); + // Linux usleep() rounds up to the next millisecond + usleep(delay); + GlobalTime->GetTimeDouble(&now); + elapsed_usecs = (now - start_time) * 1000000.0; + } + + GlobalTime->GetTimeDouble(&start_time); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// RefreshData function +void SWISSRANGER::RefreshData () +{ + int res; + unsigned int i; + + res = SR_Acquire (srCam); + + uint8_t *distance_image = (unsigned char*)imgEntryArray->data; + uint8_t *intensity_image = (unsigned char*)imgEntryArray->data + (imgEntryArray->width * imgEntryArray->height * 2); +// buffer_size/2; + + // Points array + res = SR_CoordTrfFlt (srCam, xp, yp, zp, sizeof (float), sizeof (float), sizeof (float)); + + if (provideStereo) + { + stereo_data.points_count = rows * cols; + stereo_data.points = new player_pointcloud3d_stereo_element_t[stereo_data.points_count]; + for (i = 0; i < rows*cols; i++) + { + player_pointcloud3d_stereo_element_t element; + element.px = xp[i]; + element.py = yp[i]; + element.pz = zp[i]; + + element.red = intensity_image[i*2 + 1]; + element.green = intensity_image[i*2 + 1]; + element.blue = intensity_image[i*2 + 1]; + stereo_data.points[i] = element; + } + + // Prepare distance camera data + d_cam_data.width = cols; + d_cam_data.height = rows; + d_cam_data.bpp = 16; + d_cam_data.format = PLAYER_CAMERA_FORMAT_MONO16; + d_cam_data.fdiv = 1; + d_cam_data.compression = PLAYER_CAMERA_COMPRESS_RAW; + d_cam_data.image_count = rows*cols*2; + d_cam_data.image = distance_image; + + stereo_data.left_channel = d_cam_data; + + // Prepare intensity camera data + i_cam_data.width = cols; + i_cam_data.height = rows; + i_cam_data.bpp = 16; + i_cam_data.format = PLAYER_CAMERA_FORMAT_MONO16; + i_cam_data.fdiv = 1; + i_cam_data.compression = PLAYER_CAMERA_COMPRESS_RAW; + i_cam_data.image_count = rows*cols*2; + i_cam_data.image = intensity_image; + + stereo_data.right_channel = i_cam_data; + + // Publish the stereo data + // int total_size = 28+(i_cam_data.image_count) + + // 28+(d_cam_data.image_count) + + // 4 + pcloud_data.points_count*sizeof (player_pointcloud3d_element_t); + + Publish (stereo_addr, PLAYER_MSGTYPE_DATA, PLAYER_STEREO_DATA_STATE, &stereo_data); //, total_size, NULL); + + delete [] stereo_data.points; + } + else + { + // Publish pointcloud3d data if subscribed + if (providePCloud) + { + pcloud_data.points_count = rows * cols; + pcloud_data.points = new player_pointcloud3d_element_t[pcloud_data.points_count]; + for (i = 0; i < rows*cols; i++) + { + player_pointcloud3d_element_t element; + element.point.px = xp[i]; + element.point.py = yp[i]; + element.point.pz = zp[i]; + + element.color.alpha = 255; + element.color.red = intensity_image[i*2 + 1]; + element.color.green = intensity_image[i*2 + 1]; + element.color.blue = intensity_image[i*2 + 1]; + pcloud_data.points[i] = element; + } + + // Write the Pointcloud3d data + Publish (pcloud_addr, PLAYER_MSGTYPE_DATA, PLAYER_POINTCLOUD3D_DATA_STATE, + &pcloud_data); //, 4 + pcloud_data.points_count*sizeof (player_pointcloud3d_element_t), NULL); + + delete [] pcloud_data.points; + } + + // Publish distance camera data if subscribed + if (provideDCam) + { + d_cam_data.width = cols; + d_cam_data.height = rows; + d_cam_data.bpp = 16; + d_cam_data.format = PLAYER_CAMERA_FORMAT_MONO16; + d_cam_data.fdiv = 1; + d_cam_data.compression = PLAYER_CAMERA_COMPRESS_RAW; + d_cam_data.image_count = rows*cols*2; + d_cam_data.image = distance_image; + + // Write the distance camera data + Publish (d_cam_addr, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, + &d_cam_data); //, 28+(d_cam_data.image_count), NULL); + } + + // Publish intensity camera data if subscribed + if (provideICam) + { + i_cam_data.width = cols; + i_cam_data.height = rows; + i_cam_data.bpp = 16; + i_cam_data.format = PLAYER_CAMERA_FORMAT_MONO16; + i_cam_data.fdiv = 1; + i_cam_data.compression = PLAYER_CAMERA_COMPRESS_RAW; + i_cam_data.image_count = rows*cols*2; + i_cam_data.image = intensity_image; + + // Write the intensity camera data + Publish (i_cam_addr, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, + &i_cam_data); //, 28+(i_cam_data.image_count), NULL); + } + } // if (Stereo) ... else + + return; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit