Skip to content

Commit 8cad131

Browse files
RobotImporter: add Lidar2D and sdf::GPU_LIDAR support (o3de#590)
* RobotImporter: Lidar2D support added * add sdf::GPU_LIDAR to RGL mapping; lidar fixes --------- Signed-off-by: Jan Hanca <[email protected]>
1 parent c582bbf commit 8cad131

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

Gems/ROS2/Code/Source/Lidar/LidarSystem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ namespace ROS2
2626
void Activate();
2727
void Deactivate();
2828

29-
private:
3029
static constexpr const char* SystemName = "Scene Queries";
3130

31+
private:
3232
// LidarSystemRequestBus overrides
3333
LidarId CreateLidar(AZ::EntityId lidarEntityId) override;
3434
void DestroyLidar(LidarId lidarId) override;

Gems/ROS2/Code/Source/RobotImporter/SDFormat/Hooks/ROS2LidarSensorHook.cpp

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*
77
*/
88

9+
#include <Lidar/ROS2Lidar2DSensorComponent.h>
910
#include <Lidar/ROS2LidarSensorComponent.h>
1011
#include <ROS2/Frame/ROS2FrameComponent.h>
1112
#include <RobotImporter/SDFormat/ROS2SensorHooks.h>
@@ -19,7 +20,7 @@ namespace ROS2::SDFormat
1920
SensorImporterHook ROS2SensorHooks::ROS2LidarSensor()
2021
{
2122
SensorImporterHook importerHook;
22-
importerHook.m_sensorTypes = AZStd::unordered_set<sdf::SensorType>{ sdf::SensorType::LIDAR };
23+
importerHook.m_sensorTypes = AZStd::unordered_set<sdf::SensorType>{ sdf::SensorType::LIDAR, sdf::SensorType::GPU_LIDAR };
2324
importerHook.m_supportedSensorParams = AZStd::unordered_set<AZStd::string>{
2425
">update_rate",
2526
">lidar>scan>horizontal>samples",
@@ -51,28 +52,53 @@ namespace ROS2::SDFormat
5152
return AZ::Failure(AZStd::string("Failed to read parsed SDFormat data of %s Lidar sensor", sdfSensor.Name().c_str()));
5253
}
5354

55+
const bool is2DLidar = (lidarSensor->VerticalScanSamples() == 1);
56+
5457
SensorConfiguration sensorConfiguration;
5558
sensorConfiguration.m_frequency = sdfSensor.UpdateRate();
56-
const AZStd::string messageType = "sensor_msgs::msg::PointCloud2";
57-
Utils::AddTopicConfiguration(sensorConfiguration, "pc", messageType, messageType);
59+
const AZStd::string messageType = is2DLidar ? "sensor_msgs::msg::LaserScan" : "sensor_msgs::msg::PointCloud2";
60+
const AZStd::string messageTopic = is2DLidar ? "scan" : "pc";
61+
Utils::AddTopicConfiguration(sensorConfiguration, messageTopic, messageType, messageType);
5862

59-
LidarSensorConfiguration lidarConfiguration;
60-
lidarConfiguration.m_lidarParameters.m_model = LidarTemplate::LidarModel::Custom3DLidar;
63+
LidarSensorConfiguration lidarConfiguration{ is2DLidar ? LidarTemplateUtils::Get2DModels()
64+
: LidarTemplateUtils::Get3DModels() };
6165
lidarConfiguration.m_lidarParameters.m_name = AZStd::string(sdfSensor.Name().c_str());
6266
lidarConfiguration.m_lidarParameters.m_minHAngle = lidarSensor->HorizontalScanMinAngle().Degree();
6367
lidarConfiguration.m_lidarParameters.m_maxHAngle = lidarSensor->HorizontalScanMaxAngle().Degree();
6468
lidarConfiguration.m_lidarParameters.m_minVAngle = lidarSensor->VerticalScanMinAngle().Degree();
6569
lidarConfiguration.m_lidarParameters.m_maxVAngle = lidarSensor->VerticalScanMaxAngle().Degree();
66-
lidarConfiguration.m_lidarParameters.m_layers = lidarSensor->HorizontalScanSamples();
67-
lidarConfiguration.m_lidarParameters.m_numberOfIncrements = lidarSensor->VerticalScanSamples();
70+
lidarConfiguration.m_lidarParameters.m_numberOfIncrements = lidarSensor->HorizontalScanSamples();
71+
lidarConfiguration.m_lidarParameters.m_layers = lidarSensor->VerticalScanSamples();
6872
lidarConfiguration.m_lidarParameters.m_minRange = lidarSensor->RangeMin();
6973
lidarConfiguration.m_lidarParameters.m_maxRange = lidarSensor->RangeMax();
7074

75+
const auto lidarSystems = LidarRegistrarInterface::Get()->GetRegisteredLidarSystems();
76+
if (!lidarSystems.empty())
77+
{
78+
const AZStd::string query = (sdfSensor.Type() == sdf::SensorType::GPU_LIDAR ? "RobotecGPULidar" : LidarSystem::SystemName);
79+
if (const auto it = AZStd::find(lidarSystems.begin(), lidarSystems.end(), query); it != lidarSystems.end())
80+
{
81+
lidarConfiguration.m_lidarSystem = *it;
82+
}
83+
}
84+
85+
if (lidarConfiguration.m_lidarSystem.empty())
86+
{
87+
AZ_Warning("ROS2LidarSensorHook", false, "Lidar System in imported robot not set.");
88+
AZ_Warning(
89+
"ROS2LidarSensorHook",
90+
sdfSensor.Type() != sdf::SensorType::GPU_LIDAR,
91+
"GPU Lidar requires RGL Gem, see https://github.com/RobotecAI/o3de-rgl-gem for more details.\n");
92+
}
93+
7194
// Create required components
7295
Utils::CreateComponent<ROS2FrameComponent>(entity);
7396

7497
// Create Lidar component
75-
if (Utils::CreateComponent<ROS2LidarSensorComponent>(entity, sensorConfiguration, lidarConfiguration))
98+
const auto lidarComponent = is2DLidar
99+
? Utils::CreateComponent<ROS2Lidar2DSensorComponent>(entity, sensorConfiguration, lidarConfiguration)
100+
: Utils::CreateComponent<ROS2LidarSensorComponent>(entity, sensorConfiguration, lidarConfiguration);
101+
if (lidarComponent)
76102
{
77103
return AZ::Success();
78104
}

0 commit comments

Comments
 (0)