100 it->second(actor, control);
111 const double fractional = modf(timestamp, &integral);
112 const double multiplier = 1000000000.0;
113 _seconds =
static_cast<int32_t
>(integral);
114 _nanoseconds =
static_cast<uint32_t
>(fractional * multiplier);
127 it->second.push_back(parent);
144 it->second = ros_name;
153 return std::string(
"");
162 std::string parent_name;
163 for (
auto parent_it = it->second.cbegin(); parent_it != it->second.cend(); ++parent_it)
166 if (name == current_actor_name)
174 parent_name = name +
'/' + parent_name;
176 if (parent_name.back() ==
'/')
177 parent_name.pop_back();
181 return std::string(
"");
188 _controller = std::make_shared<CarlaEgoVehicleControlSubscriber>(actor, ros_name.c_str());
200 std::shared_ptr<CarlaPublisher> publisher {};
201 std::shared_ptr<CarlaTransformPublisher> transform {};
203 publisher = it_publishers->second;
205 transform = it_transforms->second;
209 const std::string string_id = std::to_string(
id);
214 if (ros_name ==
"collision__") {
217 ros_name += string_id;
220 std::shared_ptr<CarlaCollisionPublisher> new_publisher = std::make_shared<CarlaCollisionPublisher>(ros_name.c_str(), parent_ros_name.c_str());
221 if (new_publisher->Init()) {
223 publisher = new_publisher;
225 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
226 if (new_transform->Init()) {
228 transform = new_transform;
232 if (ros_name ==
"depth__") {
235 ros_name += string_id;
238 std::shared_ptr<CarlaDepthCameraPublisher> new_publisher = std::make_shared<CarlaDepthCameraPublisher>(ros_name.c_str(),
239parent_ros_name.c_str());
240 if (new_publisher->Init()) {
242 publisher = new_publisher;
244 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
245 if (new_transform->Init()) {
247 transform = new_transform;
251 if (ros_name ==
"normals__") {
254 ros_name += string_id;
257 std::shared_ptr<CarlaNormalsCameraPublisher> new_publisher = std::make_shared<CarlaNormalsCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
258 if (new_publisher->Init()) {
260 publisher = new_publisher;
262 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
263 if (new_transform->Init()) {
265 transform = new_transform;
269 if (ros_name ==
"dvs__") {
272 ros_name += string_id;
275 std::shared_ptr<CarlaDVSCameraPublisher> new_publisher = std::make_shared<CarlaDVSCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
276 if (new_publisher->Init()) {
278 publisher = new_publisher;
280 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
281 if (new_transform->Init()) {
283 transform = new_transform;
287 if (ros_name ==
"gnss__") {
290 ros_name += string_id;
293 std::shared_ptr<CarlaGNSSPublisher> new_publisher = std::make_shared<CarlaGNSSPublisher>(ros_name.c_str(), parent_ros_name.c_str());
294 if (new_publisher->Init()) {
296 publisher = new_publisher;
298 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
299 if (new_transform->Init()) {
301 transform = new_transform;
305 if (ros_name ==
"imu__") {
308 ros_name += string_id;
311 std::shared_ptr<CarlaIMUPublisher> new_publisher = std::make_shared<CarlaIMUPublisher>(ros_name.c_str(), parent_ros_name.c_str());
312 if (new_publisher->Init()) {
314 publisher = new_publisher;
316 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
317 if (new_transform->Init()) {
319 transform = new_transform;
323 if (ros_name ==
"lane_invasion__") {
326 ros_name += string_id;
329 std::shared_ptr<CarlaLineInvasionPublisher> new_publisher = std::make_shared<CarlaLineInvasionPublisher>(ros_name.c_str(), parent_ros_name.c_str());
330 if (new_publisher->Init()) {
332 publisher = new_publisher;
334 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
335 if (new_transform->Init()) {
337 transform = new_transform;
341 std::cerr <<
"Obstacle detection sensor does not have an available publisher" << std::endl;
344 if (ros_name ==
"optical_flow__") {
347 ros_name += string_id;
350 std::shared_ptr<CarlaOpticalFlowCameraPublisher> new_publisher = std::make_shared<CarlaOpticalFlowCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
351 if (new_publisher->Init()) {
353 publisher = new_publisher;
355 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
356 if (new_transform->Init()) {
358 transform = new_transform;
362 if (ros_name ==
"radar__") {
365 ros_name += string_id;
368 std::shared_ptr<CarlaRadarPublisher> new_publisher = std::make_shared<CarlaRadarPublisher>(ros_name.c_str(), parent_ros_name.c_str());
369 if (new_publisher->Init()) {
371 publisher = new_publisher;
373 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
374 if (new_transform->Init()) {
376 transform = new_transform;
380 if (ros_name ==
"ray_cast_semantic__") {
383 ros_name += string_id;
386 std::shared_ptr<CarlaSemanticLidarPublisher> new_publisher = std::make_shared<CarlaSemanticLidarPublisher>(ros_name.c_str(), parent_ros_name.c_str());
387 if (new_publisher->Init()) {
389 publisher = new_publisher;
391 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
392 if (new_transform->Init()) {
394 transform = new_transform;
398 if (ros_name ==
"ray_cast__") {
401 ros_name += string_id;
404 std::shared_ptr<CarlaLidarPublisher> new_publisher = std::make_shared<CarlaLidarPublisher>(ros_name.c_str(), parent_ros_name.c_str());
405 if (new_publisher->Init()) {
407 publisher = new_publisher;
409 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
410 if (new_transform->Init()) {
412 transform = new_transform;
416 std::cerr <<
"RSS sensor does not have an available publisher" << std::endl;
419 if (ros_name ==
"rgb__") {
422 ros_name += string_id;
425 std::shared_ptr<CarlaRGBCameraPublisher> new_publisher = std::make_shared<CarlaRGBCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
426 if (new_publisher->Init()) {
428 publisher = new_publisher;
430 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
431 if (new_transform->Init()) {
433 transform = new_transform;
437 if (ros_name ==
"semantic_segmentation__") {
440 ros_name += string_id;
443 std::shared_ptr<CarlaSSCameraPublisher> new_publisher = std::make_shared<CarlaSSCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
444 if (new_publisher->Init()) {
446 publisher = new_publisher;
448 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
449 if (new_transform->Init()) {
451 transform = new_transform;
455 if (ros_name ==
"instance_segmentation__") {
458 ros_name += string_id;
461 std::shared_ptr<CarlaISCameraPublisher> new_publisher = std::make_shared<CarlaISCameraPublisher>(ros_name.c_str(), parent_ros_name.c_str());
462 if (new_publisher->Init()) {
464 publisher = new_publisher;
466 std::shared_ptr<CarlaTransformPublisher> new_transform = std::make_shared<CarlaTransformPublisher>(ros_name.c_str(), parent_ros_name.c_str());
467 if (new_transform->Init()) {
469 transform = new_transform;
473 std::cerr <<
"World obserser does not have an available publisher" << std::endl;
476 std::cerr <<
"Camera GBuffer uint8 does not have an available publisher" << std::endl;
479 std::cerr <<
"Camera GBuffer float does not have an available publisher" << std::endl;
482 std::cerr <<
"Unknown sensor type" << std::endl;
486 return { publisher, transform };
490 uint64_t sensor_type,
493 int W,
int H,
float Fov,
497 switch (sensor_type) {
499 log_info(
"Sensor Collision to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
503 log_info(
"Sensor DepthCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
506 std::shared_ptr<CarlaDepthCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaDepthCameraPublisher>(sensors.first);
511 if (!publisher->HasBeenInitialized())
512 publisher->InitInfoData(0, 0, H, W, Fov,
true);
515 publisher->Publish();
517 if (sensors.second) {
518 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
520 publisher->Publish();
525 log_info(
"Sensor NormalsCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
529 std::shared_ptr<CarlaNormalsCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaNormalsCameraPublisher>(sensors.first);
534 if (!publisher->HasBeenInitialized())
535 publisher->InitInfoData(0, 0, H, W, Fov,
true);
538 publisher->Publish();
540 if (sensors.second) {
541 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
543 publisher->Publish();
548 log_info(
"Sensor LaneInvasionSensor to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
552 std::shared_ptr<CarlaLineInvasionPublisher> publisher = std::dynamic_pointer_cast<CarlaLineInvasionPublisher>(sensors.first);
554 publisher->Publish();
556 if (sensors.second) {
557 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
559 publisher->Publish();
564 log_info(
"Sensor OpticalFlowCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
568 std::shared_ptr<CarlaOpticalFlowCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaOpticalFlowCameraPublisher>(sensors.first);
573 if (!publisher->HasBeenInitialized())
574 publisher->InitInfoData(0, 0, H, W, Fov,
true);
577 publisher->Publish();
579 if (sensors.second) {
580 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
582 publisher->Publish();
587 log_info(
"Sensor RssSensor to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
591 log_info(
"Sensor SceneCaptureCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
595 std::shared_ptr<CarlaRGBCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaRGBCameraPublisher>(sensors.first);
600 if (!publisher->HasBeenInitialized())
601 publisher->InitInfoData(0, 0, H, W, Fov,
true);
604 publisher->Publish();
606 if (sensors.second) {
607 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
609 publisher->Publish();
615 log_info(
"Sensor SemanticSegmentationCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
619 std::shared_ptr<CarlaSSCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaSSCameraPublisher>(sensors.first);
624 if (!publisher->HasBeenInitialized())
625 publisher->InitInfoData(0, 0, H, W, Fov,
true);
628 publisher->Publish();
630 if (sensors.second) {
631 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
633 publisher->Publish();
638 log_info(
"Sensor InstanceSegmentationCamera to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
642 std::shared_ptr<CarlaISCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaISCameraPublisher>(sensors.first);
647 if (!publisher->HasBeenInitialized())
648 publisher->InitInfoData(0, 0, H, W, Fov,
true);
651 publisher->Publish();
653 if (sensors.second) {
654 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
656 publisher->Publish();
661 log_info(
"Sensor WorldObserver to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
664 log_info(
"Sensor CameraGBufferUint8 to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
667 log_info(
"Sensor CameraGBufferFloat to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
670 log_info(
"Sensor to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"buffer.", buffer->size());
675 uint64_t sensor_type,
683 std::shared_ptr<CarlaGNSSPublisher> publisher = std::dynamic_pointer_cast<CarlaGNSSPublisher>(sensors.first);
685 publisher->Publish();
687 if (sensors.second) {
688 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
690 publisher->Publish();
695 uint64_t sensor_type,
702 log_info(
"Sensor InertialMeasurementUnit to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"imu.", accelerometer.
x, gyroscope.
x, compass);
705 std::shared_ptr<CarlaIMUPublisher> publisher = std::dynamic_pointer_cast<CarlaIMUPublisher>(sensors.first);
706 publisher->SetData(
_seconds,
_nanoseconds,
reinterpret_cast<float*
>(&accelerometer),
reinterpret_cast<float*
>(&gyroscope), compass);
707 publisher->Publish();
709 if (sensors.second) {
710 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
712 publisher->Publish();
717 uint64_t sensor_type,
721 int W,
int H,
float Fov,
723 log_info(
"Sensor DVS to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id);
726 std::shared_ptr<CarlaDVSCameraPublisher> publisher = std::dynamic_pointer_cast<CarlaDVSCameraPublisher>(sensors.first);
731 if (!publisher->HasBeenInitialized())
732 publisher->InitInfoData(0, 0, H, W, Fov,
true);
737 publisher->Publish();
739 if (sensors.second) {
740 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
742 publisher->Publish();
747 uint64_t sensor_type,
750 carla::sensor::data::LidarData &data,
752 log_info(
"Sensor Lidar to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"points.", data._points.size());
755 std::shared_ptr<CarlaLidarPublisher> publisher = std::dynamic_pointer_cast<CarlaLidarPublisher>(sensors.first);
756 size_t width = data._points.size();
759 publisher->Publish();
761 if (sensors.second) {
762 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
764 publisher->Publish();
769 uint64_t sensor_type,
774 static_assert(
sizeof(float) ==
sizeof(uint32_t),
"Invalid float size");
775 log_info(
"Sensor SemanticLidar to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"points.", data.
_ser_points.size());
778 std::shared_ptr<CarlaSemanticLidarPublisher> publisher = std::dynamic_pointer_cast<CarlaSemanticLidarPublisher>(sensors.first);
782 publisher->Publish();
784 if (sensors.second) {
785 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
787 publisher->Publish();
792 uint64_t sensor_type,
797 log_info(
"Sensor Radar to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"points.", data.
_detections.size());
800 std::shared_ptr<CarlaRadarPublisher> publisher = std::dynamic_pointer_cast<CarlaRadarPublisher>(sensors.first);
805 publisher->Publish();
807 if (sensors.second) {
808 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
810 publisher->Publish();
815 uint64_t sensor_type,
822 log_info(
"Sensor ObstacleDetector to ROS data: frame.",
_frame,
"sensor.", sensor_type,
"stream.", stream_id,
"distance.", distance);
827 uint64_t sensor_type,
830 uint32_t other_actor,
837 std::shared_ptr<CarlaCollisionPublisher> publisher = std::dynamic_pointer_cast<CarlaCollisionPublisher>(sensors.first);
839 publisher->Publish();
841 if (sensors.second) {
843 std::shared_ptr<CarlaTransformPublisher> publisher = std::dynamic_pointer_cast<CarlaTransformPublisher>(sensors.second);
845 publisher->Publish();
855 element.second.reset();
858 element.second.reset();
double altitude
经度,初始化为0.0。
double latitude
定义 GeoLocation 类,它是一个公开的成员。
double longitude
纬度,初始化为0.0。
std::unordered_map< void *, std::shared_ptr< CarlaTransformPublisher > > _transforms
void ProcessDataFromRadar(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, const carla::sensor::data::RadarData &data, void *actor=nullptr)
void ProcessDataFromDVS(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, const carla::SharedBufferView buffer, int W, int H, float Fov, void *actor=nullptr)
static std::shared_ptr< ROS2 > _instance
std::string GetActorParentRosName(void *actor)
void AddActorCallback(void *actor, std::string ros_name, ActorCallback callback)
void RemoveActorRosName(void *actor)
void ProcessDataFromIMU(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, carla::geom::Vector3D accelerometer, carla::geom::Vector3D gyroscope, float compass, void *actor=nullptr)
std::string GetActorRosName(void *actor)
void ProcessDataFromObstacleDetection(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, AActor *first_actor, AActor *second_actor, float distance, void *actor=nullptr)
void ProcessDataFromCamera(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, int W, int H, float Fov, const carla::SharedBufferView buffer, void *actor=nullptr)
std::unordered_map< void *, ActorCallback > _actor_callbacks
void ProcessDataFromSemanticLidar(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, carla::sensor::data::SemanticLidarData &data, void *actor=nullptr)
std::shared_ptr< CarlaClockPublisher > _clock_publisher
void ProcessDataFromCollisionSensor(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, uint32_t other_actor, carla::geom::Vector3D impulse, void *actor)
std::shared_ptr< CarlaEgoVehicleControlSubscriber > _controller
void AddActorRosName(void *actor, std::string ros_name)
void UpdateActorRosName(void *actor, std::string ros_name)
std::unordered_map< void *, std::vector< void * > > _actor_parent_ros_name
void AddActorParentRosName(void *actor, void *parent)
void SetTimestamp(double timestamp)
void RemoveActorCallback(void *actor)
void ProcessDataFromLidar(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, carla::sensor::data::LidarData &data, void *actor=nullptr)
void SetFrame(uint64_t frame)
std::pair< std::shared_ptr< CarlaPublisher >, std::shared_ptr< CarlaTransformPublisher > > GetOrCreateSensor(int type, carla::streaming::detail::stream_id_type id, void *actor)
std::unordered_map< void *, std::string > _actor_ros_name
std::unordered_map< void *, std::shared_ptr< CarlaPublisher > > _publishers
void ProcessDataFromGNSS(uint64_t sensor_type, carla::streaming::detail::stream_id_type stream_id, const carla::geom::Transform sensor_transform, const carla::geom::GeoLocation &data, void *actor=nullptr)
size_t GetDetectionCount() const
std::vector< RadarDetection > _detections
std::vector< SemanticLidarDetection > _ser_points
static constexpr auto header_offset
static constexpr auto header_offset
std::function< void(void *actor, ROS2CallbackData data)> ActorCallback
@ InstanceSegmentationCamera
@ SemanticSegmentationCamera
@ InertialMeasurementUnit
@ ObstacleDetectionSensor
uint32_t stream_id_type
流ID的类型定义。
std::shared_ptr< BufferView > SharedBufferView
static void log_info(Args &&... args)