Final Project: Search and Rescue#

Overview#

Due Date

May 9, 2026, 11:59 PM EST (preferred); May 12, 2026, 11:59 PM EST (hard deadline)

Total Points

100 points

Submission

Canvas (zip the ~/enpm605_ws/src/final_project/ folder and submit as group<N>_final_project.zip)

Collaboration

Groups of 2.

Late Policy

10% deduction per calendar day, up to 3 days. Zero after 3 days.

Peer Review

Final grade: 60% assignment grade + 40% peer review score.

Description

This is a group project (2 students per group). You will build a ROS 2 system that commands a rosbot to perform a search and rescue mission in a simulated disaster zone. The robot must:

  1. Navigate to a series of predefined search zones using Nav2.

  2. At each zone, call a simulated detection service (no vision – a simple dictionary lookup) to check for survivors.

  3. If a survivor is found, broadcast a TF frame marking their location and call a notification service to report the find.

  4. After visiting every zone, return to the base station.

The robot’s decision-making is orchestrated by a behavior tree built with py_trees and py_trees_ros. All mission parameters (search zones, base station pose, BT tick rate) are loaded from a YAML parameter file – see the Parameter File section in Requirements for the exact schema.

Learning Objectives
Behavior Trees

Design and implement a multi-level behavior tree with conditions, actions, and composites (Sequence and Selector). Understand memory=True vs memory=False for reactive and resuming behavior.

Nav2 Integration

Use the NavigateToPose action to send the robot to goal poses on a known map. Handle navigation success and failure within the behavior tree.

Custom Services

Define and implement custom .srv interfaces (DetectSurvivor and ReportSurvivor). Call them from behavior tree action nodes using synchronous service clients.

TF2 Frames

Broadcast static TF frames for discovered survivors relative to the map frame. Use tf2_ros to publish and verify transforms.

Parameter Configuration

Load mission parameters (search zones, base station pose, BT tick rate) from a YAML file. Expose at least one value as a launch argument for runtime override.

Launch File Integration

Write a Python launch file that starts all required nodes, loads the parameter file, and exposes launch arguments. Integrate with the Nav2 stack and Gazebo simulation.

Suggested Timeline

You have two weeks (April 27 → May 9, preferred; May 12 hard deadline). The schedule below is a suggestion; adjust based on your group’s pace.

Period

Duration

Tasks

Days 1 to 3

3 days

Read the assignment carefully. Review Lectures 12 and 13 (behavior trees, Nav2). Launch the simulation, build a map of the world with slam_toolbox and save it under group<N>_final/maps/ (see Build the Map), then confirm Nav2 localizes against your saved map. Create the package skeletons. Define the service interfaces. Implement the ZoneManager class and the simulated service servers (DetectSurvivor and ReportSurvivor).

Days 4 to 7

4 days

Implement the behavior tree leaf nodes: NavigateToZone, NavigateToBase, DetectSurvivor, BroadcastSurvivorTF, NotifyBase, AdvanceZone, LogNoDetection. Implement condition nodes: ZonesRemaining, IsSurvivorDetected. Test each node individually.

Days 8 to 11

4 days

Assemble the full behavior tree in the entry point script. Write the launch file. Integrate with Nav2. Test the full pipeline end to end: all zones visited, survivors detected and reported, TF frames broadcast, robot returns to base.

Days 12 to 14

3 days

Write README.md. Code quality pass (docstrings, type hints, comments, Ruff). Test edge cases (no survivor at a zone, all four zones visited, return to base). Remove cache directories. Package and submit.