diff --git a/.github/workflows/json-schema-check.yaml b/.github/workflows/json-schema-check.yaml
new file mode 100644
index 000000000..735641acd
--- /dev/null
+++ b/.github/workflows/json-schema-check.yaml
@@ -0,0 +1,39 @@
+name: json-schema-check
+
+on:
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ check-if-relevant-files-changed:
+ runs-on: ubuntu-latest
+ outputs:
+ run-check: ${{ steps.paths_filter.outputs.json_or_yaml }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dorny/paths-filter@v3
+ id: paths_filter
+ with:
+ filters: |
+ json_or_yaml:
+ - '**/schema/*.schema.json'
+ - '**/config/**/*.param.yaml'
+
+ json-schema-check:
+ needs: check-if-relevant-files-changed
+ if: needs.check-if-relevant-files-changed.outputs.run-check == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v4
+
+ - name: Run json-schema-check
+ uses: autowarefoundation/autoware-github-actions/json-schema-check@main
+
+ no-relevant-changes:
+ needs: check-if-relevant-files-changed
+ if: needs.check-if-relevant-files-changed.outputs.run-check == 'false'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Dummy step
+ run: echo "No relevant changes, passing check"
\ No newline at end of file
diff --git a/nebula_ros/config/BaseParams.yaml b/nebula_ros/config/BaseParams.yaml
deleted file mode 100644
index 2aa17176a..000000000
--- a/nebula_ros/config/BaseParams.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-/**:
- ros__parameters:
- device_ip: "192.168.1.201"
- return_mode: "SingleStrongest"
- host_ip: "255.255.255.255"
- frame_id: "lidar"
- data_port: 2368
- gnss_port: 2369
- setup_sensor: True
- online: True
diff --git a/nebula_ros/config/hesai/Pandar128E4X.yaml b/nebula_ros/config/hesai/Pandar128E4X.yaml
deleted file mode 100644
index b4f5df758..000000000
--- a/nebula_ros/config/hesai/Pandar128E4X.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "Pandar128E4X" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "Dual" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 600 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/Pandar128E4X.csv"
- setup_sensor: True
-
- online: True
\ No newline at end of file
diff --git a/nebula_ros/config/hesai/Pandar40P.yaml b/nebula_ros/config/hesai/Pandar40P.yaml
deleted file mode 100644
index 3b457f573..000000000
--- a/nebula_ros/config/hesai/Pandar40P.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "Pandar40P" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "Dual" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 600 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/Pandar40P.csv"
- setup_sensor: True
-
- online: True
diff --git a/nebula_ros/config/hesai/PandarAT128.yaml b/nebula_ros/config/hesai/PandarAT128.yaml
deleted file mode 100644
index 5ad0027bb..000000000
--- a/nebula_ros/config/hesai/PandarAT128.yaml
+++ /dev/null
@@ -1,20 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "PandarAT128" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "LastStrongest" # See readme for supported return modes
- scan_phase: 30.0 # Angle where scans begin (degrees, [30.,150.])
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 200 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarAT128.csv"
- correction_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarAT128.dat"
- setup_sensor: True
-
- online: True
diff --git a/nebula_ros/config/hesai/PandarQT128.yaml b/nebula_ros/config/hesai/PandarQT128.yaml
deleted file mode 100644
index 6ab2e81a5..000000000
--- a/nebula_ros/config/hesai/PandarQT128.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "PandarQT128" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "LastStrongest" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 200 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarQT128.csv"
-
- online: True
diff --git a/nebula_ros/config/hesai/PandarQT64.yaml b/nebula_ros/config/hesai/PandarQT64.yaml
deleted file mode 100644
index b2caccca8..000000000
--- a/nebula_ros/config/hesai/PandarQT64.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "PandarQT64" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "Dual" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 600 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarQT64.csv"
- setup_sensor: True
-
- online: True
\ No newline at end of file
diff --git a/nebula_ros/config/hesai/PandarXT32.yaml b/nebula_ros/config/hesai/PandarXT32.yaml
deleted file mode 100644
index 245848408..000000000
--- a/nebula_ros/config/hesai/PandarXT32.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "PandarXT32" # See readme for supported models
- sensor_ip: "192.168.1.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2368 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "Dual" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 600 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarXT32.csv"
- setup_sensor: True
-
- online: True
diff --git a/nebula_ros/config/hesai/PandarXT32M.yaml b/nebula_ros/config/hesai/PandarXT32M.yaml
deleted file mode 100644
index 994045eae..000000000
--- a/nebula_ros/config/hesai/PandarXT32M.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "PandarXT32M" # See readme for supported models
- sensor_ip: "192.168.50.201" # Lidar Sensor IP
- host_ip: "255.255.255.255" # Broadcast IP from Sensor
- frame_id: "hesai"
- data_port: 2369 # LiDAR Data Port
- gnss_port: 10110 # LiDAR GNSS Port
- return_mode: "LastStrongest" # See readme for supported return modes
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- packet_mtu_size: 1500 # Packet MTU size
- rotation_speed: 1200 # Motor RPM, the sensor's internal spin rate.
- cloud_min_angle: 0 # Field of View, start degrees.
- cloud_max_angle: 360 # Field of View, end degrees.
- diag_span: 1000 # milliseconds
- calibration_file: "./install/nebula_decoders/share/nebula_decoders/calibration/hesai/PandarXT32M.csv"
- setup_sensor: True
-
- online: True
diff --git a/nebula_ros/config/lidar/hesai/Pandar128E4X.param.yaml b/nebula_ros/config/lidar/hesai/Pandar128E4X.param.yaml
new file mode 100644
index 000000000..bf93088c6
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/Pandar128E4X.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: Pandar128E4X
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: Dual
+ ptp_profile: automotive
+ ptp_domain: 0
+ ptp_transport_type: L2
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/Pandar40P.param.yaml b/nebula_ros/config/lidar/hesai/Pandar40P.param.yaml
new file mode 100644
index 000000000..7dd0c7bf3
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/Pandar40P.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: Pandar40P
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: Dual
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/Pandar64.param.yaml b/nebula_ros/config/lidar/hesai/Pandar64.param.yaml
new file mode 100644
index 000000000..e1ec8906e
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/Pandar64.param.yaml
@@ -0,0 +1,25 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: Pandar64
+ rotation_speed: 600
+ return_mode: Dual
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/PandarAT128.param.yaml b/nebula_ros/config/lidar/hesai/PandarAT128.param.yaml
new file mode 100644
index 000000000..5f3ab1ba5
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/PandarAT128.param.yaml
@@ -0,0 +1,27 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ correction_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).dat
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 30
+ cloud_max_angle: 150
+ scan_phase: 30.0
+ sensor_model: PandarAT128
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 200
+ return_mode: Dual
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/PandarQT128.param.yaml b/nebula_ros/config/lidar/hesai/PandarQT128.param.yaml
new file mode 100644
index 000000000..86593a4a3
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/PandarQT128.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: PandarQT128
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: LastStrongest
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/PandarQT64.param.yaml b/nebula_ros/config/lidar/hesai/PandarQT64.param.yaml
new file mode 100644
index 000000000..bd1bc2245
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/PandarQT64.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: PandarQT64
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: Dual
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/PandarXT32.param.yaml b/nebula_ros/config/lidar/hesai/PandarXT32.param.yaml
new file mode 100644
index 000000000..1aa27e856
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/PandarXT32.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: PandarXT32
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: Dual
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/hesai/PandarXT32M.param.yaml b/nebula_ros/config/lidar/hesai/PandarXT32M.param.yaml
new file mode 100644
index 000000000..c87b822ef
--- /dev/null
+++ b/nebula_ros/config/lidar/hesai/PandarXT32M.param.yaml
@@ -0,0 +1,26 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 10110
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: hesai
+ diag_span: 1000
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: PandarXT32M
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv
+ rotation_speed: 600
+ return_mode: LastStrongest
+ ptp_profile: "1588v2"
+ ptp_domain: 0
+ ptp_transport_type: UDP
+ ptp_switch_type: TSN
+ retry_hw: true
+ dual_return_distance_threshold: 0.1
\ No newline at end of file
diff --git a/nebula_ros/config/hesai/Pandar64.yaml b/nebula_ros/config/lidar/robosense/Bpearl.param.yaml
similarity index 60%
rename from nebula_ros/config/hesai/Pandar64.yaml
rename to nebula_ros/config/lidar/robosense/Bpearl.param.yaml
index 53ebf0ad3..c9abc5255 100644
--- a/nebula_ros/config/hesai/Pandar64.yaml
+++ b/nebula_ros/config/lidar/robosense/Bpearl.param.yaml
@@ -1,17 +1,17 @@
/**:
ros__parameters:
- sensor_model: "Pandar64"
- frame_id: "hesai"
- return_mode: "Dual"
- sensor_ip: "192.168.1.201"
host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
data_port: 2368
gnss_port: 2369
- scan_phase: 0.0
packet_mtu_size: 1500
- rotation_speed: 600
+ launch_hw: true
+ setup_sensor: true
+ frame_id: robosense
+ diag_span: 1000
cloud_min_angle: 0
cloud_max_angle: 360
- diag_span: 1000
- setup_sensor: True
- online: True
+ scan_phase: 0.0
+ dual_return_distance_threshold: 0.1
+ sensor_model: Bpearl
+ return_mode: Dual
diff --git a/nebula_ros/config/lidar/robosense/Helios.param.yaml b/nebula_ros/config/lidar/robosense/Helios.param.yaml
new file mode 100644
index 000000000..bc84175bd
--- /dev/null
+++ b/nebula_ros/config/lidar/robosense/Helios.param.yaml
@@ -0,0 +1,17 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 2369
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: robosense
+ diag_span: 1000
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ dual_return_distance_threshold: 0.1
+ sensor_model: Helios
+ return_mode: Dual
diff --git a/nebula_ros/config/lidar/velodyne/VLP16.param.yaml b/nebula_ros/config/lidar/velodyne/VLP16.param.yaml
new file mode 100644
index 000000000..7604367ca
--- /dev/null
+++ b/nebula_ros/config/lidar/velodyne/VLP16.param.yaml
@@ -0,0 +1,21 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 2369
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: velodyne
+ advanced_diagnostics: false
+ diag_span: 1000
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/velodyne/VLP16.yaml
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: VLP16
+ rotation_speed: 600
+ return_mode: Dual
\ No newline at end of file
diff --git a/nebula_ros/config/lidar/velodyne/VLP32.param.yaml b/nebula_ros/config/lidar/velodyne/VLP32.param.yaml
new file mode 100644
index 000000000..153c492a2
--- /dev/null
+++ b/nebula_ros/config/lidar/velodyne/VLP32.param.yaml
@@ -0,0 +1,21 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 2369
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: velodyne
+ advanced_diagnostics: false
+ diag_span: 1000
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/velodyne/VLP32.yaml
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: VLP32
+ rotation_speed: 600
+ return_mode: Dual
diff --git a/nebula_ros/config/lidar/velodyne/VLS128.param.yaml b/nebula_ros/config/lidar/velodyne/VLS128.param.yaml
new file mode 100644
index 000000000..2cddcd352
--- /dev/null
+++ b/nebula_ros/config/lidar/velodyne/VLS128.param.yaml
@@ -0,0 +1,21 @@
+/**:
+ ros__parameters:
+ host_ip: "255.255.255.255"
+ sensor_ip: "192.168.1.201"
+ data_port: 2368
+ gnss_port: 2369
+ packet_mtu_size: 1500
+ launch_hw: true
+ setup_sensor: true
+ frame_id: velodyne
+ advanced_diagnostics: false
+ diag_span: 1000
+ calibration_file: $(find-pkg-share nebula_decoders)/calibration/velodyne/VLS128.yaml
+ min_range: 0.3
+ max_range: 300.0
+ cloud_min_angle: 0
+ cloud_max_angle: 360
+ scan_phase: 0.0
+ sensor_model: VLS128
+ rotation_speed: 600
+ return_mode: Dual
diff --git a/nebula_ros/config/continental/ARS548.yaml b/nebula_ros/config/radar/continental/ARS548.param.yaml
similarity index 75%
rename from nebula_ros/config/continental/ARS548.yaml
rename to nebula_ros/config/radar/continental/ARS548.param.yaml
index 2342cfe93..91021f442 100644
--- a/nebula_ros/config/continental/ARS548.yaml
+++ b/nebula_ros/config/radar/continental/ARS548.param.yaml
@@ -1,13 +1,14 @@
/**:
ros__parameters:
- sensor_model: "ARS548"
- frame_id: "continental"
- base_frame: "base_link"
- object_frame: "base_link"
- sensor_ip: "10.13.1.114"
host_ip: "10.13.1.166"
- multicast_ip: "224.0.2.2"
+ sensor_ip: "10.13.1.114"
data_port: 42102
+ frame_id: continental
+ base_frame: base_link
+ object_frame: base_link
+ launch_hw: true
+ multicast_ip: "224.0.2.2"
+ sensor_model: ARS548
configuration_host_port: 42401
configuration_sensor_port: 42101
use_sensor_time: false
diff --git a/nebula_ros/config/robosense/Bpearl.yaml b/nebula_ros/config/robosense/Bpearl.yaml
deleted file mode 100644
index 9ccb42e56..000000000
--- a/nebula_ros/config/robosense/Bpearl.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "Bpearl" # See readme for supported models
- sensor_ip: "192.168.1.200" # Lidar Sensor IP
- host_ip: "192.168.1.102" # Broadcast IP from Sensor
- frame_id: "robosense"
- data_port: 6699 # LiDAR Data Port (MSOP)
- gnss_port: 7788 # LiDAR GNSS Port (DIFOP)
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- diag_span: 1000 # milliseconds
- dual_return_distance_threshold: 0.1
diff --git a/nebula_ros/config/robosense/Helios.yaml b/nebula_ros/config/robosense/Helios.yaml
deleted file mode 100644
index 24350822d..000000000
--- a/nebula_ros/config/robosense/Helios.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "Helios" # See readme for supported models
- sensor_ip: "192.168.1.200" # Lidar Sensor IP
- host_ip: "192.168.1.102" # Broadcast IP from Sensor
- frame_id: "robosense"
- data_port: 6699 # LiDAR Data Port (MSOP)
- gnss_port: 7788 # LiDAR GNSS Port (DIFOP)
- scan_phase: 0.0 # Angle where scans begin (degrees, [0.,360.]
- diag_span: 1000 # milliseconds
- dual_return_distance_threshold: 0.1
diff --git a/nebula_ros/config/velodyne/VLP16.yaml b/nebula_ros/config/velodyne/VLP16.yaml
deleted file mode 100644
index 1daf3a4c6..000000000
--- a/nebula_ros/config/velodyne/VLP16.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "VLP16"
- sensor_ip: "192.168.1.201"
- host_ip: "255.255.255.255"
- frame_id: "velodyne"
- data_port: 2368
- gnss_port: 2369
- setup_sensor: True
- online: True
diff --git a/nebula_ros/config/velodyne/VLP32.yaml b/nebula_ros/config/velodyne/VLP32.yaml
deleted file mode 100644
index ef5ae14c1..000000000
--- a/nebula_ros/config/velodyne/VLP32.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "VLP32"
- sensor_ip: "192.168.1.201"
- host_ip: "255.255.255.255"
- frame_id: "velodyne"
- data_port: 2368
- gnss_port: 2369
- setup_sensor: True
- online: True
diff --git a/nebula_ros/config/velodyne/VLS128.yaml b/nebula_ros/config/velodyne/VLS128.yaml
deleted file mode 100644
index db73ecc05..000000000
--- a/nebula_ros/config/velodyne/VLS128.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-/**:
- ros__parameters:
- sensor_model: "VLS128"
- sensor_ip: "192.168.1.201"
- host_ip: "255.255.255.255"
- frame_id: "velodyne"
- data_port: 2368
- gnss_port: 2369
- setup_sensor: True
- online: True
diff --git a/nebula_ros/launch/continental_launch_all_hw.xml b/nebula_ros/launch/continental_launch_all_hw.xml
index 31798493a..c5f7673b0 100644
--- a/nebula_ros/launch/continental_launch_all_hw.xml
+++ b/nebula_ros/launch/continental_launch_all_hw.xml
@@ -1,56 +1,20 @@
-
-
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/nebula_ros/launch/hesai_launch_all_hw.xml b/nebula_ros/launch/hesai_launch_all_hw.xml
index 10c7aa218..7e9686888 100644
--- a/nebula_ros/launch/hesai_launch_all_hw.xml
+++ b/nebula_ros/launch/hesai_launch_all_hw.xml
@@ -1,69 +1,10 @@
-
-
-
-
-
+
+
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/nebula_ros/launch/robosense_launch_all_hw.xml b/nebula_ros/launch/robosense_launch_all_hw.xml
index 3a32fa9c2..d544fb8b8 100644
--- a/nebula_ros/launch/robosense_launch_all_hw.xml
+++ b/nebula_ros/launch/robosense_launch_all_hw.xml
@@ -1,32 +1,10 @@
-
-
-
-
+
+
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/nebula_ros/launch/velodyne_launch_all_hw.xml b/nebula_ros/launch/velodyne_launch_all_hw.xml
index 717aa5afd..d2f030b29 100644
--- a/nebula_ros/launch/velodyne_launch_all_hw.xml
+++ b/nebula_ros/launch/velodyne_launch_all_hw.xml
@@ -1,42 +1,10 @@
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/nebula_ros/schema/ARS548.schema.json b/nebula_ros/schema/ARS548.schema.json
new file mode 100644
index 000000000..28eeb9907
--- /dev/null
+++ b/nebula_ros/schema/ARS548.schema.json
@@ -0,0 +1,88 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Radar Continental ARS548 parameters.",
+ "type": "object",
+ "definitions": {
+ "ARS548": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "multicast_ip": {
+ "$ref": "sub/communication.json#/definitions/multicast_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "configuration_host_port": {
+ "$ref": "sub/communication.json#/definitions/configuration_host_port"
+ },
+ "configuration_sensor_port": {
+ "$ref": "sub/communication.json#/definitions/configuration_sensor_port"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "base_frame": {
+ "$ref": "sub/topic.json#/definitions/base_frame"
+ },
+ "object_frame": {
+ "$ref": "sub/topic.json#/definitions/object_frame"
+ },
+ "use_sensor_time": {
+ "$ref": "sub/topic.json#/definitions/use_sensor_time"
+ },
+ "configuration_vehicle_length": {
+ "$ref": "sub/misc.json#/definitions/configuration_vehicle_length"
+ },
+ "configuration_vehicle_width": {
+ "$ref": "sub/misc.json#/definitions/configuration_vehicle_width"
+ },
+ "configuration_vehicle_height": {
+ "$ref": "sub/misc.json#/definitions/configuration_vehicle_height"
+ },
+ "configuration_vehicle_wheelbase": {
+ "$ref": "sub/misc.json#/definitions/configuration_vehicle_wheelbase"
+ },
+ "sensor_model": {
+ "$ref": "sub/radar_continental.json#/definitions/sensor_model"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "multicast_ip",
+ "data_port",
+ "configuration_host_port",
+ "configuration_sensor_port",
+ "launch_hw",
+ "configuration_vehicle_length",
+ "configuration_vehicle_width",
+ "configuration_vehicle_height",
+ "configuration_vehicle_wheelbase",
+ "sensor_model"
+ ]
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/ARS548"
+ }
+ },
+ "required": ["ros__parameters"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/Bpearl.schema.json b/nebula_ros/schema/Bpearl.schema.json
new file mode 100644
index 000000000..f813380fa
--- /dev/null
+++ b/nebula_ros/schema/Bpearl.schema.json
@@ -0,0 +1,89 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Robosense Bpearl parameters.",
+ "type": "object",
+ "definitions": {
+ "Bpearl": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/communication.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_robosense.json#/definitions/sensor_model"
+ },
+ "return_mode": {
+ "$ref": "sub/lidar_robosense.json#/definitions/return_mode"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "dual_return_distance_threshold",
+ "sensor_model",
+ "return_mode"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/Bpearl"
+ }
+ },
+ "required": ["ros__parameters"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/Helios.schema.json b/nebula_ros/schema/Helios.schema.json
new file mode 100644
index 000000000..a9a21ac04
--- /dev/null
+++ b/nebula_ros/schema/Helios.schema.json
@@ -0,0 +1,89 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Robosense Helios parameters.",
+ "type": "object",
+ "definitions": {
+ "Helios": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/communication.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_robosense.json#/definitions/sensor_model"
+ },
+ "return_mode": {
+ "$ref": "sub/lidar_robosense.json#/definitions/return_mode"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "dual_return_distance_threshold",
+ "sensor_model",
+ "return_mode"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/Helios"
+ }
+ },
+ "required": ["ros__parameters"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/Pandar128E4X.schema.json b/nebula_ros/schema/Pandar128E4X.schema.json
new file mode 100644
index 000000000..46aba8e65
--- /dev/null
+++ b/nebula_ros/schema/Pandar128E4X.schema.json
@@ -0,0 +1,138 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai Pandar128E4X parameters.",
+ "type": "object",
+ "definitions": {
+ "Pandar128E4X": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "LastStrongest",
+ "First",
+ "LastFirst",
+ "FirstStrongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile",
+ "enum": [
+ "automotive"
+ ]
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type",
+ "enum": [
+ "L2"
+ ]
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/Pandar128E4X"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/Pandar40P.schema.json b/nebula_ros/schema/Pandar40P.schema.json
new file mode 100644
index 000000000..d41b96797
--- /dev/null
+++ b/nebula_ros/schema/Pandar40P.schema.json
@@ -0,0 +1,128 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai Pandar40P parameters.",
+ "type": "object",
+ "definitions": {
+ "Pandar40P": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/Pandar40P"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/Pandar64.schema.json b/nebula_ros/schema/Pandar64.schema.json
new file mode 100644
index 000000000..fceec64e4
--- /dev/null
+++ b/nebula_ros/schema/Pandar64.schema.json
@@ -0,0 +1,124 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai Pandar64 parameters.",
+ "type": "object",
+ "definitions": {
+ "Pandar64": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/Pandar64"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/PandarAT128.schema.json b/nebula_ros/schema/PandarAT128.schema.json
new file mode 100644
index 000000000..f74cd9a6f
--- /dev/null
+++ b/nebula_ros/schema/PandarAT128.schema.json
@@ -0,0 +1,150 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai PandarAT128 parameters.",
+ "type": "object",
+ "definitions": {
+ "PandarAT128": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "correction_file": {
+ "$ref": "sub/misc.json#/definitions/correction_file"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle",
+ "default": 30,
+ "minimum": 30,
+ "maximum": 150
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle",
+ "default": 150,
+ "minimum": 30,
+ "maximum": 150
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase",
+ "default": 30.0,
+ "minimum": 30.0,
+ "maximum": 150.0
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/hardware.json#/definitions/rotation_speed",
+ "default": 200,
+ "enum": [
+ 200,
+ 400
+ ]
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "LastStrongest",
+ "First",
+ "LastFirst",
+ "FirstStrongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "correction_file",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/PandarAT128"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/PandarQT128.schema.json b/nebula_ros/schema/PandarQT128.schema.json
new file mode 100644
index 000000000..1fcd4fc7c
--- /dev/null
+++ b/nebula_ros/schema/PandarQT128.schema.json
@@ -0,0 +1,132 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai PandarQT128 parameters.",
+ "type": "object",
+ "definitions": {
+ "PandarQT128": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "LastStrongest",
+ "First",
+ "LastFirst",
+ "FirstStrongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/PandarQT128"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/PandarQT64.schema.json b/nebula_ros/schema/PandarQT64.schema.json
new file mode 100644
index 000000000..9a683132d
--- /dev/null
+++ b/nebula_ros/schema/PandarQT64.schema.json
@@ -0,0 +1,128 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai PandarQT64 parameters.",
+ "type": "object",
+ "definitions": {
+ "PandarQT64": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "First",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/PandarQT64"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/PandarXT32.schema.json b/nebula_ros/schema/PandarXT32.schema.json
new file mode 100644
index 000000000..0f0c022ed
--- /dev/null
+++ b/nebula_ros/schema/PandarXT32.schema.json
@@ -0,0 +1,132 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai PandarXT32 parameters.",
+ "type": "object",
+ "definitions": {
+ "PandarXT32": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "LastStrongest",
+ "First",
+ "LastFirst",
+ "FirstStrongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/PandarXT32"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/PandarXT32M.schema.json b/nebula_ros/schema/PandarXT32M.schema.json
new file mode 100644
index 000000000..bcc3a9d36
--- /dev/null
+++ b/nebula_ros/schema/PandarXT32M.schema.json
@@ -0,0 +1,132 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Hesai PandarXT32M parameters.",
+ "type": "object",
+ "definitions": {
+ "PandarXT32M": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/lidar_hesai.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_hesai.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_hesai.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_hesai.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/misc.json#/definitions/return_mode",
+ "enum": [
+ "Last",
+ "Strongest",
+ "LastStrongest",
+ "First",
+ "LastFirst",
+ "FirstStrongest",
+ "Dual"
+ ]
+ },
+ "ptp_profile": {
+ "$ref": "sub/communication.json#/definitions/ptp_profile"
+ },
+ "ptp_domain": {
+ "$ref": "sub/communication.json#/definitions/ptp_domain"
+ },
+ "ptp_transport_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_transport_type"
+ },
+ "ptp_switch_type": {
+ "$ref": "sub/communication.json#/definitions/ptp_switch_type"
+ },
+ "retry_hw": {
+ "$ref": "sub/hardware.json#/definitions/retry_hw"
+ },
+ "dual_return_distance_threshold": {
+ "$ref": "sub/misc.json#/definitions/dual_return_distance_threshold"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "diag_span",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode",
+ "ptp_profile",
+ "ptp_domain",
+ "ptp_transport_type",
+ "ptp_switch_type",
+ "retry_hw",
+ "dual_return_distance_threshold"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/PandarXT32M"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/VLP16.schema.json b/nebula_ros/schema/VLP16.schema.json
new file mode 100644
index 000000000..dca0a3aa0
--- /dev/null
+++ b/nebula_ros/schema/VLP16.schema.json
@@ -0,0 +1,105 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Velodyne VLP16 parameters.",
+ "type": "object",
+ "definitions": {
+ "VLP16": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/communication.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "advanced_diagnostics": {
+ "$ref": "sub/topic.json#/definitions/advanced_diagnostics"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/return_mode"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "advanced_diagnostics",
+ "diag_span",
+ "min_range",
+ "max_range",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/VLP16"
+ }
+ },
+ "required": ["ros__parameters"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/VLP32.schema.json b/nebula_ros/schema/VLP32.schema.json
new file mode 100644
index 000000000..319fa4bb4
--- /dev/null
+++ b/nebula_ros/schema/VLP32.schema.json
@@ -0,0 +1,105 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Velodyne VLP32 parameters.",
+ "type": "object",
+ "definitions": {
+ "VLP32": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/communication.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "advanced_diagnostics": {
+ "$ref": "sub/topic.json#/definitions/advanced_diagnostics"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/return_mode"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "advanced_diagnostics",
+ "diag_span",
+ "min_range",
+ "max_range",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/VLP32"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/VLS128.schema.json b/nebula_ros/schema/VLS128.schema.json
new file mode 100644
index 000000000..82545e946
--- /dev/null
+++ b/nebula_ros/schema/VLS128.schema.json
@@ -0,0 +1,105 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "LiDAR Velodyne VLS128 parameters.",
+ "type": "object",
+ "definitions": {
+ "VLS128": {
+ "type": "object",
+ "properties": {
+ "host_ip": {
+ "$ref": "sub/communication.json#/definitions/host_ip"
+ },
+ "sensor_ip": {
+ "$ref": "sub/communication.json#/definitions/sensor_ip"
+ },
+ "data_port": {
+ "$ref": "sub/communication.json#/definitions/data_port"
+ },
+ "gnss_port": {
+ "$ref": "sub/communication.json#/definitions/gnss_port"
+ },
+ "packet_mtu_size": {
+ "$ref": "sub/communication.json#/definitions/packet_mtu_size"
+ },
+ "launch_hw": {
+ "$ref": "sub/hardware.json#/definitions/launch_hw"
+ },
+ "setup_sensor": {
+ "$ref": "sub/hardware.json#/definitions/setup_sensor"
+ },
+ "frame_id": {
+ "$ref": "sub/topic.json#/definitions/frame_id"
+ },
+ "advanced_diagnostics": {
+ "$ref": "sub/topic.json#/definitions/advanced_diagnostics"
+ },
+ "diag_span": {
+ "$ref": "sub/topic.json#/definitions/diag_span"
+ },
+ "min_range": {
+ "$ref": "sub/misc.json#/definitions/min_range"
+ },
+ "max_range": {
+ "$ref": "sub/misc.json#/definitions/max_range"
+ },
+ "cloud_min_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_min_angle"
+ },
+ "cloud_max_angle": {
+ "$ref": "sub/misc.json#/definitions/cloud_max_angle"
+ },
+ "scan_phase": {
+ "$ref": "sub/misc.json#/definitions/scan_phase"
+ },
+ "sensor_model": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/sensor_model"
+ },
+ "calibration_file": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/calibration_file"
+ },
+ "rotation_speed": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/rotation_speed"
+ },
+ "return_mode": {
+ "$ref": "sub/lidar_velodyne.json#/definitions/return_mode"
+ }
+ },
+ "required": [
+ "host_ip",
+ "sensor_ip",
+ "data_port",
+ "gnss_port",
+ "packet_mtu_size",
+ "launch_hw",
+ "setup_sensor",
+ "frame_id",
+ "advanced_diagnostics",
+ "diag_span",
+ "min_range",
+ "max_range",
+ "cloud_min_angle",
+ "cloud_max_angle",
+ "scan_phase",
+ "sensor_model",
+ "calibration_file",
+ "rotation_speed",
+ "return_mode"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/VLS128"
+ },
+ "additionalProperties": false
+ },
+ "required": ["ros__parameters"]
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/example.schema.template.json b/nebula_ros/schema/example.schema.template.json
new file mode 100644
index 000000000..727f358dc
--- /dev/null
+++ b/nebula_ros/schema/example.schema.template.json
@@ -0,0 +1,62 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": " parameters.",
+ "type": "object",
+ "definitions": {
+ "": {
+ "type": "object",
+ "properties": {
+ "example_parameter_1": {
+ "type": "integer",
+ "default": 42,
+ "readOnly": true,
+ "description": "Exclusive parameter only for this sensor model."
+ },
+ "example_parameter_2": {
+ "$ref": "sub/communication.json#/definitions/example_parameter_2",
+ "maximum": 100,
+ "$comment": "Shared parameter, but needs some changes only for this sensor model."
+ },
+ "example_parameter_3": {
+ "$ref": "sub/communication.json#/definitions/example_parameter_3"
+ },
+ "example_parameter_4": {
+ "$ref": "sub/hardware.json#/definitions/example_parameter_4"
+ },
+ "example_parameter_5": {
+ "$ref": "sub/topic.json#/definitions/example_parameter_5"
+ },
+ "example_parameter_6": {
+ "$ref": "sub/misc.json#/definitions/example_parameter_6"
+ },
+ "example_parameter_7": {
+ "$ref": "sub/_.json#/definitions/example_parameter_7"
+ }
+ },
+ "required": [
+ "example_parameter_1",
+ "example_parameter_2",
+ "example_parameter_3",
+ "example_parameter_4",
+ "example_parameter_5",
+ "example_parameter_6",
+ "example_parameter_7"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "properties": {
+ "/**": {
+ "type": "object",
+ "properties": {
+ "ros__parameters": {
+ "$ref": "#/definitions/"
+ }
+ },
+ "required": ["ros__parameters"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["/**"],
+ "additionalProperties": false
+}
diff --git a/nebula_ros/schema/sub/communication.json b/nebula_ros/schema/sub/communication.json
new file mode 100644
index 000000000..315c6bfb6
--- /dev/null
+++ b/nebula_ros/schema/sub/communication.json
@@ -0,0 +1,98 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Communication parameters.",
+ "type": "object",
+ "definitions": {
+ "configuration_host_port": {
+ "type": "integer",
+ "default": 42401,
+ "minimum": 0,
+ "readOnly": true,
+ "description": "Host configuration port."
+ },
+ "configuration_sensor_port": {
+ "type": "integer",
+ "default": 42101,
+ "minimum": 0,
+ "readOnly": true,
+ "description": "Sensor configuration port."
+ },
+ "data_port": {
+ "type": "integer",
+ "default": 2368,
+ "minimum": 0,
+ "readOnly": true,
+ "description": "Sensor data port."
+ },
+ "gnss_port": {
+ "type": "integer",
+ "default": 2369,
+ "minimum": 0,
+ "readOnly": true,
+ "description": "GNSS port."
+ },
+ "host_ip": {
+ "type": "string",
+ "default": "255.255.255.255",
+ "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
+ "readOnly": true,
+ "description": "Host IPv4 address."
+ },
+ "multicast_ip": {
+ "type": "string",
+ "default": "224.0.0.2",
+ "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
+ "readOnly": true,
+ "description": "Multicast IPv4 address."
+ },
+ "packet_mtu_size": {
+ "type": "integer",
+ "default": 1500,
+ "minimum": 0,
+ "readOnly": true,
+ "description": "Packet MTU size."
+ },
+ "sensor_ip": {
+ "type": "string",
+ "default": "192.168.1.201",
+ "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
+ "readOnly": true,
+ "description": "Sensor IPv4 address."
+ },
+ "ptp_profile": {
+ "type": "string",
+ "default": "1588v2",
+ "enum": [
+ "1588v2",
+ "802.1as",
+ "automotive"
+ ],
+ "description": "PTP profile."
+ },
+ "ptp_domain": {
+ "type": "integer",
+ "default": 0,
+ "minimum": 0,
+ "maximum": 127,
+ "description": "PTP domain (PTP operates within a logical scope)."
+ },
+ "ptp_transport_type": {
+ "type": "string",
+ "default": "UDP",
+ "enum": [
+ "UDP",
+ "L2"
+ ],
+ "description": "1588v2 supports 'UDP' or 'L2', other profiles only L2 (HW)."
+ },
+ "ptp_switch_type": {
+ "type": "string",
+ "default": "TSN",
+ "enum": [
+ "TSN",
+ "NON_TSN"
+ ],
+ "description": "For automotive profile,'TSN' or 'NON_TSN'."
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/hardware.json b/nebula_ros/schema/sub/hardware.json
new file mode 100644
index 000000000..bdc6a59ab
--- /dev/null
+++ b/nebula_ros/schema/sub/hardware.json
@@ -0,0 +1,32 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Hardware parameters.",
+ "type": "object",
+ "definitions": {
+ "launch_hw": {
+ "type": "boolean",
+ "readOnly": false,
+ "description": "Whether network sockets should be opened or not. If disabled, replay from NebulaPackets messages is enabled automatically."
+ },
+ "rotation_speed": {
+ "type": "integer",
+ "description": "Motor RPM, the sensor's internal spin rate."
+ },
+ "sensor_model": {
+ "type": "string",
+ "readOnly": true,
+ "description": "Sensor model."
+ },
+ "setup_sensor": {
+ "type": "boolean",
+ "default": true,
+ "readOnly": true,
+ "description": "Enable sensor setup on hardware driver."
+ },
+ "retry_hw": {
+ "type": "boolean",
+ "default": true,
+ "description": "Whether TCP connections are retried on failure or the driver should instead exit."
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/lidar_hesai.json b/nebula_ros/schema/sub/lidar_hesai.json
new file mode 100644
index 000000000..ef374da50
--- /dev/null
+++ b/nebula_ros/schema/sub/lidar_hesai.json
@@ -0,0 +1,36 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Lidar Hesai parameters.",
+ "type": "object",
+ "definitions": {
+ "sensor_model": {
+ "$ref": "hardware.json#/definitions/sensor_model",
+ "enum": [
+ "Pandar64",
+ "Pandar40P",
+ "PandarXT32",
+ "PandarXT32M",
+ "PandarQT64",
+ "PandarQT128",
+ "Pandar128E4X",
+ "PandarAT128"
+ ]
+ },
+ "calibration_file": {
+ "$ref": "misc.json#/definitions/calibration_file",
+ "default": "$(find-pkg-share nebula_decoders)/calibration/hesai/$(var sensor_model).csv"
+ },
+ "gnss_port": {
+ "$ref": "communication.json#/definitions/gnss_port",
+ "default": 10110,
+ "minimum": 0
+ },
+ "rotation_speed": {
+ "$ref": "hardware.json#/definitions/rotation_speed",
+ "default": 600,
+ "minimum": 300,
+ "maximum": 1200,
+ "multipleOf": 60
+ }
+ }
+}
diff --git a/nebula_ros/schema/sub/lidar_robosense.json b/nebula_ros/schema/sub/lidar_robosense.json
new file mode 100644
index 000000000..d2a946385
--- /dev/null
+++ b/nebula_ros/schema/sub/lidar_robosense.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Lidar Robosense parameters.",
+ "type": "object",
+ "definitions": {
+ "sensor_model": {
+ "$ref": "hardware.json#/definitions/sensor_model",
+ "enum": [
+ "Helios",
+ "Bpearl"
+ ]
+ },
+ "return_mode": {
+ "$ref": "misc.json#/definitions/return_mode",
+ "enum": [
+ "Dual",
+ "Strongest",
+ "Last",
+ "First"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/lidar_velodyne.json b/nebula_ros/schema/sub/lidar_velodyne.json
new file mode 100644
index 000000000..933504344
--- /dev/null
+++ b/nebula_ros/schema/sub/lidar_velodyne.json
@@ -0,0 +1,35 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Lidar Velodyne parameters.",
+ "type": "object",
+ "definitions": {
+ "sensor_model": {
+ "$ref": "hardware.json#/definitions/sensor_model",
+ "enum": [
+ "VLP16",
+ "VLP32",
+ "VLS128"
+ ]
+ },
+ "calibration_file": {
+ "$ref": "misc.json#/definitions/calibration_file",
+ "default": "$(find-pkg-share nebula_decoders)/calibration/velodyne/$(var sensor_model).yaml"
+ },
+ "return_mode": {
+ "$ref": "misc.json#/definitions/return_mode",
+ "enum": [
+ "SingleStrongest",
+ "SingleLast",
+ "Dual",
+ "SingleFirst"
+ ]
+ },
+ "rotation_speed": {
+ "$ref": "hardware.json#/definitions/rotation_speed",
+ "default": 600,
+ "minimum": 300,
+ "maximum": 1200,
+ "multipleOf": 60
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/misc.json b/nebula_ros/schema/sub/misc.json
new file mode 100644
index 000000000..e74d461bb
--- /dev/null
+++ b/nebula_ros/schema/sub/misc.json
@@ -0,0 +1,90 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Sensors common parameters.",
+ "type": "object",
+ "definitions": {
+ "calibration_file": {
+ "type": "string",
+ "default": "$(find-pkg-share nebula_decoders)/calibration/$(var sensor_vendor)/$(var sensor_model).yaml",
+ "description": "Sensor calibration file."
+ },
+ "correction_file": {
+ "type": "string",
+ "default": "$(find-pkg-share nebula_decoders)/calibration/$(var sensor_vendor)/$(var sensor_model).dat",
+ "pattern": "^.*\\.dat$",
+ "description": "Sensor correction file."
+ },
+ "cloud_max_angle": {
+ "type": "integer",
+ "default": 360,
+ "minimum": 0,
+ "maximum": 360,
+ "description": "Field of View, end degrees."
+ },
+ "cloud_min_angle": {
+ "type": "integer",
+ "default": 0,
+ "minimum": 0,
+ "maximum": 360,
+ "description": "Field of View, start degrees."
+ },
+ "configuration_vehicle_height": {
+ "type": "number",
+ "default": 2.5,
+ "minimum": 0.0,
+ "readOnly": true,
+ "description": "New vehicle height."
+ },
+ "configuration_vehicle_length": {
+ "type": "number",
+ "default": 4.9,
+ "minimum": 0.0,
+ "readOnly": true,
+ "description": "New vehicle length."
+ },
+ "configuration_vehicle_wheelbase": {
+ "type": "number",
+ "default": 2.8,
+ "minimum": 0.0,
+ "readOnly": true,
+ "description": "New vehicle wheelbase."
+ },
+ "configuration_vehicle_width": {
+ "type": "number",
+ "default": 1.9,
+ "minimum": 0.0,
+ "readOnly": true,
+ "description": "New vehicle width."
+ },
+ "dual_return_distance_threshold": {
+ "type": "number",
+ "default": 0.1,
+ "minimum": 0.01,
+ "maximum": 0.5,
+ "description": "Distance threshold between two neighboring points for dual return mode."
+ },
+ "max_range": {
+ "type": "number",
+ "default": 300.0,
+ "minimum": 0.0,
+ "description": "Sensor maximum single point range."
+ },
+ "min_range": {
+ "type": "number",
+ "default": 0.3,
+ "minimum": 0.0,
+ "description": "Sensor minimum single point range."
+ },
+ "return_mode": {
+ "type": "string",
+ "description": "Sensor return mode."
+ },
+ "scan_phase": {
+ "type": "number",
+ "default": 0.0,
+ "minimum": 0.0,
+ "maximum": 360.0,
+ "description": "Sensor scan phase."
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/radar_continental.json b/nebula_ros/schema/sub/radar_continental.json
new file mode 100644
index 000000000..2ccaff49e
--- /dev/null
+++ b/nebula_ros/schema/sub/radar_continental.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Radar Continental parameters.",
+ "type": "object",
+ "definitions": {
+ "sensor_model": {
+ "$ref": "hardware.json#/definitions/sensor_model",
+ "enum": [
+ "ARS548",
+ "SSR520"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/topic.json b/nebula_ros/schema/sub/topic.json
new file mode 100644
index 000000000..b3aa90dd0
--- /dev/null
+++ b/nebula_ros/schema/sub/topic.json
@@ -0,0 +1,44 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Topic parameters.",
+ "type": "object",
+ "definitions": {
+ "advanced_diagnostics": {
+ "type": "boolean",
+ "default": false,
+ "readOnly": true,
+ "description": "Enable advanced diagnostics."
+ },
+ "base_frame": {
+ "type": "string",
+ "default": "base_link",
+ "readOnly": true,
+ "description": "Frame with true sensor pose. The final sensor data is transformed by base_frame -> frame_id."
+ },
+ "diag_span": {
+ "type": "integer",
+ "default": 1000,
+ "minimum": 1,
+ "readOnly": true,
+ "description": "Diagnostics rate."
+ },
+ "frame_id": {
+ "type": "string",
+ "default": "data_link",
+ "readOnly": true,
+ "description": "Sensor data frame_id."
+ },
+ "object_frame": {
+ "type": "string",
+ "default": "base_link",
+ "readOnly": true,
+ "description": "Tracked objects frame."
+ },
+ "use_sensor_time": {
+ "type": "boolean",
+ "default": false,
+ "readOnly": true,
+ "description": "Use sensor time for published sensor data."
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/schema/sub/type_vendor.template.json b/nebula_ros/schema/sub/type_vendor.template.json
new file mode 100644
index 000000000..53a7ca6be
--- /dev/null
+++ b/nebula_ros/schema/sub/type_vendor.template.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": " parameters.",
+ "type": "object",
+ "definitions": {
+ "sensor_model": {
+ "$ref": "hardware.json#/definitions/sensor_model",
+ "enum": [
+ "",
+ ""
+ ]
+ },
+ "example_parameter_1": {
+ "type": "integer",
+ "default": 42,
+ "readOnly": true,
+ "description": "Exclusive parameter only for specific sensor vendor."
+ },
+ "example_parameter_2": {
+ "$ref": "communication.json#/definitions/example_parameter_2",
+ "maximum": 100,
+ "$comment": "Shared parameter, but needs some changes only for this sensor vendor."
+ },
+ "example_parameter_3": {
+ "$ref": "hardware.json#/definitions/example_parameter_3",
+ "$comment": "Wrong! If no changes declare parameter in schema/.schema.json."
+ }
+ }
+}
\ No newline at end of file
diff --git a/nebula_ros/src/hesai/decoder_wrapper.cpp b/nebula_ros/src/hesai/decoder_wrapper.cpp
index 6da62b273..bb18789fe 100644
--- a/nebula_ros/src/hesai/decoder_wrapper.cpp
+++ b/nebula_ros/src/hesai/decoder_wrapper.cpp
@@ -22,10 +22,10 @@ HesaiDecoderWrapper::HesaiDecoderWrapper(
if (config->sensor_model == drivers::SensorModel::HESAI_PANDARAT128) {
calibration_file_path_ =
- parent_node->declare_parameter("correction_file", "", param_read_write());
+ parent_node->declare_parameter("correction_file", param_read_write());
} else {
calibration_file_path_ =
- parent_node->declare_parameter("calibration_file", "", param_read_write());
+ parent_node->declare_parameter("calibration_file", param_read_write());
}
auto calibration_result = GetCalibrationData(calibration_file_path_, false);
diff --git a/nebula_ros/src/hesai/hesai_ros_wrapper.cpp b/nebula_ros/src/hesai/hesai_ros_wrapper.cpp
index 8449bdfe5..4c965aee5 100644
--- a/nebula_ros/src/hesai/hesai_ros_wrapper.cpp
+++ b/nebula_ros/src/hesai/hesai_ros_wrapper.cpp
@@ -65,68 +65,65 @@ nebula::Status HesaiRosWrapper::DeclareAndGetSensorConfigParams()
{
nebula::drivers::HesaiSensorConfiguration config;
- auto _sensor_model = declare_parameter("sensor_model", "", param_read_only());
+ auto _sensor_model = declare_parameter("sensor_model", param_read_only());
config.sensor_model = drivers::SensorModelFromString(_sensor_model);
- auto _return_mode = declare_parameter("return_mode", "", param_read_write());
+ auto _return_mode = declare_parameter("return_mode", param_read_write());
config.return_mode = drivers::ReturnModeFromStringHesai(_return_mode, config.sensor_model);
- config.host_ip = declare_parameter("host_ip", "255.255.255.255", param_read_only());
+ config.host_ip = declare_parameter("host_ip", param_read_only());
config.sensor_ip =
- declare_parameter("sensor_ip", "192.168.1.201", param_read_only());
- config.data_port = declare_parameter("data_port", 2368, param_read_only());
- config.gnss_port = declare_parameter("gnss_port", 2369, param_read_only());
- config.frame_id = declare_parameter("frame_id", "pandar", param_read_write());
+ declare_parameter("sensor_ip", param_read_only());
+ config.data_port = declare_parameter("data_port", param_read_only());
+ config.gnss_port = declare_parameter("gnss_port", param_read_only());
+ config.frame_id = declare_parameter("frame_id", param_read_write());
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "Angle where scans begin (degrees, [0.,360.])";
descriptor.floating_point_range = float_range(0, 360, 0.01);
- config.scan_phase = declare_parameter("scan_phase", 0., descriptor);
+ config.scan_phase = declare_parameter("scan_phase", descriptor);
}
- config.min_range = declare_parameter("min_range", 0.3, param_read_write());
- config.max_range = declare_parameter("max_range", 300., param_read_write());
- config.packet_mtu_size = declare_parameter("packet_mtu_size", 1500, param_read_only());
+ config.min_range = declare_parameter("min_range", param_read_write());
+ config.max_range = declare_parameter("max_range", param_read_write());
+ config.packet_mtu_size = declare_parameter("packet_mtu_size", param_read_only());
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
- uint16_t default_value;
RCLCPP_DEBUG_STREAM(get_logger(), config.sensor_model);
if (config.sensor_model == nebula::drivers::SensorModel::HESAI_PANDARAT128) {
descriptor.additional_constraints = "200, 400";
descriptor.integer_range = int_range(200, 400, 200);
- default_value = 200;
} else {
descriptor.additional_constraints = "300, 600, 1200";
descriptor.integer_range = int_range(300, 1200, 300);
- default_value = 600;
}
config.rotation_speed =
- declare_parameter("rotation_speed", default_value, descriptor);
+ declare_parameter("rotation_speed", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.integer_range = int_range(0, 360, 1);
- config.cloud_min_angle = declare_parameter("cloud_min_angle", 0, descriptor);
+ config.cloud_min_angle = declare_parameter("cloud_min_angle", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.integer_range = int_range(0, 360, 1);
- config.cloud_max_angle = declare_parameter("cloud_max_angle", 360, descriptor);
+ config.cloud_max_angle = declare_parameter("cloud_max_angle", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "Dual return distance threshold [0.01, 0.5]";
descriptor.floating_point_range = float_range(0.01, 0.5, 0.01);
config.dual_return_distance_threshold =
- declare_parameter("dual_return_distance_threshold", 0.1, descriptor);
+ declare_parameter("dual_return_distance_threshold", descriptor);
}
- auto _ptp_profile = declare_parameter("ptp_profile", "", param_read_only());
+ auto _ptp_profile = declare_parameter("ptp_profile", param_read_only());
config.ptp_profile = drivers::PtpProfileFromString(_ptp_profile);
- auto _ptp_transport = declare_parameter("ptp_transport_type", "", param_read_only());
+ auto _ptp_transport = declare_parameter("ptp_transport_type", param_read_only());
config.ptp_transport_type = drivers::PtpTransportTypeFromString(_ptp_transport);
if (
@@ -141,13 +138,13 @@ nebula::Status HesaiRosWrapper::DeclareAndGetSensorConfigParams()
set_parameter(rclcpp::Parameter("ptp_transport_type", "L2"));
}
- auto _ptp_switch = declare_parameter("ptp_switch_type", "", param_read_only());
+ auto _ptp_switch = declare_parameter("ptp_switch_type", param_read_only());
config.ptp_switch_type = drivers::PtpSwitchTypeFromString(_ptp_switch);
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_only();
descriptor.integer_range = int_range(0, 127, 1);
- config.ptp_domain = declare_parameter("ptp_domain", 0, descriptor);
+ config.ptp_domain = declare_parameter("ptp_domain", descriptor);
}
auto new_cfg_ptr = std::make_shared(config);
diff --git a/nebula_ros/src/hesai/hw_interface_wrapper.cpp b/nebula_ros/src/hesai/hw_interface_wrapper.cpp
index 18da9da83..dd93f7d96 100644
--- a/nebula_ros/src/hesai/hw_interface_wrapper.cpp
+++ b/nebula_ros/src/hesai/hw_interface_wrapper.cpp
@@ -12,8 +12,8 @@ HesaiHwInterfaceWrapper::HesaiHwInterfaceWrapper(
logger_(parent_node->get_logger().get_child("HwInterface")),
status_(Status::NOT_INITIALIZED)
{
- setup_sensor_ = parent_node->declare_parameter("setup_sensor", true, param_read_only());
- bool retry_connect = parent_node->declare_parameter("retry_hw", true, param_read_only());
+ setup_sensor_ = parent_node->declare_parameter("setup_sensor", param_read_only());
+ bool retry_connect = parent_node->declare_parameter("retry_hw", param_read_only());
status_ = hw_interface_->SetSensorConfiguration(
std::static_pointer_cast(config));
diff --git a/nebula_ros/src/hesai/hw_monitor_wrapper.cpp b/nebula_ros/src/hesai/hw_monitor_wrapper.cpp
index da1f78794..721da5502 100644
--- a/nebula_ros/src/hesai/hw_monitor_wrapper.cpp
+++ b/nebula_ros/src/hesai/hw_monitor_wrapper.cpp
@@ -14,7 +14,7 @@ HesaiHwMonitorWrapper::HesaiHwMonitorWrapper(
hw_interface_(hw_interface),
parent_node_(parent_node)
{
- diag_span_ = parent_node->declare_parameter("diag_span", 1000, param_read_only());
+ diag_span_ = parent_node->declare_parameter("diag_span", param_read_only());
switch (config->sensor_model) {
case nebula::drivers::SensorModel::HESAI_PANDARXT32:
diff --git a/nebula_ros/src/robosense/hw_monitor_wrapper.cpp b/nebula_ros/src/robosense/hw_monitor_wrapper.cpp
index 2ff5d6d78..3cb3cdba6 100644
--- a/nebula_ros/src/robosense/hw_monitor_wrapper.cpp
+++ b/nebula_ros/src/robosense/hw_monitor_wrapper.cpp
@@ -16,7 +16,7 @@ RobosenseHwMonitorWrapper::RobosenseHwMonitorWrapper(
sensor_cfg_ptr_(config)
{
auto descriptor = param_read_only().set__additional_constraints("milliseconds");
- diag_span_ = parent_->declare_parameter("diag_span", 1000, descriptor);
+ diag_span_ = parent_->declare_parameter("diag_span", descriptor);
}
void RobosenseHwMonitorWrapper::InitializeRobosenseDiagnostics()
diff --git a/nebula_ros/src/robosense/robosense_ros_wrapper.cpp b/nebula_ros/src/robosense/robosense_ros_wrapper.cpp
index 3d2e88caf..3fb2978aa 100644
--- a/nebula_ros/src/robosense/robosense_ros_wrapper.cpp
+++ b/nebula_ros/src/robosense/robosense_ros_wrapper.cpp
@@ -65,31 +65,31 @@ nebula::Status RobosenseRosWrapper::DeclareAndGetSensorConfigParams()
{
nebula::drivers::RobosenseSensorConfiguration config;
- auto _sensor_model = declare_parameter("sensor_model", "", param_read_only());
+ auto _sensor_model = declare_parameter("sensor_model", param_read_only());
config.sensor_model = drivers::SensorModelFromString(_sensor_model);
- auto _return_mode = declare_parameter("return_mode", "", param_read_write());
+ auto _return_mode = declare_parameter("return_mode", param_read_write());
config.return_mode = drivers::ReturnModeFromStringRobosense(_return_mode);
- config.host_ip = declare_parameter("host_ip", "255.255.255.255", param_read_only());
+ config.host_ip = declare_parameter("host_ip", param_read_only());
config.sensor_ip =
- declare_parameter("sensor_ip", "192.168.1.201", param_read_only());
- config.data_port = declare_parameter("data_port", 2368, param_read_only());
- config.gnss_port = declare_parameter("gnss_port", 2369, param_read_only());
- config.frame_id = declare_parameter("frame_id", "pandar", param_read_write());
+ declare_parameter("sensor_ip", param_read_only());
+ config.data_port = declare_parameter("data_port", param_read_only());
+ config.gnss_port = declare_parameter("gnss_port", param_read_only());
+ config.frame_id = declare_parameter("frame_id", param_read_write());
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "Angle where scans begin (degrees, [0.,360.])";
descriptor.floating_point_range = float_range(0, 360, 0.01);
- config.scan_phase = declare_parameter("scan_phase", 0., descriptor);
+ config.scan_phase = declare_parameter("scan_phase", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "Dual return distance threshold [0.01, 0.5]";
descriptor.floating_point_range = float_range(0.01, 0.5, 0.01);
config.dual_return_distance_threshold =
- declare_parameter("dual_return_distance_threshold", 0.1, descriptor);
+ declare_parameter("dual_return_distance_threshold", descriptor);
}
auto new_cfg_ptr = std::make_shared(config);
diff --git a/nebula_ros/src/velodyne/decoder_wrapper.cpp b/nebula_ros/src/velodyne/decoder_wrapper.cpp
index 9a9c11920..e2fbeb721 100644
--- a/nebula_ros/src/velodyne/decoder_wrapper.cpp
+++ b/nebula_ros/src/velodyne/decoder_wrapper.cpp
@@ -22,7 +22,7 @@ VelodyneDecoderWrapper::VelodyneDecoderWrapper(
}
calibration_file_path_ =
- parent_node->declare_parameter("calibration_file", "", param_read_write());
+ parent_node->declare_parameter("calibration_file", param_read_write());
auto calibration_result = GetCalibrationData(calibration_file_path_);
if (!calibration_result.has_value()) {
diff --git a/nebula_ros/src/velodyne/hw_interface_wrapper.cpp b/nebula_ros/src/velodyne/hw_interface_wrapper.cpp
index 9e350e98c..159f31380 100644
--- a/nebula_ros/src/velodyne/hw_interface_wrapper.cpp
+++ b/nebula_ros/src/velodyne/hw_interface_wrapper.cpp
@@ -12,7 +12,7 @@ VelodyneHwInterfaceWrapper::VelodyneHwInterfaceWrapper(
logger_(parent_node->get_logger().get_child("HwInterfaceWrapper")),
status_(Status::NOT_INITIALIZED)
{
- setup_sensor_ = parent_node->declare_parameter("setup_sensor", true, param_read_only());
+ setup_sensor_ = parent_node->declare_parameter("setup_sensor", param_read_only());
hw_interface_->SetLogger(
std::make_shared(parent_node->get_logger().get_child("HwInterface")));
diff --git a/nebula_ros/src/velodyne/hw_monitor_wrapper.cpp b/nebula_ros/src/velodyne/hw_monitor_wrapper.cpp
index a3bd9e6a5..945a6d650 100644
--- a/nebula_ros/src/velodyne/hw_monitor_wrapper.cpp
+++ b/nebula_ros/src/velodyne/hw_monitor_wrapper.cpp
@@ -15,9 +15,9 @@ VelodyneHwMonitorWrapper::VelodyneHwMonitorWrapper(
parent_node_(parent_node),
sensor_configuration_(config)
{
- diag_span_ = parent_node->declare_parameter("diag_span", 1000, param_read_only());
+ diag_span_ = parent_node->declare_parameter("diag_span", param_read_only());
show_advanced_diagnostics_ =
- parent_node->declare_parameter("advanced_diagnostics", false, param_read_only());
+ parent_node->declare_parameter("advanced_diagnostics", param_read_only());
std::cout << "Get model name and serial." << std::endl;
auto str = hw_interface_->GetSnapshot();
diff --git a/nebula_ros/src/velodyne/velodyne_ros_wrapper.cpp b/nebula_ros/src/velodyne/velodyne_ros_wrapper.cpp
index 46e7a76b3..a8e8cf5d6 100644
--- a/nebula_ros/src/velodyne/velodyne_ros_wrapper.cpp
+++ b/nebula_ros/src/velodyne/velodyne_ros_wrapper.cpp
@@ -65,45 +65,45 @@ nebula::Status VelodyneRosWrapper::DeclareAndGetSensorConfigParams()
{
nebula::drivers::VelodyneSensorConfiguration config;
- auto _sensor_model = declare_parameter("sensor_model", "", param_read_only());
+ auto _sensor_model = declare_parameter("sensor_model", param_read_only());
config.sensor_model = drivers::SensorModelFromString(_sensor_model);
- auto _return_mode = declare_parameter("return_mode", "", param_read_write());
+ auto _return_mode = declare_parameter("return_mode", param_read_write());
config.return_mode = drivers::ReturnModeFromString(_return_mode);
- config.host_ip = declare_parameter("host_ip", "255.255.255.255", param_read_only());
+ config.host_ip = declare_parameter("host_ip", param_read_only());
config.sensor_ip =
- declare_parameter("sensor_ip", "192.168.1.201", param_read_only());
- config.data_port = declare_parameter("data_port", 2368, param_read_only());
- config.gnss_port = declare_parameter("gnss_port", 2369, param_read_only());
- config.frame_id = declare_parameter("frame_id", "pandar", param_read_write());
+ declare_parameter("sensor_ip", param_read_only());
+ config.data_port = declare_parameter("data_port", param_read_only());
+ config.gnss_port = declare_parameter("gnss_port", param_read_only());
+ config.frame_id = declare_parameter("frame_id", param_read_write());
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "Angle where scans begin (degrees, [0.,360.])";
descriptor.floating_point_range = float_range(0, 360, 0.01);
- config.scan_phase = declare_parameter("scan_phase", 0., descriptor);
+ config.scan_phase = declare_parameter("scan_phase", descriptor);
}
- config.min_range = declare_parameter("min_range", 0.3, param_read_write());
- config.max_range = declare_parameter("max_range", 300., param_read_write());
- config.packet_mtu_size = declare_parameter("packet_mtu_size", 1500, param_read_only());
+ config.min_range = declare_parameter("min_range", param_read_write());
+ config.max_range = declare_parameter("max_range", param_read_write());
+ config.packet_mtu_size = declare_parameter("packet_mtu_size", param_read_only());
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.additional_constraints = "from 300 to 1200, in increments of 60";
descriptor.integer_range = int_range(300, 1200, 60);
- config.rotation_speed = declare_parameter("rotation_speed", 600, descriptor);
+ config.rotation_speed = declare_parameter("rotation_speed", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.integer_range = int_range(0, 360, 1);
- config.cloud_min_angle = declare_parameter("cloud_min_angle", 0, descriptor);
+ config.cloud_min_angle = declare_parameter("cloud_min_angle", descriptor);
}
{
rcl_interfaces::msg::ParameterDescriptor descriptor = param_read_write();
descriptor.integer_range = int_range(0, 360, 1);
- config.cloud_max_angle = declare_parameter("cloud_max_angle", 360, descriptor);
+ config.cloud_max_angle = declare_parameter("cloud_max_angle", descriptor);
}
auto new_cfg_ptr = std::make_shared(config);