Skip to content

Commit 7f1e297

Browse files
authored
Merge branch 'master' into doc/longitudinal-control
2 parents 1637e50 + 18af677 commit 7f1e297

File tree

16 files changed

+309
-2
lines changed

16 files changed

+309
-2
lines changed

docs/developer_guide/Communication.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
| `/perception/object_recognition/ground_truth/objects` | [`autoware_auto_perception_msgs/msg/TrackedObjects`](https://github.com/tier4/autoware_auto_msgs/blob/tier4/main/autoware_auto_perception_msgs/msg/TrackedObjects.idl) | [Simulated by simple_sensor_simulator](https://tier4.github.io/scenario_simulator_v2-docs/developer_guide/SimpleSensorSimulator/#object-detection-results-simulation) |
3737
| `/perception/obstacle_segmentation/pointcloud` | [`sensor_msgs/msg/PointCloud2`](https://github.com/ros2/common_interfaces/blob/master/sensor_msgs/msg/PointCloud2.msg) | [Simulated by simple_sensor_simulator](https://tier4.github.io/scenario_simulator_v2-docs/developer_guide/SimpleSensorSimulator/#lidar-simulation) |
3838
| `/perception/occupancy_grid_map/map` | [`nav_msgs/msg/OccupancyGrid`](https://github.com/ros2/common_interfaces/blob/master/nav_msgs/msg/OccupancyGrid.msg) | [Simulated by simple_sensor_simulator](https://tier4.github.io/scenario_simulator_v2-docs/developer_guide/SimpleSensorSimulator/#occupancy-grid-sensor-simulation) |
39+
| `/sensing/imu/imu_data` | [`sensor_msgs/msg/Imu`](https://github.com/ros2/common_interfaces/blob/master/sensor_msgs/msg/Imu.msg) | |
3940
| `/perception/traffic_light_recognition/traffic_signals` | [`autoware_auto_perception_msgs/msg/TrafficSignalArray`](https://github.com/tier4/autoware_auto_msgs/blob/tier4/main/autoware_auto_perception_msgs/msg/TrafficSignalArray.idl) | for `architecture_type` equal to `awf/universe` |
4041
| `/perception/traffic_light_recognition/internal/traffic_signals` | [`autoware_perception_msgs/msg/TrafficSignalArray`](https://github.com/autowarefoundation/autoware_msgs/blob/main/autoware_perception_msgs/msg/TrafficSignalArray.msg) | for `architecture_type` greater or equal to `awf/universe/20230906` |
4142
| `/perception/traffic_light_recognition/external/traffic_signals` | [`autoware_perception_msgs/msg/TrafficSignalArray`](https://github.com/autowarefoundation/autoware_msgs/blob/main/autoware_perception_msgs/msg/TrafficSignalArray.msg) | |

openscenario/openscenario_interpreter/include/openscenario_interpreter/simulator_core.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,19 @@ class SimulatorCore
334334
}());
335335

336336
if (controller.isAutoware()) {
337+
core->attachImuSensor(entity_ref, [&]() {
338+
simulation_api_schema::ImuSensorConfiguration configuration;
339+
configuration.set_entity(entity_ref);
340+
configuration.set_frame_id("tamagawa/imu_link");
341+
configuration.set_add_gravity(true);
342+
configuration.set_use_seed(true);
343+
configuration.set_seed(0);
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);
347+
return configuration;
348+
}());
349+
337350
core->attachLidarSensor([&]() {
338351
simulation_api_schema::LidarConfiguration configuration;
339352

simulation/simple_sensor_simulator/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ include_directories(
3535
ament_auto_add_library(simple_sensor_simulator_component SHARED
3636
src/sensor_simulation/detection_sensor/detection_sensor.cpp
3737
src/sensor_simulation/lidar/lidar_sensor.cpp
38+
src/sensor_simulation/imu/imu_sensor.cpp
3839
src/sensor_simulation/lidar/raycaster.cpp
3940
src/sensor_simulation/occupancy_grid/occupancy_grid_sensor.cpp
4041
src/sensor_simulation/occupancy_grid/occupancy_grid_builder.cpp
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// Copyright 2024 TIER IV, Inc. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef SIMPLE_SENSOR_SIMULATOR__SENSOR_SIMULATION__IMU_SENSOR_HPP_
16+
#define SIMPLE_SENSOR_SIMULATOR__SENSOR_SIMULATION__IMU_SENSOR_HPP_
17+
18+
#include <simulation_api_schema.pb.h>
19+
20+
#include <array>
21+
#include <geometry_msgs/msg/accel.hpp>
22+
#include <geometry_msgs/msg/twist.hpp>
23+
#include <random>
24+
#include <rclcpp/rclcpp.hpp>
25+
#include <sensor_msgs/msg/imu.hpp>
26+
#include <simulation_interface/conversions.hpp>
27+
#include <traffic_simulator_msgs/msg/entity_status.hpp>
28+
29+
namespace simple_sensor_simulator
30+
{
31+
class ImuSensorBase
32+
{
33+
public:
34+
explicit ImuSensorBase(const simulation_api_schema::ImuSensorConfiguration & configuration)
35+
: add_gravity_(configuration.add_gravity()),
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()),
39+
random_generator_(configuration.use_seed() ? configuration.seed() : std::random_device{}()),
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_))
46+
{
47+
}
48+
49+
virtual ~ImuSensorBase() = default;
50+
51+
virtual auto update(
52+
const rclcpp::Time & current_ros_time,
53+
const std::vector<traffic_simulator_msgs::EntityStatus> & statuses) const -> bool = 0;
54+
55+
protected:
56+
const bool add_gravity_;
57+
const double noise_standard_deviation_orientation_;
58+
const double noise_standard_deviation_twist_;
59+
const double noise_standard_deviation_acceleration_;
60+
mutable std::mt19937 random_generator_;
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+
};
72+
};
73+
74+
template <typename MessageType>
75+
class ImuSensor : public ImuSensorBase
76+
{
77+
public:
78+
explicit ImuSensor(
79+
const simulation_api_schema::ImuSensorConfiguration & configuration,
80+
const typename rclcpp::Publisher<MessageType>::SharedPtr & publisher)
81+
: ImuSensorBase(configuration),
82+
entity_name_(configuration.entity()),
83+
frame_id_(configuration.frame_id()),
84+
publisher_(publisher)
85+
{
86+
}
87+
88+
auto update(
89+
const rclcpp::Time & current_ros_time,
90+
const std::vector<traffic_simulator_msgs::EntityStatus> & statuses) const -> bool override
91+
{
92+
for (const auto & status : statuses) {
93+
if (status.name() == entity_name_) {
94+
traffic_simulator_msgs::msg::EntityStatus status_msg;
95+
simulation_interface::toMsg(status, status_msg);
96+
publisher_->publish(generateMessage(current_ros_time, status_msg));
97+
return true;
98+
}
99+
}
100+
return false;
101+
}
102+
103+
private:
104+
auto generateMessage(
105+
const rclcpp::Time & current_ros_time,
106+
const traffic_simulator_msgs::msg::EntityStatus & status) const -> const MessageType;
107+
108+
const std::string entity_name_;
109+
const std::string frame_id_;
110+
const typename rclcpp::Publisher<MessageType>::SharedPtr publisher_;
111+
};
112+
} // namespace simple_sensor_simulator
113+
#endif // SIMPLE_SENSOR_SIMULATOR__SENSOR_SIMULATION__IMU_SENSOR_HPP_

simulation/simple_sensor_simulator/include/simple_sensor_simulator/sensor_simulation/sensor_simulation.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <memory>
2626
#include <rclcpp/rclcpp.hpp>
2727
#include <simple_sensor_simulator/sensor_simulation/detection_sensor/detection_sensor.hpp>
28+
#include <simple_sensor_simulator/sensor_simulation/imu/imu_sensor.hpp>
2829
#include <simple_sensor_simulator/sensor_simulation/lidar/lidar_sensor.hpp>
2930
#include <simple_sensor_simulator/sensor_simulation/occupancy_grid/occupancy_grid_sensor.hpp>
3031
#include <simple_sensor_simulator/sensor_simulation/traffic_lights/traffic_lights_detector.hpp>
@@ -114,12 +115,22 @@ class SensorSimulation
114115
}
115116
}
116117

118+
auto attachImuSensor(
119+
const double /*current_simulation_time*/,
120+
const simulation_api_schema::ImuSensorConfiguration & configuration, rclcpp::Node & node)
121+
-> void
122+
{
123+
imu_sensors_.push_back(std::make_unique<ImuSensor<sensor_msgs::msg::Imu>>(
124+
configuration, node.create_publisher<sensor_msgs::msg::Imu>("/sensing/imu/imu_data", 1)));
125+
}
126+
117127
auto updateSensorFrame(
118128
double current_simulation_time, const rclcpp::Time & current_ros_time,
119129
const std::vector<traffic_simulator_msgs::EntityStatus> &,
120130
const simulation_api_schema::UpdateTrafficLightsRequest &) -> void;
121131

122132
private:
133+
std::vector<std::unique_ptr<ImuSensorBase>> imu_sensors_;
123134
std::vector<std::unique_ptr<LidarSensorBase>> lidar_sensors_;
124135
std::vector<std::unique_ptr<DetectionSensorBase>> detection_sensors_;
125136
std::vector<std::unique_ptr<OccupancyGridSensorBase>> occupancy_grid_sensors_;

simulation/simple_sensor_simulator/include/simple_sensor_simulator/simple_sensor_simulator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ class ScenarioSimulator : public rclcpp::Node
119119
auto despawnEntity(const simulation_api_schema::DespawnEntityRequest &)
120120
-> simulation_api_schema::DespawnEntityResponse;
121121

122+
auto attachImuSensor(const simulation_api_schema::AttachImuSensorRequest &)
123+
-> simulation_api_schema::AttachImuSensorResponse;
124+
122125
auto attachDetectionSensor(const simulation_api_schema::AttachDetectionSensorRequest &)
123126
-> simulation_api_schema::AttachDetectionSensorResponse;
124127

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Copyright 2024 TIER IV, Inc. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <tf2/LinearMath/Matrix3x3.h>
16+
#include <tf2/LinearMath/Quaternion.h>
17+
#include <tf2/LinearMath/Transform.h>
18+
19+
#include <algorithm>
20+
#include <geometry/quaternion/euler_to_quaternion.hpp>
21+
#include <geometry/quaternion/quaternion_to_euler.hpp>
22+
#include <simple_sensor_simulator/sensor_simulation/imu/imu_sensor.hpp>
23+
24+
namespace simple_sensor_simulator
25+
{
26+
template <>
27+
auto ImuSensor<sensor_msgs::msg::Imu>::generateMessage(
28+
const rclcpp::Time & current_ros_time,
29+
const traffic_simulator_msgs::msg::EntityStatus & status) const -> const sensor_msgs::msg::Imu
30+
{
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+
};
37+
38+
auto imu_msg = sensor_msgs::msg::Imu();
39+
imu_msg.header.stamp = current_ros_time;
40+
imu_msg.header.frame_id = frame_id_;
41+
42+
auto orientation_rpy = math::geometry::convertQuaternionToEulerAngle(status.pose.orientation);
43+
auto twist = status.action_status.twist;
44+
auto accel = status.action_status.accel;
45+
46+
// Apply noise
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_);
55+
}
56+
57+
// Apply gravity
58+
if (add_gravity_) {
59+
tf2::Quaternion orientation_quaternion;
60+
orientation_quaternion.setRPY(orientation_rpy.x, orientation_rpy.y, orientation_rpy.z);
61+
tf2::Matrix3x3 rotation_matrix(orientation_quaternion);
62+
tf2::Vector3 gravity(0.0, 0.0, -9.81);
63+
tf2::Vector3 transformed_gravity = rotation_matrix * gravity;
64+
accel.linear.x += transformed_gravity.x();
65+
accel.linear.y += transformed_gravity.y();
66+
accel.linear.z += transformed_gravity.z();
67+
}
68+
69+
// Set data
70+
imu_msg.orientation = math::geometry::convertEulerAngleToQuaternion(orientation_rpy);
71+
imu_msg.angular_velocity.x = twist.angular.x;
72+
imu_msg.angular_velocity.y = twist.angular.y;
73+
imu_msg.angular_velocity.z = twist.angular.z;
74+
imu_msg.linear_acceleration.x = accel.linear.x;
75+
imu_msg.linear_acceleration.y = accel.linear.y;
76+
imu_msg.linear_acceleration.z = accel.linear.z;
77+
78+
// Set covariance
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());
88+
return imu_msg;
89+
}
90+
} // namespace simple_sensor_simulator

