Revision: 8312 http://playerstage.svn.sourceforge.net/playerstage/?rev=8312&view=rev Author: thjc Date: 2009-10-18 15:31:25 +0000 (Sun, 18 Oct 2009)
Log Message: ----------- applied patch 2880788: Player SVN trunk: collective ranger patch Modified Paths: -------------- code/player/trunk/client_libs/libplayerc/dev_ranger.c code/player/trunk/server/drivers/ranger/lasertoranger.cc code/player/trunk/server/drivers/ranger/sonartoranger.cc code/player/trunk/server/drivers/ranger/toranger.cc code/player/trunk/utils/playerv/pv_dev_ranger.c Modified: code/player/trunk/client_libs/libplayerc/dev_ranger.c =================================================================== --- code/player/trunk/client_libs/libplayerc/dev_ranger.c 2009-10-18 15:26:36 UTC (rev 8311) +++ code/player/trunk/client_libs/libplayerc/dev_ranger.c 2009-10-18 15:31:25 UTC (rev 8312) @@ -122,20 +122,23 @@ return; } - if (device->element_count == 1) + if (device->bearings_count >= device->element_count) { - b = device->min_angle; - for (ii = 0; ii < device->bearings_count; ii++) + if (device->element_count == 1) { - device->bearings[ii] = b + device->device_pose.pyaw; - b += device->angular_res; + b = device->min_angle; + for (ii = 0; ii < device->bearings_count; ii++) + { + device->bearings[ii] = b + device->device_pose.pyaw; + b += device->angular_res; + } } - } - else - { - for (ii = 0; ii < device->element_count; ii++) + else { - device->bearings[ii] = device->element_poses[ii].pyaw; + for (ii = 0; ii < device->element_count; ii++) + { + device->bearings[ii] = device->element_poses[ii].pyaw; + } } } } @@ -145,7 +148,7 @@ // Calculate scan points void playerc_ranger_calculate_points(playerc_ranger_t *device) { - double b; + double b, r, s; uint32_t ii; device->points_count = device->ranges_count; @@ -163,27 +166,30 @@ return; } - if (device->element_count == 1) + if (device->points_count >= device->element_count) { - b = device->min_angle; - for (ii = 0; ii < device->points_count; ii++) + if (device->element_count == 1) { - double r = device->ranges[ii]; - device->points[ii].px = r * cos(b); - device->points[ii].py = r * sin(b); - device->points[ii].pz = 0.0; - b += device->angular_res; + b = device->min_angle; + for (ii = 0; ii < device->points_count; ii++) + { + r = device->ranges[ii]; + device->points[ii].px = r * cos(b); + device->points[ii].py = r * sin(b); + device->points[ii].pz = 0.0; + b += device->angular_res; + } } - } - else - { - for (ii = 0; ii < device->element_count; ii++) + else { - double r = device->ranges[ii]; - double s = r * cos(device->element_poses[ii].ppitch); - device->points[ii].px = s * cos(device->element_poses[ii].pyaw) + device->element_poses[ii].px; - device->points[ii].py = s * sin(device->element_poses[ii].pyaw) + device->element_poses[ii].py; - device->points[ii].pz = r * sin(device->element_poses[ii].ppitch) + device->element_poses[ii].pz; + for (ii = 0; ii < device->element_count; ii++) + { + r = device->ranges[ii]; + s = r * cos(device->element_poses[ii].ppitch); + device->points[ii].px = s * cos(device->element_poses[ii].pyaw) + device->element_poses[ii].px; + device->points[ii].py = s * sin(device->element_poses[ii].pyaw) + device->element_poses[ii].py; + device->points[ii].pz = r * sin(device->element_poses[ii].ppitch) + device->element_poses[ii].pz; + } } } } @@ -204,7 +210,7 @@ } } // Copy the range data - memcpy(device->ranges, data->ranges, data->ranges_count * sizeof(data->ranges[0])); + if (data->ranges_count > 0) memcpy(device->ranges, data->ranges, data->ranges_count * sizeof(data->ranges[0])); device->ranges_count = data->ranges_count; } @@ -223,7 +229,7 @@ } } // Copy the range data - memcpy(device->intensities, data->intensities, data->intensities_count * sizeof(data->intensities[0])); + if (data->intensities_count > 0) memcpy(device->intensities, data->intensities, data->intensities_count * sizeof(data->intensities[0])); device->intensities_count = data->intensities_count; } Modified: code/player/trunk/server/drivers/ranger/lasertoranger.cc =================================================================== --- code/player/trunk/server/drivers/ranger/lasertoranger.cc 2009-10-18 15:26:36 UTC (rev 8311) +++ code/player/trunk/server/drivers/ranger/lasertoranger.cc 2009-10-18 15:31:25 UTC (rev 8312) @@ -57,8 +57,18 @@ @par Configuration file options - - None +- buggy_geom (integer) + - Default: 0 + - If set to 1, the pz, proll and ppitch fields will be set to 0.0 + - This option is added to provide compatibility with old buggy laser drivers + that do not clean unused geometry structure fields +- force_config (float tuple) + - Default: not set + - If set, it will override configuration values obtained from buggy laser drivers + - values: [min_angle max_angle angular_res max_range range_res] + - units: [deg deg deg m m] + @par Example @verbatim @@ -114,6 +124,13 @@ uint8_t lastReqType; // Last request type on the ranger interface bool startupComplete; // True once this driver is ready to go + int buggy_geom; + int force_config; + float force_min_angle; + float force_max_angle; + float force_angular_res; + float force_max_range; + float force_range_res; }; // Initialisation function @@ -140,9 +157,28 @@ // Need a laser device as input if (cf->ReadDeviceAddr(&inputDeviceAddr, section, "requires", PLAYER_LASER_CODE, -1, NULL) != 0) { - SetError (-1); + this->SetError(-1); return; } + this->buggy_geom = cf->ReadInt(section, "buggy_geom", 0); + this->force_config = 0; + switch (cf->GetTupleCount(section, "force_config")) + { + case 0: + break; + case 5: + this->force_config = !0; + this->force_min_angle = cf->ReadTupleAngle(section, "force_config", 0, 0.0); + this->force_max_angle = cf->ReadTupleAngle(section, "force_config", 1, 0.0); + this->force_angular_res = cf->ReadTupleAngle(section, "force_config", 2, 0.0); + this->force_max_range = cf->ReadTupleFloat(section, "force_config", 3, 0.0); + this->force_range_res = cf->ReadTupleFloat(section, "force_config", 4, 0.0); + break; + default: + PLAYER_ERROR("Invalid number of forced settings"); + this->SetError(-1); + return; + } } // Setup function @@ -240,10 +276,19 @@ if (data != NULL) { // Update the properties from the data - laserConfig.min_angle = scanData->min_angle; - laserConfig.max_angle = scanData->max_angle; - laserConfig.resolution = scanData->resolution; - laserConfig.max_range = scanData->max_range; + if (this->force_config) + { + laserConfig.min_angle = this->force_min_angle; + laserConfig.max_angle = this->force_max_angle; + laserConfig.resolution = this->force_angular_res; + laserConfig.max_range = this->force_max_range; + } else + { + laserConfig.min_angle = scanData->min_angle; + laserConfig.max_angle = scanData->max_angle; + laserConfig.resolution = scanData->resolution; + laserConfig.max_range = scanData->max_range; + } // Copy out the range data if (scanData->ranges_count > 0) @@ -306,6 +351,12 @@ deviceGeom.size.sw = data->size.sw; deviceGeom.size.sl = data->size.sl; deviceGeom.size.sh = data->size.sh; + if (this->buggy_geom) + { + deviceGeom.pose.pz = 0.0; + deviceGeom.pose.proll = 0.0; + deviceGeom.pose.ppitch = 0.0; + } *(deviceGeom.element_poses) = deviceGeom.pose; *(deviceGeom.element_sizes) = deviceGeom.size; @@ -318,11 +369,21 @@ // Save a copy of the laser config, we need it to set intensity and/or config later memcpy (&laserConfig, data, sizeof (player_laser_config_t)); // Copy it into the destination - dest->min_angle = data->min_angle; - dest->max_angle = data->max_angle; - dest->angular_res = data->resolution; - dest->max_range = data->max_range; - dest->range_res = data->range_res; + if (this->force_config) + { + dest->min_angle = this->force_min_angle; + dest->max_angle = this->force_max_angle; + dest->angular_res = this->force_angular_res; + dest->max_range = this->force_max_range; + dest->range_res = this->force_range_res; + } else + { + dest->min_angle = data->min_angle; + dest->max_angle = data->max_angle; + dest->angular_res = data->resolution; + dest->max_range = data->max_range; + dest->range_res = data->range_res; + } dest->frequency = data->scanning_frequency; } Modified: code/player/trunk/server/drivers/ranger/sonartoranger.cc =================================================================== --- code/player/trunk/server/drivers/ranger/sonartoranger.cc 2009-10-18 15:26:36 UTC (rev 8311) +++ code/player/trunk/server/drivers/ranger/sonartoranger.cc 2009-10-18 15:31:25 UTC (rev 8312) @@ -105,6 +105,8 @@ int ConvertGeom (player_sonar_geom_t *geom); // Convert sonar data to ranger data int ConvertData (player_sonar_data_t *data); + private: + int skip_rq; }; // Initialisation function @@ -128,6 +130,7 @@ SonarToRanger::SonarToRanger( ConfigFile* cf, int section) : ToRanger (cf, section) { + this->skip_rq = 0; // Need a sonar device as input if (cf->ReadDeviceAddr(&inputDeviceAddr, section, "requires", PLAYER_SONAR_CODE, -1, NULL) != 0) { @@ -158,6 +161,7 @@ // Request the sonar geometry inputDevice->PutMsg (InQueue, PLAYER_MSGTYPE_REQ, PLAYER_SONAR_REQ_GET_GEOM, NULL, 0, NULL); + this->skip_rq = !0; return 0; } @@ -314,12 +318,14 @@ // Geometry request - need to manage the info we just got if (ConvertGeom (reinterpret_cast<player_sonar_geom_t*> (data)) == 0) { - Publish (device_addr, PLAYER_MSGTYPE_RESP_ACK, PLAYER_RANGER_REQ_GET_GEOM, reinterpret_cast<void*> (&deviceGeom), sizeof (deviceGeom), NULL); + if (!(this->skip_rq)) Publish (device_addr, PLAYER_MSGTYPE_RESP_ACK, PLAYER_RANGER_REQ_GET_GEOM, reinterpret_cast<void*> (&deviceGeom), sizeof (deviceGeom), NULL); + this->skip_rq = 0; return 0; } else { - Publish (device_addr, ret_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL); + if (!(this->skip_rq)) Publish (device_addr, ret_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL); + this->skip_rq = 0; return 0; } } @@ -334,7 +340,8 @@ else if (Message::MatchMessage (hdr, PLAYER_MSGTYPE_RESP_NACK, PLAYER_SONAR_REQ_GET_GEOM, inputDeviceAddr)) { // Geometry request - Publish (device_addr, ret_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL); + if (!(this->skip_rq)) Publish (device_addr, ret_queue, PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL); + this->skip_rq = 0; return 0; } Modified: code/player/trunk/server/drivers/ranger/toranger.cc =================================================================== --- code/player/trunk/server/drivers/ranger/toranger.cc 2009-10-18 15:26:36 UTC (rev 8311) +++ code/player/trunk/server/drivers/ranger/toranger.cc 2009-10-18 15:31:25 UTC (rev 8312) @@ -38,6 +38,9 @@ ToRanger::ToRanger (ConfigFile* cf, int section) : Driver (cf, section, false, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, PLAYER_RANGER_CODE) { + memset (&deviceGeom, 0, sizeof (deviceGeom)); + deviceGeom.element_poses = NULL; + deviceGeom.element_sizes = NULL; inputDevice = NULL; } @@ -56,6 +59,8 @@ { // Clean output memset (&deviceGeom, 0, sizeof (deviceGeom)); + deviceGeom.element_poses = NULL; + deviceGeom.element_sizes = NULL; return 0; } Modified: code/player/trunk/utils/playerv/pv_dev_ranger.c =================================================================== --- code/player/trunk/utils/playerv/pv_dev_ranger.c 2009-10-18 15:26:36 UTC (rev 8311) +++ code/player/trunk/utils/playerv/pv_dev_ranger.c 2009-10-18 15:31:25 UTC (rev 8312) @@ -19,6 +19,7 @@ */ #include <assert.h> +#include <stddef.h> #include <stdlib.h> #include <string.h> #include <math.h> @@ -199,6 +200,7 @@ double point1[2], point2[2]; double (*points)[2]; double temp = 0.0; + double b, range; // Drawing type depends on the assumed sensor type // Singular sensors (e.g. sonar sensors): @@ -221,7 +223,7 @@ // Assume the range is straight ahead (ignore min_angle and angular_res properties) points[0][0] = 0.0f; points[0][1] = 0.0f; - double range = ranger->proxy->ranges[ii]; + range = ranger->proxy->ranges[ii]; if (range < ranger->proxy->min_range) range = ranger->proxy->max_range; points[1][0] = range * cos(-temp); @@ -252,10 +254,10 @@ // Draw empty space points[0][0] = 0.0; points[0][1] = 0.0; - double b = ranger->proxy->min_angle; + b = ranger->proxy->min_angle; for (ii = 0; ii < ranger->proxy->ranges_count; ii++) { - double range = ranger->proxy->ranges[ii]; + range = ranger->proxy->ranges[ii]; if (range < ranger->proxy->min_range) { points[ii + 1][0] = ranger->proxy->max_range * cos(b); points[ii + 1][1] = ranger->proxy->max_range * sin(b); @@ -292,9 +294,9 @@ rtk_fig_color_rgb32(ranger->scan_fig[0], COLOR_LASER_OCC); // Get the first point - double b = ranger->proxy->min_angle; + b = ranger->proxy->min_angle; - double range = ranger->proxy->ranges[0]; + range = ranger->proxy->ranges[0]; if (range < ranger->proxy->min_range) { point1[0] = ranger->proxy->max_range * cos(b); point1[1] = ranger->proxy->max_range * sin(b); @@ -326,14 +328,14 @@ if (rtk_menuitem_ischecked(ranger->intns_item)) { // Draw an intensity scan - double b = ranger->proxy->min_angle; + b = ranger->proxy->min_angle; if (ranger->proxy->intensities_count > 0) { for (ii = 0; ii < ranger->proxy->intensities_count; ii++) { if (ranger->proxy->intensities[ii] != 0) { - double range = ranger->proxy->ranges[ii]; + range = ranger->proxy->ranges[ii]; if (range < ranger->proxy->min_range) { point1[0] = ranger->proxy->max_range * cos(b); point1[1] = ranger->proxy->max_range * sin(b); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Come build with us! The BlackBerry(R) Developer Conference in SF, CA is the only developer event you need to attend this year. Jumpstart your developing skills, take BlackBerry mobile applications to market and stay ahead of the curve. Join us from November 9 - 12, 2009. Register now! http://p.sf.net/sfu/devconference _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit