Autonomous wildfire fuel-load mapping rover - GPS-guided, lidar-navigated, thermal-camera-equipped.
Full resolution: Poster.pdf
This project is grounded in field conditions near Ellensburg, WA, about 2 hours from Seattle.
One really good place to look at to assess wildfire risk are weather stations. However, weather stations are based mostly on dead-fuels, and there is little signal from actual live-fuel conditions. Pyroscope is designed to fill that gap by providing a mobile platform for collecting live-fuel data by measuring the temperature of the foilage on the ground vs the surrounding air to have a proxy for soil moisture levels.
Land managers in shrubland ecosystems need reliable surface fuel-load data to plan prescribed burns and reduce wildfire risk, but manual ground sampling is slow, expensive, and hard to scale. A major wildfire in 2012 burned much of this area, highlighting the need for better field intelligence.
Pyroscope was built to close that gap.
Pyroscope is a compact rover that carries thermal and environmental sensors and streams mission data to a dashboard in near real time.
- ROS navigation and sensor stack:
catkin_ws/src/... - FastAPI backend APIs and mission control:
application/backend - React dashboard frontend:
application
pyroscope/
├── assets/
│ ├── Poster.png
│ ├── Poster.pdf
│ └── ...
├── catkin_ws/
│ └── src/
│ ├── pyroscope_navigation/ # Coverage planner, move_base launch, safety nodes
│ ├── pyroscope_sensors/ # Sensor launch/scripts (SHT40, thermal, camera)
│ ├── transbot_bringup/ # Base driver + odometry + TF
│ ├── transbot_ctrl/ # Teleop tools
│ └── transbot_nav/ # Legacy map-based nav package
├── application/
│ ├── backend/ # FastAPI app, DB models, ROS sensor bridge
│ ├── src/ # React dashboard source
│ └── package.json
├── SENSOR_INTEGRATION_SETUP.md
└── README.md
Typical runtime uses multiple machines:
- Jetson (robot): base bringup, lidar, onboard sensors
- Remote Ubuntu PC (same ROS network):
move_base+ coverage planner (and optionally backend) - Frontend machine: React dashboard
Main autonomy path:
pyroscope_sensors/launch/jetson_bringup.launchstarts base + lidar + sensors.pyroscope_navigation/launch/coverage_mission_nav.launchstartsmove_baseand coverage planner.- Coverage planner sends waypoints;
move_baseperforms local obstacle avoidance with DWA.
- Ubuntu 18.04 with ROS Melodic for the ROS stack
- Python 3.9+ for backend
- Node.js 18+ for frontend
- MySQL 8+ for backend persistence
Install ROS navigation deps on the machine running move_base:
sudo apt install ros-melodic-move-base ros-melodic-dwa-local-planner \
ros-melodic-navfn ros-melodic-move-base-msgscd ~/pyroscope/catkin_ws
catkin_make
source devel/setup.bashcd ~/pyroscope/application/backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
alembic upgrade headSet environment in application/backend/.env (minimum):
DATABASE_URL=mysql+pymysql://<user>:<password>@localhost:3306/pyroscope_db
JWT_SECRET_KEY=<your-secret>
ROS_MASTER_URI=http://<JETSON_IP>:11311
ROS_IP=<BACKEND_PC_IP>cd ~/pyroscope/application
npm installNote: API base URL is currently hardcoded in application/src/services/api.js. Update it for your backend host.
Terminal 1 (Jetson):
source ~/pyroscope/catkin_ws/devel/setup.bash
roslaunch pyroscope_sensors jetson_bringup.launch # this is a consolidated launch file that launches all the sensors and brings up the robot sensors, lidar, and bringupThis launches:
transbot_bringup/bringup.launchrplidar_ros/rplidar.launchpyroscope_sensors/sensors.launch
Terminal 2 (Remote PC or same ROS machine):
source ~/pyroscope/catkin_ws/devel/setup.bash
# the front end takes care of this, but this could be manually run as well:
roslaunch pyroscope_navigation coverage_mission_nav.launch \
area_width:=3.0 area_height:=3.0 row_spacing:=1.0 waypoint_spacing:=1.0 \
origin_x:=0.0 origin_y:=0.0 dwell_time:=3.0 waypoint_timeout:=60.0What to expect:
move_basetopics appear (/move_base/status, costmaps, plans)/coverage/progressadvances from0/NtoN/N- Robot follows a lawnmower pattern centered around
(origin_x, origin_y)inodom - If waypoints fail repeatedly, planner attempts recovery (clear costmaps) and continues mission
Quick checks:
rostopic echo /coverage/progress
rostopic echo /move_base/status
rosrun tf tf_monitorExpected TF chain: odom -> base_link -> laser
Emergency cancel current goal:
rostopic pub -1 /move_base/cancel actionlib_msgs/GoalID '{}'Terminal 1 (Jetson):
source ~/pyroscope/catkin_ws/devel/setup.bash
roslaunch pyroscope_sensors jetson_bringup.launchTerminal 2 (Backend host):
cd ~/pyroscope/application/backend
source venv/bin/activate
python run.pyTerminal 3 (Frontend host):
cd ~/pyroscope/application
npm run devOpen dashboard: http://localhost:5173
What to expect:
- Backend on
:8000with/docsand/health - If
ROS_MASTER_URIis set, ROS sensor bridge auto-starts at backend startup /api/sensors/availabilityreturnsavailable: truewhen required topics are present- Dashboard shows live sensor data and mission controls
API sanity checks:
curl http://localhost:8000/health
curl http://localhost:8000/api/sensors/availability
curl http://localhost:8000/api/robot/mission/statusStart mission:
curl -X POST http://localhost:8000/api/robot/mission/start \
-H "Content-Type: application/json" \
-d '{"area_width":3.0,"area_height":3.0,"row_spacing":1.0,"waypoint_spacing":1.0,"origin_x":0.0,"origin_y":0.0}'Check status:
curl http://localhost:8000/api/robot/mission/statusStop mission:
curl -X POST http://localhost:8000/api/robot/mission/stopKeyboard teleop:
roslaunch transbot_ctrl transbot_keyboard.launchManual waypoint controller:
roslaunch pyroscope_navigation exploration.launch
rosrun pyroscope_navigation test_single_waypoint.py 2.0 1.0Random exploration:
roslaunch pyroscope_navigation random_exploration.launchStandalone safety layer:
roslaunch pyroscope_navigation obstacle_avoidance.launch| Launch file | Purpose |
|---|---|
catkin_ws/src/pyroscope_sensors/launch/jetson_bringup.launch |
One-command robot bringup (base + lidar + sensors) |
catkin_ws/src/pyroscope_navigation/launch/coverage_mission_nav.launch |
Primary autonomous coverage (move_base + DWA) |
catkin_ws/src/pyroscope_navigation/launch/exploration.launch |
Manual waypoint navigation |
catkin_ws/src/pyroscope_navigation/launch/random_exploration.launch |
Random walk mobility test mode |
catkin_ws/src/pyroscope_navigation/launch/obstacle_avoidance.launch |
Lidar obstacle detector + safety stop |
move_basenot found:- Install ROS nav packages listed in Prerequisites.
- Planner waits for action server then aborts:
- Confirm
coverage_mission_nav.launchis running and TF chain is valid.
- Confirm
- Sensors unavailable in backend:
- Verify
ROS_MASTER_URI/ROS_IP, then run:application/backend/scripts/diagnose_sensor_availability.sh
- Verify
- Odometry missing:
- Run
catkin_ws/src/pyroscope_navigation/scripts/check_topics.sh
- Run
- Use
coverage_mission_nav.launchas the primary autonomous mode. coverage_mission.launchis legacy and not the preferred demo path.- Very small mission areas can trigger edge-case waypoint fallback behavior.
catkin_ws/src/pyroscope_navigation/README.mdcatkin_ws/src/pyroscope_sensors/README.mdapplication/backend/SETUP.mdapplication/backend/ROS_SENSOR_SETUP.mdSENSOR_INTEGRATION_SETUP.md


