Advertisement
Guest User

KalmanDetection.h

a guest
Jan 22nd, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.29 KB | None | 0 0
  1. #ifndef KALMAN_DETECTION_H
  2. #define KALMAN_DETECTION_H
  3.  
  4. #include "KalmanFilter.h"
  5. #include <pointcloud_filter/BrickDistanceParametersConfig.h>
  6. #include <ros/ros.h>
  7. #include <dynamic_reconfigure/server.h>
  8. #include <std_msgs/Float32.h>
  9.  
  10. #define NO_DISTANCE_DETECTED -1
  11. #define MAX_INVALID_TIME 2
  12.  
  13. typedef pointcloud_filter::BrickDistanceParametersConfig bdist_cfg;
  14. class KalmanDetection
  15. {
  16.  
  17. public:
  18.  
  19. KalmanDetection(std::string ns):
  20.     _bdistServer {_bdistMutex, ros::NodeHandle("kalman_ns/" + ns + "_config")},
  21.     _kalmanFilter {new KalmanFilter},
  22.     _kalmanInitialized {false},
  23.     _filteredDistance (NO_DISTANCE_DETECTED),
  24.     _filteredDistanceVel (0),
  25.     _timeInvalid (0),
  26.     _ns (ns)
  27. {
  28. }
  29.  
  30. ~KalmanDetection()
  31. {  
  32. }
  33.  
  34. void initializeParameters(ros::NodeHandle& nh)
  35. {
  36.     ROS_WARN("KalmanDetection::initializeParameters()");
  37.     // Setup dynamic reconfigure server
  38.  
  39.     double kalmanNoiseMv;
  40.     double kalmanNoisePos;
  41.     double kalmanNoiseVel;
  42.     bool initialized =
  43.         nh.getParam(_ns + "/kalman/noise_mv", kalmanNoiseMv) &&
  44.         nh.getParam(_ns + "/kalman/noise_pos", kalmanNoisePos) &&
  45.         nh.getParam(_ns + "/kalman/noise_vel", kalmanNoiseVel);
  46.  
  47.     _kalmanFilter->setMeasureNoise(kalmanNoiseMv);
  48.     _kalmanFilter->setPositionNoise(kalmanNoisePos);
  49.     _kalmanFilter->setVelocityNoise(kalmanNoiseVel);
  50.     ROS_INFO_STREAM(*_kalmanFilter);
  51.  
  52.     if (!initialized)
  53.     {
  54.         ROS_FATAL("KalmanDetection::initializeParameters() - parameter initialization failed.");
  55.         throw std::invalid_argument("KalmanDetection parameters not properly set.");
  56.     }
  57.  
  58.     bdist_cfg cfg;
  59.     cfg.noise_mv = kalmanNoiseMv;
  60.     cfg.noise_pos = kalmanNoisePos;
  61.     cfg.noise_vel = kalmanNoiseVel;
  62.    
  63.     _bdistServer.updateConfig(cfg);
  64.     _bdistParamCb = boost::bind(
  65.         &KalmanDetection::parametersCallback, this, _1, _2);
  66.     _bdistServer.setCallback(_bdistParamCb);
  67.  
  68.     // Initialize publisher
  69.     _filtDistPub = nh.advertise<std_msgs::Float32>("kalman/" + _ns + "/filtered", 1);
  70.     _filtDistVelPub = nh.advertise<std_msgs::Float32>("kalman/" + _ns + "/filtered_vel", 1);
  71. }
  72.  
  73. void parametersCallback(
  74.     bdist_cfg& configMsg,
  75.     uint32_t level)
  76. {
  77.     ROS_DEBUG("KalmanDetection::parametersCallback");
  78.     _kalmanFilter->setMeasureNoise(configMsg.noise_mv);
  79.     _kalmanFilter->setPositionNoise(configMsg.noise_pos);
  80.     _kalmanFilter->setVelocityNoise(configMsg.noise_vel);
  81.     ROS_INFO_STREAM(*_kalmanFilter);
  82. }
  83.  
  84. void filterCurrentDistance(double dt, double currDistance, bool newMeasurementFlag)
  85. {  
  86.     // Reset filtered distance if filter is not initialized
  87.     if (!_kalmanInitialized)
  88.     {
  89.         resetState();
  90.     }
  91.  
  92.     // Check if initialization failed
  93.     if (!_kalmanInitialized && currDistance == NO_DISTANCE_DETECTED)
  94.     {
  95.         ROS_WARN("KalmanFilter - Failed to initialize");
  96.         return;
  97.     }
  98.  
  99.     // Check if initialization should take place
  100.     if (!_kalmanInitialized && currDistance != NO_DISTANCE_DETECTED)
  101.     {
  102.         _kalmanInitialized = true;
  103.         _kalmanFilter->initializePosition(currDistance);
  104.         ROS_WARN("KalmanFilter - Initialized.");
  105.     }
  106.  
  107.     // Do model update
  108.     _kalmanFilter->modelUpdate(dt);
  109.  
  110.     // Do measure update if everything is valid
  111.     if (newMeasurementFlag &&currDistance != NO_DISTANCE_DETECTED)
  112.     {
  113.         // ROS_INFO("KalmanFilter - New measurement! update called");
  114.         _kalmanFilter->measureUpdate(currDistance);
  115.         _timeInvalid = 0;
  116.     }
  117.     else
  118.     {
  119.         // Increase time invalid
  120.         // ROS_WARN("KalmanFilter - doing only model update");
  121.         _timeInvalid += dt;
  122.     }
  123.  
  124.     // Check if invalid time reached maximum
  125.     if (_timeInvalid > MAX_INVALID_TIME)
  126.     {
  127.         resetState();
  128.         ROS_FATAL("KalmanFilter - Max invalid time reached.");
  129.         return;
  130.     }
  131.  
  132.     // Get kalman filter position and velocity
  133.     _filteredDistance = _kalmanFilter->getPosition();
  134.     _filteredDistanceVel = _kalmanFilter->getVelocity();
  135. }
  136.  
  137. void publish()
  138. {
  139.     std_msgs::Float32 distMsg;
  140.     distMsg.data = _filteredDistance;
  141.     _filtDistPub.publish(distMsg);
  142.  
  143.     std_msgs::Float32 velMsg;
  144.     velMsg.data = _filteredDistanceVel;
  145.     _filtDistVelPub.publish(velMsg);    
  146. }
  147.  
  148. void resetState()
  149. {
  150.     _kalmanInitialized = false;
  151.     _timeInvalid = 0;
  152.     _filteredDistance = NO_DISTANCE_DETECTED;
  153.     _filteredDistanceVel = 0;
  154. }
  155.  
  156. double getState()
  157. {
  158.     return _filteredDistance;
  159. }
  160.  
  161. double getStateVel()
  162. {
  163.     return _filteredDistanceVel;
  164. }
  165.  
  166. private:
  167.  
  168.     /** Define Dynamic Reconfigure parameters **/
  169.     boost::recursive_mutex _bdistMutex;
  170.     dynamic_reconfigure::Server<bdist_cfg> _bdistServer;
  171.     dynamic_reconfigure::Server<bdist_cfg>::CallbackType _bdistParamCb;
  172.        
  173.     /** Kalman filter object */
  174.     std::unique_ptr<KalmanFilter> _kalmanFilter;
  175.  
  176.     ros::Publisher _filtDistPub;
  177.     ros::Publisher _filtDistVelPub;
  178.  
  179.     /** Flag signaling that kalman filter is initialized. */
  180.     bool _kalmanInitialized;
  181.  
  182.     /** Filtered distance - Kalman Filter output */
  183.     double _filteredDistance;
  184.  
  185.     /** Filtered distance velocity - Kalman Filter output */
  186.     double _filteredDistanceVel;
  187.  
  188.     /** Time passed while measurements are invalid. */
  189.     double _timeInvalid;
  190.  
  191.     const std::string _ns;
  192. };
  193.  
  194. #endif /* KALMAN_DETECTION_H */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement