⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laserrescan.cc

📁 机器人仿真软件
💻 CC
字号:
/* *  Player - One Hell of a Robot Server *  Copyright (C) 2000  Brian Gerkey   &  Kasper Stoy *                      gerkey@usc.edu    kaspers@robotics.usc.edu * *  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 * *//////////////////////////////////////////////////////////////////////////////// Desc: Driver for converting laser scan geometry// Author: Toby Collett// Date: 20 Sept 2005//// Theory of operation - linear interpolation of existing scans// to create virtual scan geometry//// Requires - Laser device.//////////////////////////////////////////////////////////////////////////////** @ingroup drivers *//** @{ *//** @defgroup driver_laserrescan laserrescan * @brief Laser rescannerThe laserrescan driver processes a laser scan to create a virtual scan configuration. Existing scans are interpolated.The driver was created for the purpose of using pmap with non-sick scanners@par Compile-time dependencies- none@par Provides- @ref interface_laser : output of the rescan@par Requires- @ref interface_laser : raw laser data from which to interpolate@par Configuration requests- PLAYER_LASER_GET_GEOM  @par Configuration file options- min_angle (float)  - Default: -pi/2  - Minimum angle of the new scan data- max_angle (float)  - Default: pi/2  - Maximum angle of the new scan data- scan_count (int)  - Default: 181  - Number of scans from min angle to max angle    @par Example @verbatimdriver(  name "sicklms200"  provides ["laser:0"]  port "/dev/ttyS0")driver(  name "laserescan"  requires ["laser:0"] # read from laser:0  provides ["laser:1"] # output results on laser:1)@endverbatim@author Toby Collett*//** @} */#include <libplayercore/playercore.h>#include <errno.h>#include <string.h>#include <math.h>#include <stdlib.h>       // for atoi(3)#include <unistd.h>#include "lasertransform.h"// Driver for computing the free c-space from a laser scan.class LaserRescan : public LaserTransform{  // Constructor  public: LaserRescan( ConfigFile* cf, int section);  // Process laser data.  Returns non-zero if the laser data has been  // updated.  protected: int UpdateLaser(player_laser_data_t * data);  double min_angle, max_angle, res;  int scan_count;};// Initialization functionDriver* LaserRescan_Init( ConfigFile* cf, int section){  return ((Driver*) (new LaserRescan( cf, section)));}// a driver registration functionvoid LaserRescan_Register(DriverTable* table){  table->AddDriver("laserrescan", LaserRescan_Init);}////////////////////////////////////////////////////////////////////////////////// ConstructorLaserRescan::LaserRescan( ConfigFile* cf, int section)    : LaserTransform(cf, section){  // Settings.  this->max_angle = cf->ReadAngle(section, "max_angle", M_PI/2.0);  this->min_angle = cf->ReadAngle(section, "min_angle", -M_PI/2.0);  this->scan_count = cf->ReadInt(section, "scan_count", 181);  res = (max_angle - min_angle) / scan_count;  return;}////////////////////////////////////////////////////////////////////////////////// Process laser data.int LaserRescan::UpdateLaser(player_laser_data_t * data){  int i;  // Construct the outgoing laser packet  this->data.resolution = (max_angle - min_angle)/((double)(scan_count-1));  this->data.min_angle = (min_angle);  this->data.max_angle = (max_angle);  this->data.ranges_count = scan_count;  this->data.max_range = data->max_range;    double real_min = data->min_angle;  double real_res = data->resolution;  	for (i = 0; i < scan_count; ++i)	{		double theta = min_angle + i*res;		double new_i = (theta - real_min)/real_res;				unsigned int j = (int) floor(new_i);		unsigned int k = (int) ceil(new_i);				if (j < 0)			j = 0;		if (j > data->ranges_count)			j = data->ranges_count;		if (k < 0)			k = 0;		if (k > data->ranges_count)			k = data->ranges_count;				double theta_j = real_min + j*real_res;						double interpolate = ((real_min +new_i*real_res) - theta_j)/real_res;				double new_value = data->ranges[j]+(data->ranges[k] - data->ranges[j])*interpolate;				this->data.ranges[i] = new_value;			}  this->Publish(this->device_addr, NULL,                 PLAYER_MSGTYPE_DATA, PLAYER_LASER_DATA_SCAN,                &this->data, sizeof(this->data), NULL);  return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -