Revision: 7802
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7802&view=rev
Author:   thjc
Date:     2009-06-06 09:51:04 +0000 (Sat, 06 Jun 2009)

Log Message:
-----------
applied patch 2609220: Re enable fiducial interface in writelog and readlog 
drivers

Modified Paths:
--------------
    code/player/trunk/server/drivers/shell/readlog.cc
    code/player/trunk/server/drivers/shell/writelog.cc

Modified: code/player/trunk/server/drivers/shell/readlog.cc
===================================================================
--- code/player/trunk/server/drivers/shell/readlog.cc   2009-06-06 09:39:40 UTC 
(rev 7801)
+++ code/player/trunk/server/drivers/shell/readlog.cc   2009-06-06 09:51:04 UTC 
(rev 7802)
@@ -66,13 +66,13 @@
 - @ref interface_opaque
 - @ref interface_ptz
 - @ref interface_actarray
+- @ref interface_fiducial
 
 The following interfaces are supported in principle but are currently
 disabled because they need to be updated:
 
 - @ref interface_blobfinder
 - @ref interface_camera
-- @ref interface_fiducial
 - @ref interface_gps
 - @ref interface_joystick
 - @ref interface_position3d
@@ -195,6 +195,11 @@
                                      player_msghdr_t * hdr,
                                      void * data);
 
+  // Process fiducial interface configuration requests
+  private: int ProcessFiducialConfig(QueuePointer & resp_queue,
+                                  player_msghdr_t * hdr,
+                                  void * data);
+
   // Process laser interface configuration requests
   private: int ProcessLaserConfig(QueuePointer & resp_queue,
                                   player_msghdr_t * hdr,
@@ -225,6 +230,12 @@
                          int linenum, int token_count, char **tokens,
                          double time);
 
+  // Parse fiducial data
+  private: int ParseFiducial(player_devaddr_t id,
+                             unsigned short type, unsigned short subtype,
+                             int linenum, int token_count, char **tokens,
+                             double time);
+
 #if 0
   // Parse blobfinder data
   private: int ParseBlobfinder(player_devaddr_t id,
@@ -238,12 +249,6 @@
                            int linenum,
                           int token_count, char **tokens, double time);
 
-  // Parse fiducial data
-  private: int ParseFiducial(player_devaddr_t id,
-                             unsigned short type, unsigned short subtype,
-                             int linenum,
-                          int token_count, char **tokens, double time);
-
   // Parse gps data
   private: int ParseGps(player_devaddr_t id,
                         unsigned short type, unsigned short subtype,
@@ -938,6 +943,46 @@
 }
 
 int
+ReadLog::ProcessFiducialConfig(QueuePointer & resp_queue,
+                            player_msghdr_t * hdr,
+                            void * data)
+{
+  switch(hdr->subtype)
+  {
+    case PLAYER_FIDUCIAL_REQ_GET_GEOM:
+      {
+        // Find the right place from which to retrieve it
+        int j;
+        for(j=0;j<this->provide_count;j++)
+        {
+          if(Device::MatchDeviceAddress(this->provide_ids[j], hdr->addr))
+            break;
+        }
+        if(j>=this->provide_count)
+        {
+          puts("no matching device");
+          return(-1);
+        }
+
+        if(!this->provide_metadata[j])
+        {
+          puts("no metadata");
+          return(-1);
+        }
+
+        this->Publish(this->provide_ids[j], resp_queue,
+                      PLAYER_MSGTYPE_RESP_ACK, hdr->subtype,
+                      this->provide_metadata[j],
+                      sizeof(player_fiducial_geom_t),
+                      NULL);
+        return(0);
+      }
+    default:
+      return(-1);
+  }
+}
+
+int
 ReadLog::ProcessLaserConfig(QueuePointer & resp_queue,
                             player_msghdr_t * hdr,
                             void * data)
