Planar LiDAR
fibril_sim/planar_lidar は instantaneous scan と rolling scan の両方を扱う planar LiDAR Device です。
sample type ID は fibril_sim/planar_lidar_sample/v1 です。
MuJoCo 側の要件
site で scan origin と orientation を指定します。
site の owning body は ray cast の自己除外に使われます。
最小設定
Hokuyo UTM-30LX と UST-30LC は device profile から scan geometry、range contract、nominal timing を設定できます。
UST-30LC は複数個体の実機録画で再現した range/intensity residual を generic empirical profile として追加できます。
UST-30LC本体をvisual込みで配置する場合は、package://fibril_sim_models/mujoco/sensors/hokuyo_ust_30lc.xml をMuJoCo model assetとしてattachできます。
prefix="lidar_" でattachするとmeasurement siteは lidar_site になり、既存のComponent設定からそのまま参照できます。
このMJCF moduleは筐体visualとmeasurement frameだけを持ち、scan timingやnoiseはprofile側に残します。
*_nominal の device facet は sensor family の再利用可能な contract だけを持ちます。
hokuyo_ust_30lc_empirical は 3 個体の training/held-out で共有できた range noise、intensity-conditioned noise/dropout、return intensity residual を持ちます。
scene 固有 artifact、mounting、host/driver timing は含めません。
測定 provenance は fibril_sim_models/profiles/evidence/hokuyo_ust_30lc_empirical.md に置きます。
UTM-30LX は独立個体での再現確認が不足しているため、generic empirical profile には昇格させていません。
| Device profile | Beams | Angle | ROS range window | Resolution | Period | Beam span |
|---|---|---|---|---|---|---|
hokuyo_utm_30lx_nominal |
1081 | -135° to +135° | 0.023 m to 60 m | 1 mm | 25 ms | 18.75 ms |
hokuyo_ust_30lc_nominal |
2161 | -135° to +135° | 0.01 m to 60 m | 1 mm | 25 ms | 18.75 ms |
表の range window はメーカー保証精度範囲ではなく、実機 urg_node が publish した sensor_msgs/LaserScan の range_min / range_max contract です。
UST-30LC の reflectivity は可視色 geom_rgba とは分離し、Component config の相対NIR reflectivityとして指定します。
入射角、環境光、透明・鏡面材による実際の検出限界はまだ model 化しません。
Multi-Echo / glass transmission も現在の自己位置推定用途では使用しないため対象外です。
profile で設定される field は個別の config field で override できます。
Configuration の項目
| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
site |
string | yes | MuJoCo site name | |
profiles.device |
string | no | none | hokuyo_utm_30lx_nominal または hokuyo_ust_30lc_nominal |
profiles.empirical |
string | no | none | UST-30LC では hokuyo_ust_30lc_empirical。必要なら consuming project が installed-unit profile を追加 |
beam_count |
size_t | profile 未指定時 yes | profile | beam 数、2 以上 |
angle_min_rad |
double | profile 未指定時 yes | profile | first beam angle |
angle_max_rad |
double | profile 未指定時 yes | profile | last beam angle |
range_min |
double | profile 未指定時 yes | profile | valid minimum range |
range_max |
double | profile 未指定時 yes | profile | valid maximum range |
resolution |
double | no | profile または 0.0 |
positive の場合の range quantization step |
range_error |
mapping | no | profile または zero error | range error model |
angular_error |
mapping | no | profile または zero error | beam angle error model |
detection |
mapping | no | profile または no dropout | beam-level detection model |
intensity |
mapping | no | UST profile または disabled | return intensity / reflectivity model |
period_s |
double | profile 未指定時 yes | profile | scan start period |
phase_s |
double | no | 0.0 |
acquisition phase |
latency_s |
double | no | 0.0 |
delivery latency |
jitter_s |
double | no | 0.0 |
delivery jitter standard deviation |
loss_probability |
double | no | 0.0 |
whole-scan transport loss probability |
quantization |
string | no | next_boundary |
schedule quantization |
scan_mode |
string | no | profile または instantaneous |
instantaneous または rolling |
scan_time_s |
double | rolling かつ profile 未指定時 yes | profile または 0.0 |
LaserScan scan_time 相当の scan start period metadata |
beam_span_s |
double | no | scan_time_s または profile |
first beam から last beam までの実際の nominal acquisition span |
raycast_geom_groups |
list |
no | all groups | ray cast対象に含めるMuJoCo geom group。各値は0から5、重複不可 |
raycast_geom_groups はscanのbeam数、角度、timing、range/noise/intensity modelを変更せず、MuJoCo ray castの対象集合だけを明示します。
例えばcamera描画のためにrender-only geomを同じmodelへ保持する構成では、物理形状を置くgroupだけを指定することでvisual meshを測距対象から除外できます。
省略時は全 geom group を対象にします。
range_error は次の field を持ちます。
| Field | Default | Meaning |
|---|---|---|
bias_m |
0.0 |
additive range bias |
noise_stddev_m |
0.0 |
core independent Gaussian range noise standard deviation |
intensity_noise_scale_lut |
[] |
[intensity, scale] のpiecewise-linear LUT。最終sigmaは noise_stddev_m * scale |
angular_error は次の field を持ちます。
| Field | Default | Meaning |
|---|---|---|
bias_rad |
0.0 |
beam angle bias applied before ray casting |
noise_stddev_rad |
0.0 |
independent Gaussian beam angle noise applied before ray casting |
detection は次の field を持ちます。
| Field | Default | Meaning |
|---|---|---|
dropout_probability |
0.0 |
hit が存在してもinvalid returnにする一様beam-level dropout probability |
intensity_dropout_probability_lut |
[] |
[intensity, probability] のpiecewise-linear LUT。弱いreturnだけ欠測率を上げる |
edge_depth_threshold_m |
0.0 |
隣接するvalid beamのrange差がこの値以上ならdepth edge candidate。0で無効 |
edge_dropout_probability |
0.0 |
depth edge candidateで片側1 beamをinvalidにする確率 |
invalid_return_value_m |
+inf |
no-hit / dropout / range-window外を表す出力値。finite値ならvalid range window外である必要がある |
intensity は次の field を持ちます。
| Field | Default | Meaning |
|---|---|---|
enabled |
section指定時 true |
intensity model の有効化 |
max_value |
0.0 |
intensity saturation ceiling |
reference_value |
0.0 |
reflectivity=1、reference range以下でのnominal intensity。0ならmax_valueを使用 |
resolution |
0.0 |
intensity quantization step |
default_reflectivity |
1.0 |
mapping未指定geomの相対NIR return coefficient、0以上 |
reference_range_m |
1.0 |
range attenuationの基準距離 |
range_exponent |
0.0 |
I proportional to (reference_range/range)^exponent。0なら距離依存なし |
relative_noise_stddev_lut |
[] |
[intensity, relative_sigma] のpiecewise-linear LUT |
geom_reflectivity |
{} |
MuJoCo geom名から相対NIR reflectivityへのmapping |
例えば次の設定では、black_panel のreturn intensityを強いtargetの10%として扱います。
このreflectivityは材料の物理的なNIR反射率[%]を直接表す校正値ではなく、LiDAR return strengthを与える相対係数です。
1.0 を通常の強い拡散反射targetの基準とし、retroreflectiveな対象は1を超える値を指定できます。
geom_rgba は可視色でありLiDAR波長の反射特性とは一致しないため使用しません。
angle_max_rad は angle_min_rad より大きい必要があります。
range と noise の validation は rangefinder と同じ方向の制約を持ちます。
rolling scan では 0 < beam_span_s <= scan_time_s <= period_s である必要があります。
period_s は scan の開始周期です。
Hokuyo profile では回転周期と LaserScan scan_time は 25 msですが、publishされる270°のbeam列が占める時間は time_increment * (beam_count - 1) = 18.75 ms です。
残り6.25 msは270°の公開視野外に相当します。
beam は nominal beam time に応じて各 physics boundary へまとめられ、その boundary の site pose から ray cast されます。
したがって、scan start period が 25 ms でも途中の robot motion を physics timestep の粒度で反映します。
rolling scan の最後の公開beamを取得した時刻は acquisition_time として保持し、完成したscanは scan_time_s の境界でconsumerへ渡します。
beam_span_s < scan_time_s の場合、公開視野外の時間をread-only raycast workerの完了待ちに利用するため、最後のbeam取得直後にphysics owner threadを停止しません。
この処理は beam の取得時刻を移動せず、LaserScan の header は scan start の nominal acquisition time から生成します。
Output の形式
PlanarLidarSample は angle_min_rad、angle_increment_rad、range window、ranges_m と optional intensities を持ちます。
generic configではno-hitまたはrange window外のbeamはpositive infinityです。
Hokuyo profileではdriver出力との互換性を優先し、UST-30LCは 65.533 m、UTM-30LXは 0.001 m を代表invalid sentinelとして出力します。
どちらも range_min <= range <= range_max を満たさないため、consumerはfinite判定ではなくrange windowでvalidityを判定する必要があります。
rolling scan では scan_time_s と per-beam nominal time_increment_s も設定されます。
intensity modelが無効なら intensities は空です。
有効ならrangeと同じbeam数を持ち、no-return beamは0です。
ROS bridgeはこのvectorを sensor_msgs/LaserScan.intensities へそのまま変換します。