Skip to content

Commit b5818ed

Browse files
committed
time back particle filter
1 parent 584708d commit b5818ed

18 files changed

+319
-169
lines changed

CMakeLists.txt

+3-13
Original file line numberDiff line numberDiff line change
@@ -179,20 +179,14 @@ src/node.cpp
179179
src/mcl.cpp
180180
src/particle_filter.cpp
181181
src/xorshift128.cpp
182+
src/time.cpp
182183
src/resample_noise/normal_distribution.cpp
183184
src/measurement_model/lidar_measurement_model.cpp
185+
src/measurement_model/ndt_pose_measurement_model.cpp
184186
src/prediction_model/foo_prediction_model.cpp
185187
src/prediction_model/foo_prediction_model_node.cpp
186188
)
187-
add_executable(test_amcl_3d
188-
src/test.cpp
189-
src/mcl.cpp
190-
src/particle_filter.cpp
191-
src/xorshift128.cpp
192-
src/resample_noise/normal_distribution.cpp
193-
src/measurement_model/lidar_measurement_model.cpp
194-
src/prediction_model/foo_prediction_model.cpp
195-
)
189+
196190
## Rename C++ executable without prefix
197191
## The above recommended prefix causes long target names, the following renames the
198192
## target back to the shorter version for ease of user use
@@ -202,15 +196,11 @@ src/prediction_model/foo_prediction_model.cpp
202196
## Add cmake target dependencies of the executable
203197
## same as for the library above
204198
add_dependencies(amcl_3d_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
205-
add_dependencies(test_amcl_3d ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
206199

207200
## Specify libraries to link a library or executable target against
208201
target_link_libraries(amcl_3d_node
209202
${catkin_LIBRARIES}
210203
)
211-
target_link_libraries(test_amcl_3d
212-
${catkin_LIBRARIES}
213-
)
214204

215205
#############
216206
## Install ##

include/amcl_3d/mcl.hpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
2-
#include "amcl_3d/particle_filter_interface.hpp"
32
#include "amcl_3d/type.hpp"
3+
#include "amcl_3d/time.hpp"
44
#include "amcl_3d/particle_filter.hpp"
55
#include <pcl/point_cloud.h>
66
#include <pcl/kdtree/kdtree_flann.h>
@@ -20,16 +20,19 @@ class Amcl
2020
AmclParam getParam();
2121
bool setMap(const pcl::PointCloud<pcl::PointXYZ>::Ptr map);
2222
bool getParticles(std::shared_ptr<const Particles> &particles_ptr);
23-
bool measureLidar(const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement);
23+
bool measureLidar(const Time &time, const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement);
24+
bool measureNdtPose(std::shared_ptr<const Particles> particles_ptr, const Position &position, const Quat &quat, const PoseCovariance &covariance);
2425
bool predict(std::shared_ptr<PredictionModelInterface> model);
25-
bool setInitialPose(const Position &position);
26-
bool setInitialPose(const Position &position, const Quat &quat);
26+
bool predict(std::shared_ptr<PredictionModelInterface> model, const Time &time);
27+
bool predict(std::shared_ptr<Particles> particles_ptr, std::shared_ptr<PredictionModelInterface> model, const Time &time);
2728
bool setInitialPose(const Position &position, const Quat &quat, const PoseCovariance &covariance);
2829
bool setInitialPose(const Position &position, const Quat &quat, const PoseCovariance &covariance, const size_t particle_num);
2930
State getMMSE();
3031
State getMAP();
3132

3233
private:
34+
bool checkResample(const MeasurementState &measurement_state);
35+
3336
pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr kd_map_ptr_;
3437
std::shared_ptr<ParticleFilter> pf_ptr_;
3538
AmclParam param_;

include/amcl_3d/measurement_model/lidar_measurement_model.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ class LidarMeasurementModel : public MeasurementModelInterface
1414
const size_t random_sample_num,
1515
/* max limit[m] to calc likelihood */ const double max_dist,
1616
/* sigma[m] to calc likelihood */ const double sigma);
17-
bool measure(std::shared_ptr<Particles> particles_ptr, MeasurementState &measuremnt_state) override;
17+
bool measure(std::shared_ptr<const Particles> mesurement_point_particles_ptr,
18+
std::shared_ptr<Particles> particles_ptr,
19+
MeasurementState &measurement_state) override;
1820
void setKdMap(pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr kd_map_ptr);
1921
void setMeasuement(pcl::PointCloud<pcl::PointXYZ>::Ptr measurement_ptr);
2022
bool isKdMap();

include/amcl_3d/measurement_model/measurement_model_interface.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ namespace amcl_3d
55
{
66
class MeasurementModelInterface
77
{
8-
public:
9-
virtual bool measure(std::shared_ptr<Particles> particles_ptr, MeasurementState &measuremnt_state) = 0; // don't normalize weight because of augmented mcl
8+
public:
9+
virtual bool measure(std::shared_ptr<const Particles> mesurement_point_particles_ptr,
10+
std::shared_ptr<Particles> particles_ptr,
11+
MeasurementState &measurement_state) = 0; // don't normalize weight because of augmented mcl
1012
};
1113

1214
} // namespace amcl_3d
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#pragma once
2+
#include "amcl_3d/measurement_model/measurement_model_interface.hpp"
3+
4+
namespace amcl_3d
5+
{
6+
class NdtPoseMeasurementModel : public MeasurementModelInterface
7+
{
8+
public:
9+
NdtPoseMeasurementModel(const Position &position, const Quat &quat, const PoseCovariance &covariance);
10+
bool measure(std::shared_ptr<const Particles> mesurement_point_particles_ptr,
11+
std::shared_ptr<Particles> particles_ptr,
12+
MeasurementState &measurement_state) override;
13+
14+
private:
15+
Position position_;
16+
Quat quat_;
17+
PoseCovariance covariance_;
18+
};
19+
20+
} // namespace amcl_3d

include/amcl_3d/particle_filter.hpp

+40-8
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,69 @@
11
#pragma once
2-
#include "amcl_3d/particle_filter_interface.hpp"
2+
#include <memory>
3+
#include "amcl_3d/type.hpp"
4+
#include "amcl_3d/time.hpp"
5+
#include "amcl_3d/resample_noise/resample_noise_interface.hpp"
6+
#include "amcl_3d/prediction_model/prediction_model_interface.hpp"
7+
#include "amcl_3d/measurement_model/measurement_model_interface.hpp"
38
#include "amcl_3d/xorshift128.hpp"
49
#include <random>
510
#include <limits>
611

712
namespace amcl_3d
813
{
9-
class ParticleFilter : public ParticleFilterInterface
14+
class ParticleFilter
1015
{
16+
public:
17+
struct NoiseGenerators
18+
{
19+
NoiseGenerators(std::shared_ptr<ResampleNoiseInterface> x_noise_gen,
20+
std::shared_ptr<ResampleNoiseInterface> y_noise_gen,
21+
std::shared_ptr<ResampleNoiseInterface> z_noise_gen,
22+
std::shared_ptr<ResampleNoiseInterface> roll_noise_gen,
23+
std::shared_ptr<ResampleNoiseInterface> pitch_noise_gen,
24+
std::shared_ptr<ResampleNoiseInterface> yaw_noise_gen) : x(x_noise_gen), y(y_noise_gen), z(z_noise_gen), roll(roll_noise_gen), pitch(pitch_noise_gen), yaw(yaw_noise_gen) {}
25+
std::shared_ptr<ResampleNoiseInterface> x;
26+
std::shared_ptr<ResampleNoiseInterface> y;
27+
std::shared_ptr<ResampleNoiseInterface> z;
28+
std::shared_ptr<ResampleNoiseInterface> roll;
29+
std::shared_ptr<ResampleNoiseInterface> pitch;
30+
std::shared_ptr<ResampleNoiseInterface> yaw;
31+
};
32+
1133
public:
1234
ParticleFilter();
1335

1436
virtual ~ParticleFilter(){};
15-
bool init(const Position &position, const Quat &quat, const NoiseGenerators &noise_ge, const size_t particle_num) override;
37+
bool init(const Position &position, const Quat &quat, const NoiseGenerators &noise_ge, const size_t particle_num);
1638
bool resample(const KLDSamplingParam &param, const double random_particle_ratio,
1739
const NoiseGenerators &random_particle_noise_gen); // kld resample and random noised resample
1840
bool resample(const size_t particle_num,
1941
const double random_particle_ratio, const NoiseGenerators &random_particle_noise_gen); // random noised resample
2042
bool resample(const size_t particle_num); // normal resample
21-
bool predict(std::shared_ptr<PredictionModelInterface> model) override;
22-
bool measure(std::shared_ptr<MeasurementModelInterface> model, MeasurementState &measuremnt_state) override;
23-
bool getParticles(std::shared_ptr<const Particles> &particles_ptr) override;
43+
// bool predict(std::shared_ptr<PredictionModelInterface> model);
44+
bool predict(std::shared_ptr<PredictionModelInterface> model, const Time &time);
45+
bool predict(std::shared_ptr<Particles> particles_ptr,
46+
std::shared_ptr<PredictionModelInterface> model,
47+
const Time &time,
48+
const bool update_time = true);
49+
bool measure(std::shared_ptr<MeasurementModelInterface> model, MeasurementState &measuremnt_state);
50+
bool measure(std::shared_ptr<const Particles> measurement_point_particles_ptr,
51+
std::shared_ptr<MeasurementModelInterface> model,
52+
MeasurementState &measurement_state);
53+
bool getParticles(std::shared_ptr<const Particles> &particles_ptr);
2454
void normalizeWeight();
2555
State getMMSE(); // minimum mean square error
26-
State getMAP(); // maximum a posteriori
56+
State getMAP(); // maximum a posteriori
2757
size_t getParticleNum();
2858
double getESS(const bool normalized = false); // effective sample size
2959

3060
private:
3161
bool resample(std::shared_ptr<Particles> new_particles_ptr, const size_t particle_num,
3262
const double random_particle_ratio, const NoiseGenerators &random_particle_noise_gen);
3363
void normalizeWeight(std::shared_ptr<Particles> particles_ptr);
34-
double getNormalCDFQuantile(const double u);
64+
double getNormalCDFQuantile(const double u);
3565
XorShift128 rand_;
66+
std::shared_ptr<Particles> particles_ptr_;
67+
Time last_prediction_time_;
3668
};
3769
} // namespace amcl_3d

include/amcl_3d/particle_filter_interface.hpp

-42
This file was deleted.

include/amcl_3d/prediction_model/foo_prediction_model.hpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include "amcl_3d/prediction_model/prediction_model_interface.hpp"
33
#include "amcl_3d/xorshift128.hpp"
44
#include "amcl_3d/mcl.hpp"
5-
#include <ros/ros.h>
65

76
namespace amcl_3d
87
{
@@ -11,16 +10,13 @@ class FooPredictionModel : public PredictionModelInterface
1110
public:
1211
FooPredictionModel();
1312
FooPredictionModel(const Eigen::Vector3d &vel, const Eigen::Vector3d &omega);
14-
bool predict(State &state, bool rising_edge = false, bool falling_edge = false) override;
15-
bool predict(State &state, const double dt_sec);
13+
bool predict(State &state, const double dt_sec) override;
1614
bool measumentLinearVelocity(const Eigen::Vector3d &vel);
1715
bool measumentAngularVelocity(const Eigen::Vector3d &omega);
1816
Eigen::Vector3d getLinearVelocity();
1917
Eigen::Vector3d getAngularVelocity();
2018

2119
private:
22-
ros::Time current_time_;
23-
ros::Time last_prediction_time_;
2420
Eigen::Vector3d vel_;
2521
Eigen::Vector3d omega_;
2622
static XorShift128 rand_;

include/amcl_3d/prediction_model/prediction_model_interface.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace amcl_3d
66
class PredictionModelInterface
77
{
88
public:
9-
virtual bool predict(State &state, bool rising_edge = false, bool falling_edge = false) = 0;
9+
virtual bool predict(State &state, const double st_sec) = 0;
1010
};
1111
} // namespace amcl_3d

include/amcl_3d/time.hpp

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <ros/ros.h>
4+
5+
namespace amcl_3d
6+
{
7+
struct Time
8+
{
9+
Time(const ros::Time &ros_time);
10+
Time();
11+
ros::Time toROSTime();
12+
static Time fromROSTime(const ros::Time &ros_time);
13+
static double getDiff(const Time &start, const Time &end);
14+
static Time getTimeNow();
15+
unsigned int sec;
16+
unsigned int nsec;
17+
};
18+
19+
} // namespace amcl_3d

src/mcl.cpp

+39-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "amcl_3d/mcl.hpp"
22
#include "amcl_3d/measurement_model/lidar_measurement_model.hpp"
3+
#include "amcl_3d/measurement_model/ndt_pose_measurement_model.hpp"
34
#include "amcl_3d/resample_noise/normal_distribution.hpp"
45

56
namespace amcl_3d
@@ -33,8 +34,9 @@ bool Amcl::getParticles(std::shared_ptr<const Particles> &particles_ptr)
3334
return true;
3435
}
3536

