23#include <Eigen/Geometry>
24#include <hardware_interface/hardware_info.hpp>
25#include <rclcpp/rclcpp.hpp>
27#include "mujoco_ros2_control/data.hpp"
40inline std::optional<hardware_interface::ComponentInfo>
43 for (
size_t sensor_index = 0; sensor_index < hardware_info.
sensors.size(); sensor_index++)
45 const auto& sensor = hardware_info.
sensors.at(sensor_index);
46 if (hardware_info.
sensors.at(sensor_index).name == name)
59 const std::string& default_value)
76 if (value !=
"gaussian" && value !=
"uniform")
78 RCLCPP_WARN(rclcpp::get_logger(
"mujoco_ros2_control"),
79 "Only noise distributions of 'gaussian' or 'uniform' are allowed, but you selected '%s'. "
80 "Defaulting to 'gaussian'.",
83 return value ==
"uniform" ? NoiseDistribution::kUniform : NoiseDistribution::kGaussian;
92 assert(covariance.size() == 9 &&
"covariance must be a flat 3x3 (9-element) matrix");
93 covariance[0] = covariance[4] = covariance[8] = stddev * stddev;
110 Eigen::Matrix<double, N, 1> samples;
111 if (distribution == NoiseDistribution::kUniform)
113 const double bound = stddev * std::sqrt(3.0);
114 std::uniform_real_distribution<double> dist(-bound, bound);
115 for (
int i = 0; i < N; ++i)
117 samples[i] = dist(rng);
122 std::normal_distribution<double> dist(0.0, stddev);
123 for (
int i = 0; i < N; ++i)
125 samples[i] = dist(rng);
172inline void add_sensor_noise(Eigen::Quaterniond& value,
double stddev, NoiseState& noise)
Eigen::Matrix< double, N, 1 > sample_noise(double stddev, NoiseDistribution distribution, std::mt19937 &rng)
Fills an N-vector with independent zero-mean noise samples of the given standard deviation and shape,...
Definition utils.hpp:108
void add_sensor_noise(Eigen::Vector3d &value, double stddev, NoiseDistribution distribution, std::mt19937 &rng)
Adds zero-mean noise, independently sampled per axis, to a 3D vector in place. No-op if stddev is not...
Definition utils.hpp:137
std::optional< hardware_interface::ComponentInfo > get_sensor_from_info(const hardware_interface::HardwareInfo &hardware_info, const std::string &name)
Returns the sensor's component info for the provided sensor name, if it exists.
Definition utils.hpp:41
void set_diagonal_covariance(std::vector< double > &covariance, double stddev)
Sets a flat, row-major 3x3 covariance's diagonal to stddev * stddev, leaving off-diagonal terms untou...
Definition utils.hpp:90
NoiseDistribution
Definition data.hpp:206
NoiseDistribution get_noise_distribution(const hardware_interface::ComponentInfo &sensor)
Reads the sensor's noise_distribution parameter ("gaussian" (default) or "uniform")....
Definition utils.hpp:73
std::string get_sensor_parameter_or(const hardware_interface::ComponentInfo &sensor, const std::string &key, const std::string &default_value)
Returns the value of a sensor-level <param> (from the sensor's own ComponentInfo),...
Definition utils.hpp:58
Definition hardware_info.hpp:88
std::unordered_map< std::string, std::string > parameters
(Optional) Key-value pairs of component parameters, e.g. min/max values or serial number.
Definition hardware_info.hpp:111
This structure stores information about hardware defined in a robot's URDF.
Definition hardware_info.hpp:373
std::vector< ComponentInfo > sensors
Definition hardware_info.hpp:403