/* * Copyright 2018 The Cartographer Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Text.Json.Serialization; namespace CartographerSharp.Models.Mapping; /// /// Protocol buffer representation of pose extrapolator options. /// public struct PoseExtrapolatorOptions { [JsonPropertyName("use_imu_based")] public bool UseImuBased { get; set; } [JsonPropertyName("constant_velocity")] public ConstantVelocityPoseExtrapolatorOptions ConstantVelocity { get; set; } [JsonPropertyName("imu_based")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public ImuBasedPoseExtrapolatorOptions? ImuBased { get; set; } /// /// Velocity threshold for detecting robot movement (m/s). /// Robot is considered "moving" if horizontal velocity exceeds this threshold. /// Default: 0.003 m/s (3 mm/s) /// [JsonPropertyName("velocity_threshold")] public double? VelocityThreshold { get; set; } /// /// Acceleration threshold for detecting IMU acceleration (m/s²). /// IMU is considered "accelerating" if horizontal acceleration exceeds this threshold. /// Default: 0.4 m/s² /// [JsonPropertyName("acceleration_threshold")] public double? AccelerationThreshold { get; set; } /// /// Gravity deviation threshold for detecting vertical acceleration changes (m/s²). /// Used to detect changes in vertical acceleration (gravity deviation). /// Default: 0.1 m/s² /// [JsonPropertyName("gravity_deviation_threshold")] public double? GravityDeviationThreshold { get; set; } /// /// If true, use odometry pose directly at the time of range data instead of calculating velocity. /// This is useful when odometry data is accurate and reliable. /// When enabled, ExtrapolatePose will use the latest odometry data at or before the requested time, /// instead of extrapolating from the last pose using calculated velocity. /// Default: false (use velocity-based extrapolation) /// [JsonPropertyName("use_odometry_directly")] public bool UseOdometryDirectly { get; set; } public PoseExtrapolatorOptions( bool useImuBased = false, ConstantVelocityPoseExtrapolatorOptions? constantVelocity = null, ImuBasedPoseExtrapolatorOptions? imuBased = null, double? velocityThreshold = null, double? accelerationThreshold = null, double? gravityDeviationThreshold = null, bool useOdometryDirectly = false) { UseImuBased = useImuBased; ConstantVelocity = constantVelocity ?? new ConstantVelocityPoseExtrapolatorOptions(); ImuBased = imuBased; VelocityThreshold = velocityThreshold; AccelerationThreshold = accelerationThreshold; GravityDeviationThreshold = gravityDeviationThreshold; UseOdometryDirectly = useOdometryDirectly; } } /// /// Constant velocity pose extrapolator options. /// public struct ConstantVelocityPoseExtrapolatorOptions { /// /// Time constant in seconds for the orientation moving average based on /// observed gravity via the IMU. /// [JsonPropertyName("imu_gravity_time_constant")] public double ImuGravityTimeConstant { get; set; } [JsonPropertyName("pose_queue_duration")] public double PoseQueueDuration { get; set; } public ConstantVelocityPoseExtrapolatorOptions( double imuGravityTimeConstant = 10.0, double poseQueueDuration = 0.001) { ImuGravityTimeConstant = imuGravityTimeConstant; PoseQueueDuration = poseQueueDuration; } }