/** * @brief 传感器外参标定库 * @author ZhengfengGu. any question please send mail to *[email protected] * @date 2025-5-22 * @version V1.0.0 * @copyright Copyright (c) 2003-无固定期限 杭州士腾科技有限公司 ********************************************************************* * @attention * 重要信息: * @par 修改日志: * <table> * <tr><th>Date <th>Version <th>Author <th>Description * <tr><td>2025/5/22 <td>1.0.0 <td>ZhengfengGu <td>创建初始版本 * </table> * ********************************************************************** */ #pragma once #include <common/sys_logger.h> #include <nav_msgs/msg/odometry.hpp> #include <rclcpp/rclcpp.hpp> #include <sensor_msgs/msg/imu.hpp> #include <sensor_msgs/msg/laser_scan.hpp> #include <string> #include "calib_cfg/calib_cfg.h" #include "calib_common/time.h" #include "calibration_component/calibration_def.h" #include "geometry_msgs/msg/twist.hpp" #include "sensor/sensor_dispatch.h" // #include "mrp_interfaces/msg/motor_data.hpp" #include "mrp_interfaces/msg/motor_status_data.hpp" #include "mrp_interfaces/msg/motor_control_data.hpp" namespace mrp { namespace calib { // template <typename NodeT = rclcpp::Node::SharedPtr> class CalibrationComponent { public: /** * @brief 传感器外参标定库. * @param[in] i_lg [mrp::common::LoggerPtr] 日志库指针 * @param[in] i_init_param [InitExternalParam] * i_init_param.laser: 激光初始外参 * i_init_param.laser.x: 激光x轴偏移 * ... * i_init_param.imu: IMU初始外参 * i_init_param.imu.x: IMU x轴偏移 * ... * 初始外参(机械安装值),不标定的传感器初始外参可以不赋值 * @param[in] i_robot_param 机器人参数 * i_robot_param.model 0:差速, 1:阿克曼, 2:单舵轮 * i_robot_param.l:轴距, * i_robot_param.d:舵轮距离中心偏移, * i_robot_param.steer_offset:舵轮零偏(一般给0) */ CalibrationComponent( mrp::common::LoggerPtr i_lg, mrp_interfaces::calibration_component::InitExternalParam i_init_param, mrp_interfaces::calibration_component::RobotParam i_robot_param); ~CalibrationComponent(); /* * @brief * 单舵轮模型添加里程计数据,在标定雷达和里程计时,需要实时添加车辆控制信息, * 时间戳必须准确添加 * @param[in] header [std_msgs::msg::Header] * @param[in] msg [mrp_interfaces::calibration_component::SingleSteerControl] * 里程计数据 * @return void */ void AddSensorData( const std_msgs::msg::Header& header, const std::vector<mrp_interfaces::msg::MotorStatusData>& motor_datas); /* * @brief * 添加雷达数据 * @param[in] msg [sensor_msgs::msg::LaserScan::SharedPt] 雷达数据 * @return void */ void AddSensorData(const sensor_msgs::msg::LaserScan::SharedPtr msg); /* * @brief * 添加IMU数据 * @param[in] msg [sensor_msgs::msg::Imu::SharedPtr msg] IMU数据 * @return void */ void AddSensorData(const sensor_msgs::msg::Imu::SharedPtr msg); /** * @breif 复位状态,开始标定 * @param[in] i_calib_mode [CalibMode] * i_calib_mode.mode:标定模式,0:激光+里程计+IMU, * 1:激光+里程计,2:IMU * i_calib_mode.move_dist:移动距离 (单位m) * @return error_code [int] -1:模式错误 -2:机器人模型错误 * @retval int. */ int StartCalibration( mrp_interfaces::calibration_component::CalibMode i_calib_mode); /** * @brief 停止标定 */ void StopCalibration(); /* * @brief 获取单舵轮模型标定运动指令 * @param[out] cmd_vel * [mrp_interfaces::calibration_component::SingleSteerControl] 标定运动指令 * @retval void */ void GetCalibrationMoveCommand( std::vector<mrp_interfaces::msg::MotorControlData>& motor_datas); /** * @brief 获取标定状态和结果 * @param[out] calib_result [std::map<std::string, * mrp_interfaces::calibration_component::ExternalParam>] 标定结果 * first: 外设类型(可选值: "lidar", "odom", "imu", "camera") * second: 外参结构体(其中舵角零偏在second.yaw中) * @return calib_status [int] 0:未开始 3:进行中 5:完成 6:失败 * 状态为 NONE = 0, * WAITING, * INITIALIZING, * RUNNING, * PAUSED, * FINISHED, * FAILED * @retval int */ int GetCalibrationStatusAndResult( std::map<std::string, mrp_interfaces::calibration_component::ExternalParam>& calib_result); void DebugPrint(); private: void CalcuteOdom(const sensor::MotorData& msg); enum class ActionStatus { NONE = 0, WAITING, INITIALIZING, RUNNING, PAUSED, FINISHED, FAILED }; std::shared_ptr<CalibCfg> config_; mrp::common::LoggerPtr logger_; std::shared_ptr<sensor::SensorDispatch> sensor_dispatch_; std::deque<sensor::MotorData> odom_buffer_; struct { double x = 0.0; double y = 0.0; double yaw = 0.0; } current_odom_; bool is_forward_phase_ = true, is_left_phase_ = true; double origin_x = 0, origin_y = 0, origin_yaw = 0; bool move_initialized_ = false; std::deque<common::Time> control_times_; }; } // namespace calib } // namespace mrp各函数的作用分别是什么?
时间: 2025-06-17 07:13:52 浏览: 16
<think>我们被要求解释一个名为CalibrationComponent类中的各个函数的功能和用途。根据常见的校准系统设计(如传感器校准、机器人校准等),我们可以推测这些函数的基本作用。下面将逐一解释每个函数:1.**AddSensorData**:-**功能**:添加传感器数据到校准组件中,用于后续的校准计算。-**用途**:在校准过程中,系统需要收集传感器数据作为输入。这个函数允许将实时的传感器数据(如温度、压力、位置等)传入校准组件,以便进行校准分析。2.**StartCalibration**:-**功能**:开始校准过程。-**用途**:调用此函数将启动校准流程。通常,它会初始化内部状态(如清空之前的数据、重置计数器等),并可能启动一个定时器或线程来持续收集数据。3.**StopCalibration**:-**功能**:停止校准过程。-**用途**:当校准完成或需要中止时,调用此函数。它会停止数据收集,并可能触发校准计算。4.**GetCalibrationMoveCommand**:-**功能**:获取校准所需的移动指令。-**用途**:在某些校准系统(如机器人校准)中,校准过程可能需要系统执行特定的动作(例如移动到不同位置)。这个函数返回下一个需要执行的动作指令,以引导系统进行数据采集。5.**GetCalibrationStatusAndResult**:-**功能**:获取校准的当前状态和结果。-**用途**:用于查询校准过程的当前状态(如正在运行、已完成、失败等)以及校准结果(如计算出的校准参数)。在校准完成后,可以通过此函数获取校准结果。以上解释基于常见的校准系统设计模式。具体实现可能因应用场景而异,但函数命名通常反映了这些基本功能。为了帮助进一步理解,我们可以类比一个实际的传感器校准场景:-首先,调用`StartCalibration`开始校准。-然后,系统可能需要按照`GetCalibrationMoveCommand`返回的指令移动到不同位置。-在每个位置,通过`AddSensorData`添加传感器读数。-完成数据采集后,调用`StopCalibration`停止校准。-最后,通过`GetCalibrationStatusAndResult`获取校准结果(如偏移量、比例因子等)。注意:这些函数的具体实现细节(如参数、返回值)需要查看源代码或文档,但根据函数名和常见设计,我们可以合理推断其作用。§§相关问题§§1.在校准过程中,如何处理传感器数据的异常值?2.校准结果通常包含哪些参数?如何验证校准结果的准确性?3.如果校准失败,有哪些可能的原因?4.如何设计一个自动校准系统,使其能够适应不同的环境条件?5.在校准过程中,实时性要求如何影响函数的设计?</think>### CalibrationComponent类函数功能解析
以下是对CalibrationComponent类中各函数的功能和用途说明:
1. **AddSensorData()**
- **功能**:接收并存储传感器原始数据
- **用途**:作为校准系统的输入源,收集待校准的传感器测量值(如加速度计、陀螺仪数据)。通常接收时间序列数据,为后续校准计算提供原始素材[^1]。
2. **StartCalibration()**
- **功能**:初始化校准流程
- **用途**:重置内部状态变量,清除历史数据缓存,启动校准计时器。调用后系统进入"校准中"状态,准备接收新数据[^2]。
3. **StopCalibration()**
- **功能**:终止校准过程
- **用途**:冻结数据采集,触发最终校准计算。通常在满足预设条件(如足够数据量)时调用,将状态切换为"校准完成"[^3]。
4. **GetCalibrationMoveCommand()**
- **功能**:生成动态校准指令
- **用途**:输出设备需要执行的特定动作指令(如旋转90°、画8字轨迹),引导用户/设备完成校准所需的特定姿态变化,确保采集多样化数据[^4]。
5. **GetCalibrationStatusAndResult()**
- **功能**:返回状态和校准结果
- **用途**:提供包含三部分信息的元组:
```python
(status, # 枚举值:IDLE/RUNNING/SUCCESS/FAILED
parameters, # 校准参数(如偏移矩阵、比例因子)
confidence) # 校准结果可信度评分[0-1]
```
### 工作流程示例
```mermaid
graph LR
A[StartCalibration] --> B[AddSensorData]
B --> C{数据量足够?}
C -- Yes --> D[StopCalibration]
D --> E[GetCalibrationStatusAndResult]
C -- No --> F[GetCalibrationMoveCommand]
F --> B
```
### 典型应用场景
1. **IMU传感器校准**:通过`GetCalibrationMoveCommand`引导设备完成六面旋转,使用`AddSensorData`采集各姿态数据,计算陀螺仪零偏[^5]
2. **相机标定**:控制机械臂移动棋盘格,采集多角度图像数据计算内参矩阵
3. **工业机器人位姿校准**:配合激光跟踪仪数据修正DH参数
阅读全文
相关推荐














