INTRODUCTION
Overview
Download and Install
Quick Start
Documentation
Publications

NONFRAMEWORK CODE
Driver Interfaces
Drivers
Libraries
Utilities

FRAMEWORK CODE
Interfaces
Components
Libraries
Utilities

Full Software Listings

DEVELOPER
Tutorials
Examples
Dev Guide
Dashboard

PEOPLE
Contributors
Users

SourceForge.net Logo
Project
Download
Mailing lists

 

         

vfhdriver.h

00001 /*
00002  * Orca-Robotics Project: Components for robotics 
00003  *               http://orca-robotics.sf.net/
00004  * Copyright (c) 2004-2006 Alex Brooks, Alexei Makarenko, Tobias Kaupp
00005  *
00006  * This copy of Orca is licensed to you under the terms described in
00007  * the LICENSE file included in this distribution.
00008  *
00009  */
00010 #ifndef VFHDRIVER_H
00011 #define VFHDRIVER_H
00012 
00013 #include <orcalocalnav/idriver.h>
00014 #include <orcaice/context.h>
00015 #include <gbxsickacfr/gbxiceutilacfr/timer.h>
00016 #include <orcalocalnav/goal.h>
00017 #include <orcavfh/vfh_algorithm.h>
00018 #include <orcaice/heartbeater.h>
00019 
00020 namespace vfh {
00021 
00022 //
00023 // Implements VFH.
00024 // All the number-crunching is done by the VFH_Algorithm class.
00025 // This thing just feeds in configuration and information, plus
00026 // tries heuristic escape approaches if the robot gets stuck.
00027 //
00028 // @author Alex Brooks
00029 //
00030 class VfhDriver : public orcalocalnav::IDriver
00031 {
00032 
00033 public: 
00034 
00036 
00037     // Constants 
00038     enum DriverState 
00039     {
00040         STATE_GOAL_REACHED,
00041         STATE_TURNING_AT_GOAL,
00042         STATE_ESCAPING,
00043         STATE_MOVING_TO_GOAL
00044     };
00045 
00047 
00048     VfhDriver( const orcaice::Context                &context,
00049                const orca::VehicleDescription        &descr,
00050                const orca::RangeScanner2dDescription &scannerDescr );
00051     virtual ~VfhDriver();
00052 
00053     // Goal location is in robot's coordinate frame
00054     virtual hydronavutil::Velocity getCommand( const IDriver::Inputs &inputs );
00055 
00056 private: 
00057 
00058     void setSpeedConstraints( float maxSpeed, float maxTurnrate );
00059 
00060     // Functions for setting commands
00061     hydronavutil::Velocity escapeCommand(       const std::vector<float> &obsRanges );
00062     hydronavutil::Velocity turnToGoalCommand(   const orcalocalnav::Goal &goal );
00063     hydronavutil::Velocity approachGoalCommand( const orcalocalnav::Goal     &goal, 
00064                                                 const hydronavutil::Velocity &currentVelocity,
00065                                                 const std::vector<float>     &obsRanges );
00066     
00067     // If we stall a lot, our sensors must have missed something.  
00068     // We need to try something else.
00069     bool shouldEscape( bool stalled );
00070 
00071     // Copy to Player units
00072     void copyLaserScan( const std::vector<float> &obsRanges, double playerLaserScan[361][2] );
00073 
00074     void maybeSendHeartbeat();
00075 
00076     // Class to handle the internal VFH algorithm
00077     // (like maintaining histograms etc).
00078     // This is the guy that does all the number-crunching.
00079     VFH_Algorithm *vfhAlgorithm_;
00080 
00081     // Range and bearing values in player units, to give to vfh engine
00082     // The '361' is what vfh_algorithm expects
00083     double playerLaserScan_[361][2];
00084 
00085     // speed constraints
00086     float maxSpeed_;
00087     float maxTurnrate_;
00088 
00089     // An indicator of how much we've been stalling lately
00090     float stallRatio_;
00091 
00092     // Timing for escapes
00093     gbxiceutilacfr::Timer             escapeTimer_;
00094     static const double        escapeTimeMs_ = 1000.0;
00095 
00096     // Current state of the algorithm
00097     DriverState currentState_;
00098 
00099     // Previous command
00100     hydronavutil::Velocity prevCmd_;
00101 
00102     // Configuration from file
00103     VfhAlgorithmConfig vfhConfig_;
00104 
00105     orcaice::Heartbeater heartbeater_;
00106 
00107     const orca::RangeScanner2dDescription scannerDescr_;
00108 
00109     orcaice::Context context_;
00110 };
00111 std::ostream &operator<<( std::ostream &s, VfhDriver::DriverState state );
00112 
00113 // Used for dynamically loading driver
00114 class VfhDriverFactory : public orcalocalnav::DriverFactory
00115 {
00116 public:
00117     orcalocalnav::IDriver *createDriver( const orcaice::Context &context,
00118                                          const orca::VehicleDescription &vehicleDescr,
00119                                          const orca::RangeScanner2dDescription &scannerDescr ) const
00120         {
00121             return new VfhDriver( context, vehicleDescr, scannerDescr );
00122         }
00123 };
00124 
00125 } // namespace
00126 
00127 // Used for dynamically loading driver
00128 extern "C" {
00129     orcalocalnav::DriverFactory *createLocalNavDriverFactory();
00130 }
00131 
00132 #endif
 

Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)


Generated for Orca Robotics by  doxygen 1.4.5