36-
bool Amcl::measureLidar(const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement)
37+
bool Amcl::measureLidar(const Time &time, const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement)
3738
{
39+
#if 0
3840
if (kd_map_ptr_ == nullptr || measuement == nullptr)
3941
return false;
4042
MeasurementState measurement_state;
@@ -43,8 +45,25 @@ bool Amcl::measureLidar(const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement)
4345
const double sigma = 1.0;
4446
std::shared_ptr<MeasurementModelInterface> model =
4547
std::make_shared<LidarMeasurementModel>(kd_map_ptr_, measuement, random_sample_num, max_dist, sigma);
46-
pf_ptr_->measure(model, measurement_state);
48+
pf_ptr_->measure(model, time, measurement_state);
4749

50+
checkResample(measurement_state);
51+
#endif
52+
return true;
53+
}
54+
55+
bool Amcl::measureNdtPose(std::shared_ptr<const Particles> particles_ptr, const Position &position, const Quat &quat, const PoseCovariance &covariance)
56+
{
57+
MeasurementState measurement_state;
58+
std::shared_ptr<MeasurementModelInterface> model =
59+
std::make_shared<NdtPoseMeasurementModel>(position, quat, covariance);
60+
pf_ptr_->measure(particles_ptr, model, measurement_state);
61+
checkResample(measurement_state);
62+
return true;
63+
}
64+
65+
bool Amcl::checkResample(const MeasurementState &measurement_state)
66+
{
4867
param_.augmented_mcl.w_fast =
4968
param_.augmented_mcl.w_fast +
5069
param_.augmented_mcl.alpha_fast * (measurement_state.raw_weight_avg - param_.augmented_mcl.w_fast);
@@ -78,18 +97,28 @@ bool Amcl::measureLidar(const pcl::PointCloud<pcl::PointXYZ>::Ptr measuement)
7897
std::make_shared<NormalDistribution>(/*avg*/ 0.0, /*var*/ param_.augmented_mcl.noise_pitch_var);
7998
std::shared_ptr<ResampleNoiseInterface> yaw_noise_ptr =
8099
std::make_shared<NormalDistribution>(/*avg*/ 0.0, /*var*/ param_.augmented_mcl.noise_yaw_var);
81-
ParticleFilterInterface::NoiseGenerators
100+
ParticleFilter::NoiseGenerators
82101
noise_gens(x_noise_ptr, y_noise_ptr, z_noise_ptr, roll_noise_ptr, pitch_noise_ptr, yaw_noise_ptr);
83102
// pf_ptr_->resample(pf_ptr_->getParticleNum(), 0.3, noise_gens); // random resample
84103
// pf_ptr_->resample(pf_ptr_->getParticleNum(), random_sampling_ratio, noise_gens); // random resample
85104
pf_ptr_->resample(param_.kld_sampling, random_sampling_ratio, noise_gens); // random resample and kld sample
86105
}
87-
return true;
88106
}
89107

