00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00035
00036 #ifndef AMCL_H
00037 #define AMCL_H
00038
00039 #ifdef INCLUDE_RTKGUI
00040 #include "rtk.h"
00041 #endif
00042
00043 #include "player.h"
00044 #include "device.h"
00045 #include "devicetable.h"
00046 #include "drivertable.h"
00047
00048 #include "pf/pf.h"
00049 #include "amcl_sensor.h"
00050
00051
00052
00053 typedef struct
00054 {
00055
00056 double weight;
00057
00058
00059 pf_vector_t pf_pose_mean;
00060
00061
00062 pf_matrix_t pf_pose_cov;
00063
00064 } amcl_hyp_t;
00065
00066
00067
00068
00069 class AdaptiveMCL : public Driver
00070 {
00072
00073
00075
00076
00077 public: AdaptiveMCL(ConfigFile* cf, int section);
00078
00079
00080 public: virtual ~AdaptiveMCL(void);
00081
00082
00083 public: virtual int Setup(void);
00084 public: virtual int Shutdown(void);
00085
00086
00087 public: virtual void Update(void);
00088
00090
00091
00093
00094
00095 private: void Push(AMCLSensorData *data);
00096
00097
00098 private: AMCLSensorData *Peek(void);
00099
00100
00101 private: AMCLSensorData *Pop(void);
00102
00104
00106
00107
00108 private: virtual void Main(void);
00109
00110
00111 private: virtual void MainQuit();
00112
00113
00114 private: void InitFilter(void);
00115
00116
00117 private: bool UpdateFilter();
00118
00119
00120 private: void PutDataLocalize(uint32_t tsec, uint32_t tusec);
00121
00122
00123 private: void PutDataPosition(uint32_t tsec, uint32_t tusec, pf_vector_t delta);
00124
00125
00126 private: int HandleRequests(void);
00127
00128
00129 private: void HandleGetGeom(void *client, void *request, int len);
00130
00131
00132 private: void HandleSetPose(void *client, void *request, int len);
00133
00134
00135 private: void HandleGetParticles(void *client, void *request, int len);
00136
00137 #ifdef INCLUDE_RTKGUI
00138
00139 private: int SetupGUI(void);
00140
00141
00142 private: int ShutdownGUI(void);
00143
00144
00145 private: void UpdateGUI(void);
00146
00147
00148 private: void DrawPoseEst();
00149 #endif
00150
00152
00154
00155
00156 private: player_device_id_t position_id;
00157 private: player_device_id_t localize_id;
00158
00159
00160 private: int sensor_count;
00161 private: AMCLSensor *sensors[16];
00162
00163
00164 private: int init_sensor;
00165
00166
00167 private: int action_sensor;
00168
00169
00170 private: pf_t *pf;
00171 private: int pf_min_samples, pf_max_samples;
00172 private: double pf_err, pf_z;
00173
00174
00175 private: int q_size, q_start, q_len;
00176 private: AMCLSensorData **q_data;
00177
00178
00179 private: int hyp_count;
00180 private: amcl_hyp_t hyps[PLAYER_LOCALIZE_MAX_HYPOTHS];
00181
00182
00183 private: bool pf_init;
00184
00185
00186 private: pf_vector_t pf_init_pose_mean;
00187 private: pf_matrix_t pf_init_pose_cov;
00188
00189
00190 private: pf_vector_t pf_odom_pose;
00191
00192
00193 private: double min_dr, min_da;
00194
00195 #ifdef INCLUDE_RTKGUI
00196
00197 private: int enable_gui;
00198 private: rtk_app_t *app;
00199 private: rtk_canvas_t *canvas;
00200 private: rtk_fig_t *map_fig;
00201 private: rtk_fig_t *pf_fig;
00202 private: rtk_fig_t *robot_fig;
00203 #endif
00204
00205 #ifdef INCLUDE_OUTFILE
00206 private: FILE *outfile;
00207 #endif
00208 };
00209
00210 #endif