Skip to content

Commit 8ebd167

Browse files
feat: Enhance IMU sensor configuration and initialization
- Added frame_id to ImuSensorConfiguration - Separated noise standard deviations for orientation, twist, and acceleration - Updated ImuSensorBase and ImuSensor classes for new noise distributions
1 parent 5e795ef commit 8ebd167

File tree

4 files changed

+66
-34
lines changed

4 files changed

+66
-34
lines changed

openscenario/openscenario_interpreter/include/openscenario_interpreter/simulator_core.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,11 +337,13 @@ class SimulatorCore
337337
core->attachImuSensor(entity_ref, [&]() {
338338
simulation_api_schema::ImuSensorConfiguration configuration;
339339
configuration.set_entity(entity_ref);
340+
configuration.set_frame_id("tamagawa/imu_link");
340341
configuration.set_add_gravity(true);
341-
configuration.set_add_noise(false);
342342
configuration.set_use_seed(true);
343343
configuration.set_seed(0);
344-
configuration.set_noise_standard_deviation(0.01);
344+
configuration.set_noise_standard_deviation_orientation(0.01);
345+
configuration.set_noise_standard_deviation_twist(0.01);
346+
configuration.set_noise_standard_deviation_acceleration(0.01);
345347
return configuration;
346348
}());
347349

simulation/simple_sensor_simulator/include/simple_sensor_simulator/sensor_simulation/imu/imu_sensor.hpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <simulation_api_schema.pb.h>
1919

20+
#include <array>
2021
#include <geometry_msgs/msg/accel.hpp>
2122
#include <geometry_msgs/msg/twist.hpp>
2223
#include <random>
@@ -32,10 +33,16 @@ class ImuSensorBase
3233
public:
3334
explicit ImuSensorBase(const simulation_api_schema::ImuSensorConfiguration & configuration)
3435
: add_gravity_(configuration.add_gravity()),
35-
add_noise_(configuration.add_noise()),
36-
noise_standard_deviation_(add_noise_ ? configuration.noise_standard_deviation() : 0.0),
36+
noise_standard_deviation_orientation_(configuration.noise_standard_deviation_orientation()),
37+
noise_standard_deviation_twist_(configuration.noise_standard_deviation_twist()),
38+
noise_standard_deviation_acceleration_(configuration.noise_standard_deviation_acceleration()),
3739
random_generator_(configuration.use_seed() ? configuration.seed() : std::random_device{}()),
38-
noise_distribution_(0.0, noise_standard_deviation_)
40+
noise_distribution_orientation_(0.0, noise_standard_deviation_orientation_),
41+
noise_distribution_twist_(0.0, noise_standard_deviation_twist_),
42+
noise_distribution_acceleration_(0.0, noise_standard_deviation_acceleration_),
43+
orientation_covariance_(calculateCovariance(noise_standard_deviation_orientation_)),
44+
angular_velocity_covariance_(calculateCovariance(noise_standard_deviation_twist_)),
45+
linear_acceleration_covariance_(calculateCovariance(noise_standard_deviation_acceleration_))
3946
{
4047
}
4148

@@ -47,10 +54,21 @@ class ImuSensorBase
4754

4855
protected:
4956
const bool add_gravity_;
50-
const bool add_noise_;
51-
const double noise_standard_deviation_;
57+
const double noise_standard_deviation_orientation_;
58+
const double noise_standard_deviation_twist_;
59+
const double noise_standard_deviation_acceleration_;
5260
mutable std::mt19937 random_generator_;
53-
mutable std::normal_distribution<> noise_distribution_;
61+
mutable std::normal_distribution<> noise_distribution_orientation_;
62+
mutable std::normal_distribution<> noise_distribution_twist_;
63+
mutable std::normal_distribution<> noise_distribution_acceleration_;
64+
const std::array<double, 9> orientation_covariance_;
65+
const std::array<double, 9> angular_velocity_covariance_;
66+
const std::array<double, 9> linear_acceleration_covariance_;
67+
68+
auto calculateCovariance(const double stddev) const -> std::array<double, 9>
69+
{
70+
return {std::pow(stddev, 2), 0, 0, 0, std::pow(stddev, 2), 0, 0, 0, std::pow(stddev, 2)};
71+
};
5472
};
5573

5674
template <typename MessageType>
@@ -60,7 +78,10 @@ class ImuSensor : public ImuSensorBase
6078
explicit ImuSensor(
6179
const simulation_api_schema::ImuSensorConfiguration & configuration,
6280
const typename rclcpp::Publisher<MessageType>::SharedPtr & publisher)
63-
: ImuSensorBase(configuration), entity_name_(configuration.entity()), publisher_(publisher)
81+
: ImuSensorBase(configuration),
82+
entity_name_(configuration.entity()),
83+
frame_id_(configuration.frame_id()),
84+
publisher_(publisher)
6485
{
6586
}
6687

@@ -85,6 +106,7 @@ class ImuSensor : public ImuSensorBase
85106
const traffic_simulator_msgs::msg::EntityStatus & status) const -> const MessageType;
86107

87108
const std::string entity_name_;
109+
const std::string frame_id_;
88110
const typename rclcpp::Publisher<MessageType>::SharedPtr publisher_;
89111
};
90112
} // namespace simple_sensor_simulator

simulation/simple_sensor_simulator/src/sensor_simulation/imu/imu_sensor.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <tf2/LinearMath/Quaternion.h>
1717
#include <tf2/LinearMath/Transform.h>
1818