90108
bool Amcl::predict(std::shared_ptr<PredictionModelInterface> model)
91109
{
92-
pf_ptr_->predict(model);
110+
return predict(model, Time::getTimeNow());
111+
}
112+
113+
bool Amcl::predict(std::shared_ptr<PredictionModelInterface> model, const Time &time)
114+
{
115+
pf_ptr_->predict(model, time);
116+
return true;
117+
}
118+
119+
bool Amcl::predict(std::shared_ptr<Particles> particles_ptr, std::shared_ptr<PredictionModelInterface> model, const Time &time)
120+
{
121+
pf_ptr_->predict(particles_ptr, model, time);
93122
return true;
94123
}
95124

@@ -112,18 +141,19 @@ bool Amcl::setInitialPose(const Position &position, const Quat &quat, const Pose
112141
std::make_shared<NormalDistribution>(/*avg*/ 0.0, /*var*/ covariance(4, 4));
113142
std::shared_ptr<ResampleNoiseInterface> yaw_noise_ptr =
114143
std::make_shared<NormalDistribution>(/*avg*/ 0.0, /*var*/ covariance(5, 5));
115-
ParticleFilterInterface::NoiseGenerators
144+
ParticleFilter::NoiseGenerators
116145
noise_gens(x_noise_ptr, y_noise_ptr, z_noise_ptr, roll_noise_ptr, pitch_noise_ptr, yaw_noise_ptr);
117146
return pf_ptr_->init(position, quat, noise_gens, particle_num);
118147
}
119148

120-
State Amcl::getMMSE(){
149+
State Amcl::getMMSE()
150+
{
121151
return pf_ptr_->getMMSE();
122152
}
123153

124-
State Amcl::getMAP(){
154+
State Amcl::getMAP()
155+
{
125156
return pf_ptr_->getMAP();
126157
}
127158

128-
129159
} // namespace amcl_3d

0 commit comments

Comments
 (0)