@@ -1091,6 +1136,11 @@
     return(this->ProcessLogConfig(resp_queue, hdr, data));
   }
   else if((hdr->type == PLAYER_MSGTYPE_REQ) &&
+          (hdr->addr.interf == PLAYER_FIDUCIAL_CODE))
+  {
+    return(this->ProcessFiducialConfig(resp_queue, hdr, data));
+  }
+  else if((hdr->type == PLAYER_MSGTYPE_REQ) &&
           (hdr->addr.interf == PLAYER_LASER_CODE))
   {
     return(this->ProcessLaserConfig(resp_queue, hdr, data));
@@ -1197,9 +1247,6 @@
   else if (id.interf == PLAYER_CAMERA_CODE)
     return this->ParseCamera(id, type, subtype, linenum,
                              token_count, tokens, time);
-  else if (id.interf == PLAYER_FIDUCIAL_CODE)
-    return this->ParseFiducial(id, type, subtype, linenum,
-                               token_count, tokens, time);
   else if (id.interf == PLAYER_GPS_CODE)
     return this->ParseGps(id, type, subtype, linenum,
                           token_count, tokens, time);
@@ -1210,6 +1257,9 @@
   if (id.interf == PLAYER_LASER_CODE)
     return this->ParseLaser(id, type, subtype, linenum,
                             token_count, tokens, time);
+  else if (id.interf == PLAYER_FIDUCIAL_CODE)
+    return this->ParseFiducial(id, type, subtype, linenum,
+                               token_count, tokens, time);
   else if (id.interf == PLAYER_LOCALIZE_CODE)
     return this->ParseLocalize(id, type, subtype, linenum,
                                token_count, tokens, time);
@@ -1350,48 +1400,114 @@
 
   return 0;
 }
+#endif
 
-
 ////////////////////////////////////////////////////////////////////////////
 // Parse fiducial data