19+
#include <algorithm>
1920
#include <geometry/quaternion/euler_to_quaternion.hpp>
2021
#include <geometry/quaternion/quaternion_to_euler.hpp>
2122
#include <simple_sensor_simulator/sensor_simulation/imu/imu_sensor.hpp>
@@ -27,25 +28,30 @@ auto ImuSensor<sensor_msgs::msg::Imu>::generateMessage(
2728
const rclcpp::Time & current_ros_time,
2829
const traffic_simulator_msgs::msg::EntityStatus & status) const -> const sensor_msgs::msg::Imu
2930
{
30-
const auto applyNoise = [&](geometry_msgs::msg::Vector3 & v) {
31-
v.x += noise_distribution_(random_generator_);
32-
v.y += noise_distribution_(random_generator_);
33-
v.z += noise_distribution_(random_generator_);
34-
};
31+
const auto applyNoise =
32+
[&](geometry_msgs::msg::Vector3 & v, std::normal_distribution<> & distribution) {
33+
v.x += distribution(random_generator_);
34+
v.y += distribution(random_generator_);
35+
v.z += distribution(random_generator_);
36+
};
3537

3638
auto imu_msg = sensor_msgs::msg::Imu();
3739
imu_msg.header.stamp = current_ros_time;
38-
imu_msg.header.frame_id = "tamagawa/imu_link";
40+
imu_msg.header.frame_id = frame_id_;
3941

4042
auto orientation_rpy = math::geometry::convertQuaternionToEulerAngle(status.pose.orientation);
4143
auto twist = status.action_status.twist;
4244
auto accel = status.action_status.accel;
4345

4446
// Apply noise
45-
if (add_noise_) {
46-
applyNoise(orientation_rpy);
47-
applyNoise(twist.angular);
48-
applyNoise(accel.linear);
47+
if (noise_standard_deviation_orientation_ > 0.0) {
48+
applyNoise(orientation_rpy, noise_distribution_orientation_);
49+
}
50+
if (noise_standard_deviation_twist_ > 0.0) {
51+
applyNoise(twist.angular, noise_distribution_twist_);
52+
}
53+
if (noise_standard_deviation_acceleration_ > 0.0) {
54+
applyNoise(accel.linear, noise_distribution_acceleration_);
4955
}
5056

5157
// Apply gravity
@@ -70,15 +76,15 @@ auto ImuSensor<sensor_msgs::msg::Imu>::generateMessage(
7076
imu_msg.linear_acceleration.z = accel.linear.z;
7177

7278
// Set covariance
73-
imu_msg.orientation_covariance = {std::pow(noise_standard_deviation_, 2), 0, 0, 0,
74-
std::pow(noise_standard_deviation_, 2), 0, 0, 0,
75-
std::pow(noise_standard_deviation_, 2)};
76-
imu_msg.angular_velocity_covariance = {std::pow(noise_standard_deviation_, 2), 0, 0, 0,
77-
std::pow(noise_standard_deviation_, 2), 0, 0, 0,
78-
std::pow(noise_standard_deviation_, 2)};
79-
imu_msg.linear_acceleration_covariance = {std::pow(noise_standard_deviation_, 2), 0, 0, 0,
80-
std::pow(noise_standard_deviation_, 2), 0, 0, 0,
81-
std::pow(noise_standard_deviation_, 2)};
79+
std::copy(
80+
orientation_covariance_.begin(), orientation_covariance_.end(),
81+
imu_msg.orientation_covariance.data());
82+
std::copy(
83+
angular_velocity_covariance_.begin(), angular_velocity_covariance_.end(),
84+
imu_msg.angular_velocity_covariance.data());
85+
std::copy(
86+
linear_acceleration_covariance_.begin(), linear_acceleration_covariance_.end(),
87+
imu_msg.linear_acceleration_covariance.data());
8288
return imu_msg;
8389
}
8490
} // namespace simple_sensor_simulator

simulation/simulation_interface/proto/simulation_api_schema.proto

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ message PseudoTrafficLightDetectorConfiguration {
3737
* Parameter configuration of the imu sensor
3838
**/
3939
message ImuSensorConfiguration {
40-
string entity = 1; // Name of the entity which you want to attach imu.
41-
bool add_gravity = 2; // If true, gravity will be added to the acceleration vector
42-
bool add_noise = 3; // If true, noise will be added to every vector published
43-
bool use_seed = 4; // If true, as seed will be used the passed value, if not it will be random
44-
int32 seed = 5; // Seed for random number generator
45-
double noise_standard_deviation = 6; // Standard deviation for noise (normal distribution, mean equal to 0.0)
40+
string entity = 1; // Name of the entity which you want to attach imu.
41+
string frame_id = 2; // Frame ID for the IMU sensor
42+
bool add_gravity = 3; // If true, gravity will be added to the acceleration vector
43+
bool use_seed = 4; // If true, as seed will be used the passed value, if not it will be random
44+
int32 seed = 5; // Seed for random number generator
45+
double noise_standard_deviation_orientation = 6; // The standard deviation for orientation noise (normal distribution, mean = 0.0)
46+
double noise_standard_deviation_twist = 7; // The standard deviation for angular velocity noise (normal distribution, mean = 0.0)
47+
double noise_standard_deviation_acceleration = 8; // The standard deviation for linear acceleration noise (normal distribution, mean = 0.0)
4648
}
4749

4850
/**

0 commit comments

Comments
 (0)