lidascan_ctrl.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // lidascan_ctrl.hpp
  2. #ifndef LIDAR_SCAN_CONTROLLER_HPP
  3. #define LIDAR_SCAN_CONTROLLER_HPP
  4. #include <rclcpp/rclcpp.hpp>
  5. #include <sensor_msgs/msg/laser_scan.hpp>
  6. #include <geometry_msgs/msg/twist.hpp>
  7. #include <visualization_msgs/msg/marker_array.hpp>
  8. #include "wheelchair_types.hpp"
  9. #include "recharge_tool.hpp"
  10. #include <map>
  11. #include <memory>
  12. #include <tuple>
  13. class LidarScanController
  14. {
  15. public:
  16. using LaserScan = sensor_msgs::msg::LaserScan;
  17. using LaserScanSharedPtr = sensor_msgs::msg::LaserScan::SharedPtr;
  18. LidarScanController(rclcpp::Node *node);
  19. ~LidarScanController();
  20. // 初始化
  21. void initialize();
  22. // 导航控制接口(外部调用)
  23. void startNavigation();
  24. void stopNavigation();
  25. void stopMotion();
  26. // 充电电压检测接口
  27. void setChargingVoltage(bool value);
  28. bool getChargingVoltage() const;
  29. // 状态查询
  30. bool isActive() const { return active_; }
  31. ChargingState getChargingState() const { return charging_state_; }
  32. private:
  33. rclcpp::Node *node_;
  34. // ROS2 订阅者和发布者
  35. rclcpp::Subscription<sensor_msgs::msg::LaserScan>::SharedPtr scan_sub_;
  36. rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr pub_ctrl_;
  37. rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr pub_rviz_;
  38. rclcpp::TimerBase::SharedPtr navigation_timer_;
  39. rclcpp::Publisher<sensor_msgs::msg::LaserScan>::SharedPtr pub_filtered_;
  40. rclcpp::Publisher<sensor_msgs::msg::LaserScan>::SharedPtr pub_line_;
  41. // 状态变量
  42. bool active_;
  43. ChargingState charging_state_;
  44. geometry_msgs::msg::Twist ctrl_twist_;
  45. rclcpp::Time ctrl_twist_time_;
  46. rclcpp::Time detect_station_time_;
  47. // 参数
  48. ScanFilterParam param_;
  49. double distance_threshold_;
  50. int fit_window_size_;
  51. double fit_residual_threshold_;
  52. int frame_index_;
  53. // 充电检测
  54. bool detect_charging_voltage_;
  55. rclcpp::Time detect_charging_voltage_time_;
  56. // ========== 核心算法函数 ==========
  57. // 激光数据处理
  58. void processLaserScan(const LaserScanSharedPtr &msg);
  59. bool processSegmentData(const LaserScanSharedPtr &msg, int begin_index, int end_index);
  60. void procData(RechargeResult &result);
  61. // 运动控制算法
  62. void controlRechargeMotion(const RechargeResult &result);
  63. // 过滤算法
  64. void filterScanModify0(LaserScanSharedPtr msg);
  65. void filterScanModify1(LaserScanSharedPtr msg);
  66. void filterScanModify2(LaserScanSharedPtr msg);
  67. void filterScanModify3(LaserScanSharedPtr msg);
  68. std::pair<int, int> filterScanModify4(LaserScanSharedPtr msg);
  69. // 坐标转换
  70. std::map<int, std::pair<double, double>> laserScanToXY(const LaserScanSharedPtr &scan_msg);
  71. std::map<int, std::pair<double, double>> laserScanToXY1(int begin_index, int end_index,
  72. const LaserScanSharedPtr &scan_msg);
  73. // 分段处理算法
  74. std::vector<std::pair<int, int>> getSections(
  75. int begin_index, int end_index,
  76. const LaserScanSharedPtr &msg,
  77. const std::map<int, std::pair<double, double>> &xy_list);
  78. std::map<int, std::tuple<int, int, double, double, double, double, double, int>>
  79. getSegments(const std::map<int, std::pair<double, double>> &xy_points_map);
  80. std::map<int, std::tuple<int, int, double, double, double, double, double, int>>
  81. filterSegments(const std::map<int, std::tuple<int, int, double, double, double, double, double, int>> &turn_segments);
  82. // 可视化
  83. void publishRechargeVisualization(const RechargeResult &result);
  84. // ========== 辅助函数 ==========
  85. void publishFilteredScan(const LaserScanSharedPtr &original_msg,
  86. const std::vector<float> &filtered_ranges);
  87. LaserScanSharedPtr resetLaserData(LaserScanSharedPtr msg, int b_index, int e_index);
  88. bool isValid(float value) const;
  89. int getFixedIndex(const LaserScanSharedPtr &msg, int i) const;
  90. int getFixed() const { return 0; }
  91. Eigen::MatrixXd getPointList(const std::vector<IndexPoint> &points);
  92. // 定时器回调
  93. void navigationTimerCallback();
  94. // 控制发布
  95. void publishControl();
  96. };
  97. #endif // LIDAR_SCAN_CONTROLLER_HPP