-int ReadLog::ParseFiducial(player_devaddr_t id, int linenum,
-                               int token_count, char **tokens, struct timeval 
time)
+int ReadLog::ParseFiducial(player_devaddr_t id,
+                           unsigned short type, unsigned short subtype,
+                           int linenum, int token_count, char **tokens,
+                           double time)
 {
-  player_fiducial_data_t data;
-  int fiducial_count;
-
   if (token_count < 7)
   {
     PLAYER_ERROR2("incomplete line at %s:%d", this->filename, linenum);
     return -1;
   }
 
-  fiducial_count = atoi( tokens[6] );
-  data.count = NUINT16( fiducial_count );
+  switch(type) {
+      case PLAYER_MSGTYPE_DATA:
+            switch (subtype) {
+                case PLAYER_FIDUCIAL_DATA_SCAN:
+                    player_fiducial_data_t data;
+                    int fiducial_count;
 
-  for( int i = 0; i < fiducial_count; i++ )
-  {
-    data.fiducials[i].id = NINT16( atof(tokens[13*i + 7]) );
-    data.fiducials[i].pos[0] = NINT32(M_MM(atof(tokens[13*i+ 8])));
-    data.fiducials[i].pos[1] = NINT32(M_MM(atof(tokens[13*i+ 9])));
-    data.fiducials[i].pos[2] = NINT32(M_MM(atof(tokens[13*i+10])));
-    data.fiducials[i].rot[0] = NINT32(M_MM(atof(tokens[13*i+11])));
-    data.fiducials[i].rot[1] = NINT32(M_MM(atof(tokens[13*i+12])));
-    data.fiducials[i].rot[2] = NINT32(M_MM(atof(tokens[13*i+13])));
-    data.fiducials[i].upos[0] = NINT32(M_MM(atof(tokens[13*i+14])));
-    data.fiducials[i].upos[1] = NINT32(M_MM(atof(tokens[13*i+15])));
-    data.fiducials[i].upos[2] = NINT32(M_MM(atof(tokens[13*i+16])));
-    data.fiducials[i].urot[0] = NINT32(M_MM(atof(tokens[13*i+17])));
-    data.fiducials[i].urot[1] = NINT32(M_MM(atof(tokens[13*i+18])));
-    data.fiducials[i].urot[2] = NINT32(M_MM(atof(tokens[13*i+19])));
+                    fiducial_count = atoi(tokens[7]);
+
+                    data.fiducials_count = fiducial_count;
+                    //data.fiducials = (player_fiducial_item_t *) 
malloc(data.fiducials_count * sizeof(data.fiducials[0]));
+                    data.fiducials = new 
player_fiducial_item_t[data.fiducials_count];
+
+                    for (int i = 0; i < fiducial_count; i++) {
+                        data.fiducials[i].id = atof(tokens[13 * i + 8]);
+                        data.fiducials[i].pose.px = atof(tokens[13 * i + 9]);
+                        data.fiducials[i].pose.py = atof(tokens[13 * i + 10]);
+                        data.fiducials[i].pose.pz = atof(tokens[13 * i + 11]);
+                        data.fiducials[i].pose.proll = atof(tokens[13 * i + 
12]);
+                        data.fiducials[i].pose.ppitch = atof(tokens[13 * i + 
13]);
+                        data.fiducials[i].pose.pyaw = atof(tokens[13 * i + 
14]);
+                        data.fiducials[i].upose.px = atof(tokens[13 * i + 15]);
+                        data.fiducials[i].upose.py = atof(tokens[13 * i + 16]);
+                        data.fiducials[i].upose.pz = atof(tokens[13 * i + 17]);
+                        data.fiducials[i].upose.proll = atof(tokens[13 * i + 
18]);
+                        data.fiducials[i].upose.ppitch = atof(tokens[13 * i + 
19]);
+                        data.fiducials[i].upose.pyaw = atof(tokens[13 * i + 
20]);
+                    }
+                    this->Publish(id, type, subtype,
+                            (void*) & data, sizeof (data), &time);
+
+                    delete [] data.fiducials;
+                    return (0);
+                default:
+                    PLAYER_ERROR1("unimplemented fiducial data subtype %d\n", 
subtype);
+                    return(-1);
+            }
+      case PLAYER_MSGTYPE_RESP_ACK:
+            switch (subtype) {
+                case PLAYER_FIDUCIAL_REQ_GET_GEOM:
+
+                    if (token_count < 17) {
+                        PLAYER_ERROR2("incomplete line at %s:%d",
+                                this->filename, linenum);
+                        return -1;
+                    }
+                    player_fiducial_geom_t* geom;
+                    
+                    geom = (player_fiducial_geom_t*) calloc(1, sizeof 
(player_fiducial_geom_t));
+                    assert(geom);
+
+                    geom->pose.px = atof(tokens[7]);
+                    geom->pose.py = atof(tokens[8]);
+                    geom->pose.pz = atof(tokens[9]);
+                    geom->pose.proll = atof(tokens[10]);
+                    geom->pose.ppitch = atof(tokens[11]);
+                    geom->pose.pyaw = atof(tokens[12]);
+                    geom->size.sl = atof(tokens[13]);
+                    geom->size.sw = atof(tokens[14]);
+                    geom->size.sh = atof(tokens[15]);
+                    geom->fiducial_size.sl = atof(tokens[16]);
+                    geom->fiducial_size.sw = atof(tokens[17]);
+
+                    // Find the right place to put it
+                    int j;
+                    for (j = 0; j<this->provide_count; j++) {
+                        if (Device::MatchDeviceAddress(this->provide_ids[j], 
id))
+                            break;
+                    }
+                    assert(j<this->provide_count);
+
+                    if (this->provide_metadata[j])
+                        free(this->provide_metadata[j]);
+
+                    this->provide_metadata[j] = (void*) geom;
+
+                    // nothing to publish
+                    return (0);
+                    
+                default:
+                    PLAYER_ERROR1("unimplemented fiducial data subtype %d\n", 
subtype);
+                    return(-1);
+            }
+        default:
+            PLAYER_ERROR1("unimplemented fiducial data type %d\n", type);
+            return (-1);
+
   }
 
-  this->PutMsg(id,NULL,PLAYER_MSGTYPE_DATA,0, &data, sizeof(data), &time);
-
   return 0;
 }
 
-
+#if 0
 ////////////////////////////////////////////////////////////////////////////
 // Parse GPS data
 int ReadLog::ParseGps(player_devaddr_t id, int linenum,

Modified: code/player/trunk/server/drivers/shell/writelog.cc
===================================================================
--- code/player/trunk/server/drivers/shell/writelog.cc  2009-06-06 09:39:40 UTC 
(rev 7801)
+++ code/player/trunk/server/drivers/shell/writelog.cc  2009-06-06 09:51:04 UTC 
(rev 7802)
@@ -80,12 +80,12 @@
 - @ref interface_pointcloud3d
 - @ref interface_actarray
 - @ref interface_camera
+- @ref interface_fiducial
 
 The following interfaces are supported in principle but are currently
 disabled because they need to be updated:
 
 - @ref interface_blobfinder
-- @ref interface_fiducial
 - @ref interface_gps
 - @ref interface_joystick
 - @ref interface_position3d
@@ -274,13 +274,13 @@
 
   // Write camera data to file
   private: int WriteCamera(WriteLogDevice *device, player_msghdr_t* hdr, void 
*data);
+
+  // Write fiducial data to file
+  private: int WriteFiducial(player_msghdr_t* hdr, void *data);
 #if 0
   // Write blobfinder data to file
   private: void WriteBlobfinder(player_blobfinder_data_t *data);
 
-  // Write fiducial data to file
-  private: void WriteFiducial(player_fiducial_data_t *data);
-
   // Write GPS data to file
   private: void WriteGps(player_gps_data_t *data);
 
@@ -876,13 +876,13 @@
     case PLAYER_CAMERA_CODE:
       retval = this->WriteCamera(device, hdr, data);
       break;
+    case PLAYER_FIDUCIAL_CODE:
+      this->WriteFiducial(hdr, data);
+      break;
 #if 0
     case PLAYER_BLOBFINDER_CODE:
       this->WriteBlobfinder((player_blobfinder_data_t*) data);
       break;
-    case PLAYER_FIDUCIAL_CODE:
-      this->WriteFiducial((player_fiducial_data_t*) data);
-      break;
     case PLAYER_GPS_CODE:
       this->WriteGps((player_gps_data_t*) data);
       break;
@@ -2226,14 +2226,14 @@
     return -1;
 }
 
-#if 0
-
 /** @ingroup tutorial_datalog
- * @defgroup player_driver_writelog_fiducial Fiducial format
+ * @defgroup player_driver_writelog_fiducial fiducial format
 
 @brief fiducial log format
 
-The format for each @ref interface_fiducial message is:
+The following messages from @ref interface_fiducial interface are logged:
+
+PLAYER_MSGTYPE_DATA:PLAYER_FIDUCIAL_DATA_SCAN (1:1) has the folowing format:
   - count (int): number of fiducials to follow
   - list of fiducials; for each fiducial:
     - id (int): fiducial ID
@@ -2250,34 +2250,83 @@
     - upitch (float): uncertainty in relative pitch orientation, in radians
     - uyaw (float): uncertainty in relative yaw orientation, in radians
 
+PLAYER_MSGTYPE_RESP_ACK:PLAYER_FIDUCIAL_REQ_GET_GEOM (4:1) has the following 
format:
+    - x (float): relative X position, in meters
+    - y (float): relative Y position, in meters
+    - z (float): relative Z position, in meters
+    - roll (float): relative roll orientation, in radians
+    - pitch (float): relative pitch orientation, in radians
+    - yaw (float): relative yaw orientation, in radians
+    - length (float): fiducial finder length, in meters
+    - width (float): fiducial finder width, in meters
+    - height (float): fiducial finder height, in meters
+    - fiducial_length (float): fiducial marker length, in meters
+    - fiducial_width (float): fiducial marker width, in meters
 */
-void WriteLog::WriteFiducial(player_fiducial_data_t *data)
+int WriteLog::WriteFiducial(player_msghdr_t* hdr, void *data)
 {
-  // format: <count> [<id> <x> <y> <z> <roll> <pitch> <yaw> <ux> <uy> <uz> 
etc] ...
-  fprintf(this->file, "%d", HUINT16(data->count));
-  for(int i=0;i<HUINT16(data->count);i++)
-  {
-    fprintf(this->file, " %d"
-            " %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f"
-            " %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f",
-            HINT16(data->fiducials[i].id),
-            MM_M(HINT32(data->fiducials[i].pos[0])),
-            MM_M(HINT32(data->fiducials[i].pos[1])),
-            MM_M(HINT32(data->fiducials[i].pos[2])),
-            MM_M(HINT32(data->fiducials[i].rot[0])),
-            MM_M(HINT32(data->fiducials[i].rot[1])),
-            MM_M(HINT32(data->fiducials[i].rot[2])),
-            MM_M(HINT32(data->fiducials[i].upos[0])),
-            MM_M(HINT32(data->fiducials[i].upos[1])),
-            MM_M(HINT32(data->fiducials[i].upos[2])),
-            MM_M(HINT32(data->fiducials[i].urot[0])),
-            MM_M(HINT32(data->fiducials[i].urot[1])),
-            MM_M(HINT32(data->fiducials[i].urot[2])));
-  }
+  player_fiducial_data_t *fiducial_data;
+  player_fiducial_geom_t *fiducial_geom;
 
-  return;
+  switch (hdr->type) {
+        case PLAYER_MSGTYPE_DATA:
+            switch (hdr->subtype) {
+                case PLAYER_FIDUCIAL_DATA_SCAN:
+                    fiducial_data = (player_fiducial_data_t*) data;
+                    // format: <count> [<id> <x> <y> <z> <roll> <pitch> <yaw> 
<ux> <uy> <uz> <uroll> <upitch> <uyaw>] ...
+                    fprintf(this->file, "%d", fiducial_data->fiducials_count);
+                    for (int i = 0; i < fiducial_data->fiducials_count; i++) {
+                        fprintf(this->file, " %d"
+                                " %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f 
%+07.3f"
+                                " %+07.3f %+07.3f %+07.3f %+07.3f %+07.3f 
%+07.3f",
+                                fiducial_data->fiducials[i].id,
+                                fiducial_data->fiducials[i].pose.px,
+                                fiducial_data->fiducials[i].pose.py,
+                                fiducial_data->fiducials[i].pose.pz,
+                                fiducial_data->fiducials[i].pose.proll,
+                                fiducial_data->fiducials[i].pose.ppitch,
+                                fiducial_data->fiducials[i].pose.pyaw,
+                                fiducial_data->fiducials[i].upose.px,
+                                fiducial_data->fiducials[i].upose.py,
+                                fiducial_data->fiducials[i].upose.pz,
+                                fiducial_data->fiducials[i].upose.proll,
+                                fiducial_data->fiducials[i].upose.ppitch,
+                                fiducial_data->fiducials[i].upose.pyaw);
+                    }
+                    return(0);
+                default:
+                    return(-1);
+            }
+      case PLAYER_MSGTYPE_RESP_ACK:
+          switch(hdr->subtype) {
+              case PLAYER_FIDUCIAL_REQ_GET_GEOM:
+                  fiducial_geom = (player_fiducial_geom_t*) data;
+                  //format: <x> <y> <z> <roll> <pitch> <yaw> <length> ...
+                  // <width> <height> <fiducial_length> <fiducial_width>
+                  fprintf(this->file, "%+7.3f %+7.3f %+7.3f %+7.3f %+7.3f"
+                          "%+7.3f %+7.3f %+7.3f %+7.3f %+7.3f %+7.3f",
+                          fiducial_geom->pose.px,
+                          fiducial_geom->pose.py,
+                          fiducial_geom->pose.pz,
+                          fiducial_geom->pose.proll,
+                          fiducial_geom->pose.ppitch,
+                          fiducial_geom->pose.pyaw,
+                          fiducial_geom->size.sl,
+                          fiducial_geom->size.sw,
+                          fiducial_geom->size.sh,
+                          fiducial_geom->fiducial_size.sl,
+                          fiducial_geom->fiducial_size.sw);
+
+                  return(0);
+              default:
+                  return(-1);
+          }
+      default:
+          return(-1);
+    }
 }
 
+#if 0
 
 /** @ingroup tutorial_datalog
  * @defgroup player_driver_writelog_gps GPS format


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
OpenSolaris 2009.06 is a cutting edge operating system for enterprises 
looking to deploy the next generation of Solaris that includes the latest 
innovations from Sun and the OpenSource community. Download a copy and 
enjoy capabilities such as Networking, Storage and Virtualization. 
Go to: http://p.sf.net/sfu/opensolaris-get
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to