simulation/simple_sensor_simulator/src/sensor_simulation/sensor_simulation.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@ auto SensorSimulation::updateSensorFrame(
2424
const std::vector<traffic_simulator_msgs::EntityStatus> & entities,
2525
const simulation_api_schema::UpdateTrafficLightsRequest & update_traffic_lights_request) -> void
2626
{
27-
std::vector<std::string> lidar_detected_objects = {};
27+
for (auto & sensor : imu_sensors_) {
28+
sensor->update(current_ros_time, entities);
29+
}
2830

31+
std::vector<std::string> lidar_detected_objects = {};
2932
for (auto & sensor : lidar_sensors_) {
3033
sensor->update(current_simulation_time, entities, current_ros_time);
3134
for (const auto & object : sensor->getDetectedObjects()) {

simulation/simple_sensor_simulator/src/simple_sensor_simulator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ ScenarioSimulator::ScenarioSimulator(const rclcpp::NodeOptions & options)
3838
[this](auto &&... xs) { return spawnMiscObjectEntity(std::forward<decltype(xs)>(xs)...); },
3939
[this](auto &&... xs) { return despawnEntity(std::forward<decltype(xs)>(xs)...); },
4040
[this](auto &&... xs) { return updateEntityStatus(std::forward<decltype(xs)>(xs)...); },
41+
[this](auto &&... xs) { return attachImuSensor(std::forward<decltype(xs)>(xs)...); },
4142
[this](auto &&... xs) { return attachLidarSensor(std::forward<decltype(xs)>(xs)...); },
4243
[this](auto &&... xs) { return attachDetectionSensor(std::forward<decltype(xs)>(xs)...); },
4344
[this](auto &&... xs) { return attachOccupancyGridSensor(std::forward<decltype(xs)>(xs)...); },
@@ -298,6 +299,15 @@ auto ScenarioSimulator::despawnEntity(const simulation_api_schema::DespawnEntity
298299
return res;
299300
}
300301

302+
auto ScenarioSimulator::attachImuSensor(const simulation_api_schema::AttachImuSensorRequest & req)
303+
-> simulation_api_schema::AttachImuSensorResponse
304+
{
305+
sensor_sim_.attachImuSensor(current_simulation_time_, req.configuration(), *this);
306+
auto res = simulation_api_schema::AttachImuSensorResponse();
307+
res.mutable_result()->set_success(true);
308+
return res;
309+
}
310+
301311
auto ScenarioSimulator::attachDetectionSensor(
302312
const simulation_api_schema::AttachDetectionSensorRequest & req)
303313
-> simulation_api_schema::AttachDetectionSensorResponse

simulation/simulation_interface/include/simulation_interface/zmq_multi_client.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class MultiClient
6767
auto call(const simulation_api_schema::UpdateEntityStatusRequest &)
6868
-> simulation_api_schema::UpdateEntityStatusResponse;
6969

70+
auto call(const simulation_api_schema::AttachImuSensorRequest &)
71+
-> simulation_api_schema::AttachImuSensorResponse;
72+
7073
auto call(const simulation_api_schema::AttachLidarSensorRequest &)
7174
-> simulation_api_schema::AttachLidarSensorResponse;
7275

0 commit comments

Comments
 (0)