Skip to content

Architecture

In the live path, positions come only from the LiDAR driver on /cones. Color comes from projecting those centroids into camera images inside point_to_pixel. Image detections without a matching projected LiDAR point are ignored.

Hesai UDP
→ custom_ros_driver
→ /cones
→ point_to_pixel (+ cameras + /filter/twist)
→ /associated_colored_cones
→ planning

Empty /cones with healthy YOLO output is a driver or filtering problem, not a classifier problem.

TopicPublisherNotes
/conesdriverCentroid list in metres. Input to point-to-pixel.
/lidar/ground_filtereddriverPost-GnC cloud for visualization.
/lidar/logdriverDrop counters, timing, health (LidarLog).
/lidar/raw_pointsdriverConverted returns when published.
/cone_arraydriverSame centroids as ConeArray. Debug only; coloring uses /cones.
/filter/twiststate estimatorMotion model and history propagation.
/colored_conespoint-to-pixelPre-history debug (publish_pre_cone_history_debug).
/associated_colored_conespoint-to-pixelPlanning output.

point_to_pixel consumes /cones, camera frames (SeeCam by default), and /filter/twist. Twist covers LiDAR-to-camera stamp skew; at speed, uncompensated skew moves the projected pixel off the cone.

  • Driver internals are millimetres; ROS messages are metres.
  • Planning ConeArray keeps LiDAR-frame x,yx,y and sets z=0z = 0.
  • Projection matrices live in point_to_pixel/config/params.yaml.
  • imu_to_lidar converts IMU-centered twist into the LiDAR frame.

LiDAR and cameras are not hardware time-synced. Point-to-pixel selects the nearest buffered left/right frames and integrates twist across the gap. Missing twist or bad stamps produce systematic projection offset, worse when moving.

ObservationArea
Missing or sparse /conesDriver, UDP 2368, correction, GnC, DBSCAN, cutoffs (ops)
Good /cones, wrong colorsProjection, calibration, camera frames, YOLO/HSV
Pre-history OK, post-history wrongCone history. Gap-fill only on feature/perc/propagate_history
Close range OK, far range badProjection error, centroid noise, timing, history ghosts
Offset at restExtrinsics / params.yaml / camera YAML (physical calibration)
Offset only at speedTwist, imu_to_lidar, empty image deques