IEEE Transactions on Consumer Electronics, 2026
DOI: 10.1109/TCE.2026.3725136
Paper · Video · Quick start · Documentation
Dynamic environment representation from the project demonstration. Click to watch the full video.
EDOG-Map represents occupancy, uncertainty, and motion-induced conflict in a unified evidential mapping framework. It uses Dempster–Shafer theory to distinguish free, occupied, and unknown space, and identifies dynamic cells from conflicts between historical beliefs and current LiDAR observations.
The paper develops three complementary ideas:
- Explicit uncertainty: evidential mass assignments distinguish unobserved space from confidently free space.
- Conflict-driven dynamics: temporal contradictions reveal changing occupancy without particle-based velocity sampling or predefined object classes.
- Bounded local mapping: a robot-centric sliding window limits map storage as the UAV explores a larger environment.
This repository provides a Python reference pipeline for ROS 1 with a 2D grid, covering point-cloud input, evidential fusion, dynamic labeling, and map visualization; see the usage guide to get started.
Dynamic environment representation from the paper's Fig. 1. Red cells indicate detected dynamics; the camera and point-cloud views provide scene context.
The released pipeline follows this data flow:
flowchart LR
A[PointCloud2 + Odometry] --> B[Time synchronization]
B --> C[Height filtering and subsampling]
C --> D[2D measurement masses]
E[Previous grid and planar pose] --> F[Pose alignment]
D --> G[Dempster-Shafer fusion]
F --> G
G --> H[Updated masses and conflict]
H --> I[RGB grid: NPY and optional PNG]
H --> E
The LiDAR pipeline operates directly on point clouds and odometry. The grid maintains masses in (unknown, occupied, free) order; conflict is computed separately before normalization. The visualization marks cells at or above the configured conflict threshold.
![]() |
![]() |
| Campus exploration · paper Fig. 9 | Viaduct environment · paper Fig. 10 |
The ROS entry point uses Ubuntu 20.04 / ROS 1 Noetic / Python 3.8. In an existing Noetic environment, install the Python dependencies as follows:
git clone https://github.com/HKPolyU-UAV/EDOG-Map.git
cd EDOG-Map
source /opt/ros/noetic/setup.bash
python3 -m venv --system-site-packages .venv
source .venv/bin/activate
python -m pip install -r requirements.txt--system-site-packages exposes the ROS Python packages to the virtual environment. The pip package is pystream-pipeline, imported as pystream. TensorFlow and model weights are unnecessary for this LiDAR-only entry point. See the setup guide for ROS dependencies and troubleshooting.
With the Python requirements installed, this check also runs without ROS on Python 3.8–3.11:
python scripts/smoke_test.pyThe check covers mass normalization, evidential fusion, RGB rendering, and two-frame pipeline output, then automatically removes its temporary files.
Start roscore in a separate terminal, then start your LiDAR/odometry source or replay a compatible bag. From the repository root, with ROS sourced and the environment activated:
python run.py \
_lidar_topic:=/cloud_registered_body \
_odom_topic:=/Odometry \
_z_min:=0.0 \
_z_max:=5.0 \
_max_points:=30000| Input | Message type | Required convention |
|---|---|---|
| LiDAR | sensor_msgs/PointCloud2 |
Local/body-frame x, y, z in meters; optional intensity |
| Odometry | nav_msgs/Odometry |
Body pose in a consistent world frame; only x, y, yaw are used |
Align coordinate frames upstream. Provide body-frame point clouds consistent with the odometry, applying the required coordinate transformations, sensor extrinsics, and roll/pitch compensation before input. See input conventions, parameters, and bag replay.
The default destination is results/, relative to the working directory:
results/
├── 000000_dgm_pred.npy
├── 000000_dgm_pred.png
├── 000001_dgm_pred.npy
└── ...
Each .npy stores a uint8 RGB visualization, with default shape (1000, 1000, 3). PNG output is generated when Matplotlib is available. For access to the underlying evidential masses, see the output guide.
| Color | Meaning in the released renderer |
|---|---|
Gray (123, 123, 123) |
Unknown |
Black (0, 0, 0) |
Occupied |
White (255, 255, 255) |
Free |
Red (255, 0, 0) |
Conflict at or above the dynamic threshold |
Implementation notes provide further details for development and integration.
| Path | Purpose |
|---|---|
run.py |
ROS subscriptions, synchronization, filtering, and pipeline entry point |
libs/dgm.py |
Measurement masses, fusion, pose alignment, and visualization |
pipeline/ |
Stage wrappers, data containers, and file output |
libs/ogm.py |
Conventional occupancy-grid utilities outside the active entry point |
docs/usage.md |
Installation, parameters, input contract, and troubleshooting |
docs/implementation-notes.md |
Implementation details and development notes |
scripts/smoke_test.py |
Synthetic checks independent of ROS |
docs/assets/ |
Figures and compact demo preview; asset provenance |
If this work is useful in your research, please cite:
@article{tan2026edogmap,
author = {Tan, Zheng and Zhang, Zuowei and Lyu, Yang and Pan, Quan},
title = {{EDOG-Map}: Evidential Dynamic Occupancy Grid Mapping for
Consumer-Grade {UAV} Navigation in Dynamic Environments},
journal = {IEEE Transactions on Consumer Electronics},
year = {2026},
doi = {10.1109/TCE.2026.3725136},
url = {https://doi.org/10.1109/TCE.2026.3725136}
}A machine-readable citation is provided in CITATION.cff.
For setup questions and reproducible issues, use GitHub Issues. Include the environment, topic/frame conventions, parameters, and a minimal example. See CONTRIBUTING.md.
A software license has not yet been specified. Please contact the authors regarding reuse terms.



