15 #ifndef SIMPLE_SENSOR_SIMULATOR__SENSOR_SIMULATION__LIDAR__RAYCASTER_HPP_
16 #define SIMPLE_SENSOR_SIMULATOR__SENSOR_SIMULATION__LIDAR__RAYCASTER_HPP_
18 #include <embree4/rtcore.h>
19 #include <pcl_conversions/pcl_conversions.h>
23 #include <geometry_msgs/msg/pose.hpp>
55 pcl::PointCloud<pcl::PointXYZI>::Ptr
cloud;
66 std::set<std::string> detected_entity_names;
70 return detected_entity_names;
76 double max_distance = 300,
double min_distance = 0);
78 const simulation_api_schema::LidarConfiguration & configuration,
79 double horizontal_angle_start = 0,
double horizontal_angle_end = 2 * M_PI);
82 std::vector<geometry_msgs::msg::Quaternion> getDirections(
83 const std::vector<double> & vertical_angles,
double horizontal_angle_start,
84 double horizontal_angle_end,
double horizontal_resolution);
85 std::vector<geometry_msgs::msg::Quaternion> directions_;
86 double previous_horizontal_angle_start_;
87 double previous_horizontal_angle_end_;
88 double previous_horizontal_resolution_;
89 std::vector<double> previous_vertical_angles_;
92 std::random_device seed_gen_;
93 std::default_random_engine engine_;
94 std::vector<Eigen::Matrix3d> rotation_matrices_;
98 std::vector<uint32_t> & point_geometry_ids,
double max_distance,
double min_distance)
101 for (
unsigned int i = 0; i < rotation_matrices_.size(); ++i) {
102 RTCRayHit rayhit = {};
103 rayhit.ray.org_x = origin.position.x;
104 rayhit.ray.org_y = origin.position.y;
105 rayhit.ray.org_z = origin.position.z;
107 rayhit.ray.mask = 0b11111111'11111111'11111111'11111111;
108 rayhit.ray.tfar = max_distance;
109 rayhit.ray.tnear = min_distance;
110 rayhit.ray.flags =
false;
112 const auto & ray_direction = rotation_matrices_.at(i);
113 const auto rotation_mat = orientation_matrix * ray_direction;
114 rayhit.ray.dir_x = rotation_mat(0);
115 rayhit.ray.dir_y = rotation_mat(1);
116 rayhit.ray.dir_z = rotation_mat(2);
117 rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
118 rtcIntersect1(scene_, &rayhit);
120 if (rayhit.hit.geomID != RTC_INVALID_GEOMETRY_ID) {
128 cloud->emplace_back(p);
129 point_geometry_ids.push_back(rayhit.hit.geomID);
Definition: raycaster.hpp:36
~Raycaster()
Definition: raycaster.cpp:55
Raycaster()
Definition: raycaster.cpp:45
void setDirection(const simulation_api_schema::LidarConfiguration &configuration, double horizontal_angle_start=0, double horizontal_angle_end=2 *M_PI)
Definition: raycaster.cpp:61
RaycastResult raycast(const geometry_msgs::msg::Pose &origin, std::vector< Entity > &entities, double max_distance=300, double min_distance=0)
Definition: raycaster.cpp:110
auto getRotationMatrix(T quat) -> Eigen::Matrix3d
Definition: get_rotation_matrix.hpp:33
Definition: constants.hpp:19
auto distance(const geometry_msgs::Pose &pose1, const geometry_msgs::Pose &pose2)
Definition: detection_sensor.cpp:44
geometry_msgs::msg::Pose Pose
Definition: lanelet_wrapper.hpp:66
std::string string
Definition: junit5.hpp:26
traffic_simulator_msgs::EntityStatus EntityStatus
Definition: helper_functions.hpp:32
Definition: raycaster.hpp:43
const traffic_simulator_msgs::EntityStatus & entity_status
Definition: raycaster.hpp:44
const std::string & name() const
Definition: raycaster.hpp:50
std::optional< uint32_t > geometry_id
Definition: raycaster.hpp:46
std::unique_ptr< primitives::Primitive > primitive
Definition: raycaster.hpp:45
Entity(const traffic_simulator_msgs::EntityStatus &status)
Definition: raycaster.cpp:26
Definition: raycaster.hpp:54
RaycastResult(const std::vector< Entity > &entities)
Definition: raycaster.hpp:59
std::set< std::string > getDetectedEntityNames() const
Definition: raycaster.hpp:64
const std::vector< Entity > & raycast_entities
Definition: raycaster.hpp:57
pcl::PointCloud< pcl::PointXYZI >::Ptr cloud
Definition: raycaster.hpp:55
std::vector< size_t > point_to_entity_index
Definition: raycaster.hpp:56