Changelog#
All notable changes to the ENPM605 Spring 2026 course documentation are recorded here.
v1.6.8 – Final Project Reference API Page (2026-05-04)
Final Project (assignments/final_project/code.rst)
Added a new
Reference Implementation: group0_finalpage under Final Project: Search and Rescue that publishes the API reference (class signatures, method signatures, attributes, and Google-style docstrings) for thegroup0_finalexample package. Provided as a style and structure reference: the depth of docstring detail expected for the final project, and how to organise a ROS 2 package that combines apy_treesbehavior tree, Nav2 action clients, custom services, TF broadcasting, and YAML-driven parameters.The page does not expose the source code: the reference implementation is built locally with autodoc and the rendered article body is committed as a static HTML fragment (
_code_api.html) embedded bycode.rstvia.. raw:: html.sphinx.ext.viewcodeis disabled to suppress[source]links and_modules/source pages, and aREADTHEDOCSenv-var check inconf.pyexcludes the autodoc-driving_code_source.rstfrom RTD’s build so the published site never imports the missing source modules.Added a left-sidebar contents tree (configured per-page via
html_sidebars) that lists every module → class → method/attribute. Classes are collapsed by default with a caret toggle. A search box at the top of the sidebar substring-matches the FQN: matching symbols stay visible, parent classes auto-expand, and non-matching<dl>blocks hide in the body too. Clearing the query collapses every class back. Mirrors the inline filter pattern used in the glossary search.New maintenance script
tools/render_api.pywalks the locally-built_code_source.html, extracts the article body (stripping the wrapper<section>and page-title<h1>so the embedded fragment doesn’t introduce a second H1), and emits both_code_api.htmland the Jinja sidebar template_templates/api-toc-sidebar.html. Both artifacts are committed; the script is run locally before pushing whenevergroup0_final/changes.
v1.7.0 – L14 Documentation Released, L12 Refactor (2026-05-03)
Lecture Notes (l14_lecture.rst)
Added “Prerequisites” section: workspace cleanup,
rosdepinstall,--packages-up-to lecture14_metabuild, and a Gazebo smoke-test launch.Added “Lifecycle Nodes” section: motivation for managed nodes, the four primary states (Unconfigured, Inactive, Active, Finalized) with a what-the-node-does table, and a transition-command table (
configure,activate,deactivate,cleanup,shutdown) mapping each command to itson_*callback. Includes a “Why use lifecycle nodes” rationale (controlled init order, resource management, runtime pause/resume, system coordination via Nav2’slifecycle_manager).Added “Implementing a Lifecycle Node” subsection: full
sensor_publisherwalkthrough – class declaration withrclpy_lifecycle.LifecycleNode,on_configureallocating acreate_lifecycle_publisher, aSUCCESS/FAILURE/ERRORreturn-value table, and the four transition callbacks withsuper().on_activate(state)/super().on_deactivate(state)placement notes. Closes with a CLI demonstration table (ros2 lifecycle list/get/set) and an experiment prompt.Added “Programmatic State Changes” subsection: scenario for
self_cycling_node, the auto-advertisedchange_stateservice,ChangeState.Requestpayload structure, the asynccall_async+ done-callback pattern (including a deadlock warning for blockingcall), and a demonstration table of the 5-second cycle.Added “ROS 2 Bags” section: motivation, common use cases (algorithm dev, debugging, regression testing, dataset creation, remote ops), SQLite3 vs.MCAP comparison table, MCAP plugin install command,
--storageswitching forrecordandconvert, usefulros2 bag recordflags table, and an end-to-end “Recording a Navigation Run” demo listing the six topics (/odometry/filtered,/scan,/cmd_vel,/tf,/tf_static,/map).Added “Inspecting” and “Replaying” subsections:
ros2 bag infowalkthrough,ros2 bag playflag table (--rate,--start-offset,--loop,--topics,--remap,--clock), and a warning about live-system conflicts on/tfand/cmd_vel.Added “Foxglove Studio” section: what/why, three install options (Debian, Snap, browser), loading the
nav_runbag, and a layout-import note.
Index (l14_index.rst)
Overview, learning objectives, toctree, and next steps for L14 (final regular lecture; remaining classes are status check + office hours).
Exercises (l14_exercises.rst)
Exercise 1: implement a CLI-driven
counter_publisherlifecycle node publishing"count=<n>"at 2 Hz only while Active, with a verification flow that confirms publish/pause/restart behavior across transitions.Exercise 2: extend Exercise 1 with a programmatic self-cycle – 5 s timer,
[CONFIGURE, ACTIVATE, DEACTIVATE, CLEANUP]index, asyncchange_statecall with done-callback logging, and a launch file that starts the node already cycling.Exercise 3: record a Nav2 navigation run as an MCAP bag, verify all six topics + non-zero
/tf_staticcount viaros2 bag info, and confirm the bag directory contains ametadata.yamland.mcapfile(s).Exercise 4: open the bag in Foxglove Studio and build a three-panel layout (3D with
/scan+/tf+/map, XY trajectory Plot,/cmd_velRaw Messages), then exportnav_run_layout.json.
Quiz (l14_quiz.rst)
8 multiple choice questions covering initial state,
activatesemantics,FAILUREreturn effect,create_lifecycle_publisherrationale, the auto-advertisedchange_stateservice, MCAP recommendation, the--clockflag, and/tf_staticrecording.4 true/false questions: skipping
configure, whetherros2 bag infoneeds the storage plugin, publish-before-super().on_activate(), and the Foxglove browser upload myth.3 short-answer questions: timer placement in
on_activatevs.__init__, whycall_asyncfor self-driven transitions (single-threaded executor deadlock), and the missing-mesh-in-Foxglove diagnostic (robot_description+/tf_static).
References (l14_references.rst)
Lecture 14 card summarizing all topics covered.
Lifecycle Nodes: ROS 2 design article,
rclpylifecycle source,lifecycle_msgsAPI, Nav2 lifecycle manager.ROS 2 Bags: Jazzy “Recording and Playing Back Data” tutorial,
rosbag2GitHub, MCAP file format,rosbag2_storage_mcapplugin source.Foxglove Studio: project site, top-level docs, panel reference, desktop downloads, web app, pricing / academic-access page.
Recommended Reading: Mataric A Concise Introduction to Robot Programming with ROS2, Quigley Programming Robots with ROS.
Lecture 12 – Refactor (lifecycle moved out)
Renamed the lecture from “Namespaces, Remapping, Lifecycle Nodes, and Behavior Trees” to “Namespaces, Remapping, and Behavior Trees”. Lifecycle-node coverage was moved to the new L14 to give it room to grow alongside the new programmatic-transition +
change_statematerial.Updated
l12_index.rstoverview (“three topics” instead of four; droppedlifecycle_demofrom the package list) and the schedule entry / blurb inlectures/index.rst.l12_exercises.rst: deleted Exercise 2 (“Lifecycle Node with on_shutdown”), renumbered the remaining two so the page now contains three exercises, and droppedlifecycle_demofrom the workspace-package list.l12_quiz.rst: removed all five lifecycle questions (Q2/Q6/Q11/Q13/Q16) and renumbered the remaining 11. Updated the topic blurb to drop “Lifecycle Nodes.”l12_references.rst: removed the entire Lifecycle Nodes dropdown (ROS 2 design article + “Managing a Robot” tutorial); both now appear inl14_references.rst. Updated the Lecture 12 summary card to drop the lifecycle bullet from the description.
Lectures Index (lectures/index.rst)
Added
lecture14/l14_indexto the toctree.Updated the L12 schedule row title and key-concepts cell.
Added an L14 schedule row covering lifecycle nodes (state machine, transition commands,
LifecycleNode,create_lifecycle_publisher,TransitionCallbackReturn, CLI / programmatic transitions) and ROS 2 bags (SQLite3 vs.MCAP,ros2 bag record/info/play, Foxglove visualization).
Glossary (glossary.rst)
14 new terms tied to L12 (now that lifecycle has moved to L14): Action Node (BT), Composite Node (BT), Condition Node, Decorator Node (BT), Fallback (BT) / Selector (BT), Leaf Node (BT), Memory Flag (BT), Namespace (ROS 2),
py_trees_ros, Remapping, Sequence Node, Tick (BT). The existing Behavior Tree entry was extended with a composite/leaf summary.17 new terms tied to L14: Bag (ROS 2) / ROS 2 Bag,
change_stateService,create_lifecycle_publisher, Foxglove Studio, Lifecycle Manager, Lifecycle Node, Lifecycle Publisher,LifecycleNode, MCAP,on_activate,on_cleanup,on_configure,on_deactivate,on_shutdown, Primary State (Lifecycle),rosbag2, SQLite3 Storage,TransitionCallbackReturn.
v1.6.7 – Final Project NavigateToZone Clarifications (2026-05-01)
Final Project (assignments/final_project/implementation_guide.rst)
Jump to the affected sections: NavigateToZone: The Hardest Node and State flags: _done and _success.
Replaced the brief
**Study:**paragraph and the.. important::block at the top of NavigateToZone: The Hardest Node with a more explicit.. warning::admonition contrasting Lecture 13’sBasicNavigator+ blocking-loop pattern with the final project’srclpy.action.ActionClient+ async-polling pattern. The warning calls out thatBasicNavigator.goToPose()must not be used inside a BTupdate()(it freezes the entire tree) and notes thatBasicNavigatoris still legitimately used at startup for the one-shot AMCL seed in Auto-Seeding AMCL with BasicNavigator. Closes a recurring student question about whether the L13 demo applies directly to the BT nodes.Corrected the L13 reference path inside the new warning from the stale
lecture13/mapping_navigation_demo/navigation_demo_interface.pyto the actual workspace pathlecture13/nav_demo/navigation_demo.py. Two other occurrences of the stale path remain inimplementation_guide.rst(Auto-Seeding AMCL section) andrequirements.rst(NavigateToZone table row); these are scheduled for a follow-up pass.Added a new sub-subsection State flags: _done and _success under NavigateToZone: The Hardest Node explaining, in prose only, why two boolean attributes are needed and how they relate to the goal/result futures. Covers: what each flag means and why one boolean is insufficient (three valid runtime states must be distinguishable), why the verdict is latched rather than re-derived from the futures on every tick, the lifecycle of the flags across
initialise/update/terminate, and the relationship between the transient futures and the persistent verdict. Also flags the most common student bug (forgetting to reset the flags ininitialise) by its observable symptom – “only the first zone gets visited” – so students can recognise the mistake in their own code.
v1.6.6 – Final Project Walkthrough Videos (2026-04-29)
Final Project (assignments/final_project/)
Embedded
structure_final_project.mp4inrequirements.rst(right after the Package Structure section): a file-by-file walkthrough of a workinggroup<N>_final/andgroup<N>_final_interfaces/layout.Embedded
demo_final_project.mp4inoutputs.rst(top of “Nominal Run”): full mission recording showing Gazebo, RViz, the launch terminal, and a filteredros2 topic echo /rosoutof just thesearch_and_rescuelogs.Both videos use a native HTML5
<video>tag withcontrolsandpreload="metadata"– they do not autoplay (saves bandwidth and avoids surprise audio). Wrapped in collapsible.. admonition:: ... :class: dropdown tipblocks so they are visible-on-demand rather than always expanded.Videos live under
docs/source/_static/videos/final_project/and are copied verbatim by Sphinx viahtml_static_path.
v1.6.5 – Final Project SurvivorFound memory flip (2026-04-29)
Final Project (assignments/final_project/)
Flipped
SurvivorFound Sequencefrommemory=Falsetomemory=True. The original justification (“all three children are synchronous, single-tick”) stopped being true onceNotifyBasewas refactored to the async-poll pattern in v1.6.2 –NotifyBase.update()now returnsRUNNINGfor one or more ticks while waiting on thereport_survivorfuture. Withmemory=False, eachRUNNINGtick re-evaluated the entire Sequence; re-tickingBroadcastSurvivorTFcalledzone_manager.next_survivor_id()and broadcast a fresh static TF frame, so a 2-survivor mission producedsurvivor_1throughsurvivor_4(or more) entries in/tf_static.Updated
implementation_guide.rst“Memory Flag Choices” andrubric.rst“memory flags” criterion to match.
v1.6.4 – Final Project Idiom + Spec Reconciliation (2026-04-29)
Final Project (assignments/final_project/implementation_guide.rst)
Added new “Auto-Seeding AMCL with
BasicNavigator” section under “Key Patterns and Pitfalls” with the full hardcoded(0, 0, yaw=0)setInitialPose+waitUntilNav2Activerecipe and a cross-ref to the lecture-13navigation_demo_interfacereference.Added new “Reading Auto-Declared YAML Parameters” section documenting the
automatically_declare_parameters_from_overrides=True+has_parameterguard idiom. Without this, students hitParameterAlreadyDeclaredExceptionthree times in a row (one per explicitdeclare_parametercall) and the BT script crashes silently before any logs print.Both sections expose
:ref:anchors (final-project-auto-seed-amclandfinal-project-auto-declared-params).
Final Project (assignments/final_project/requirements.rst)
Added a numbered list to the “Behavior Tree” section spelling out the five things the entry point must do, including a mandatory auto-seed step that cross-refs the implementation guide.
Added a fourth row to the launch-file actions table:
rviz2gated on arvizlaunch arg, with a note that auto-seeding makes RViz situational rather than required.Added a
final-project-parameter-filelabel so other pages can link to the schema.
Final Project (assignments/final_project/infrastructure.rst)
Replaced the launch-file code skeleton: fixed the wrong executable name (
search_and_rescue->search_and_rescue_exe), added the two service-serverNode\ s that were previously missing, added the optionalrviz2Nodegated on a launch arg, switchedlaunch_argumentsfromdict.items()to a list of tuples (avoids the MyPy union-type complaint), and addedoutput="screen"+emulate_tty=Trueeverywhere.Added a
.. note::after the “important” admonition pointing at Parameter File and Reading Auto-Declared YAML Parameters.
Final Project (assignments/final_project/final_project.rst)
Added a cross-ref from the overview’s “YAML parameter file” mention to Parameter File so students reading the project landing page know where to find the schema.
Final Project (assignments/final_project/outputs.rst)
Reordered the “Nominal Run” expected output so service-server ready logs appear before the BT loaded-zones logs (matches what students actually see now that the BT seed step blocks until Nav2 is active).
Inserted the
basic_navigatorseed/wait/ready logs between parameter loading and the first zone, plus a final “Mission complete.” line after “Reached base station.” to match the newOneShot-wrappedNavigateToBaseflow.
Final Project (assignments/final_project/rubric.rst)
Updated the “AMCL localization against the saved map” item: no longer expects a manual
2D Pose Estimateclick; instead grades that the BT entry point auto-seeds AMCL viasetInitialPoseand waits forwaitUntilNav2Activebefore ticking the tree.
v1.6.3 – Final Project NavigateToBase OneShot (2026-04-29)
Final Project (assignments/final_project/requirements.rst)
Added an “Important” admonition to the Behavior Tree section explaining that
NavigateToBasemust be wrapped inpy_trees.decorators.OneShot(policy=ON_COMPLETION). Without it, the reactive root Selector keeps re-tickingNavigateToBaseafter Patrol fails:initialise()re-sends a Nav2 goal each tick, the controller instantly reports “Reached the goal!” because the robot is already there, and the loop never settles.
Final Project (assignments/final_project/implementation_guide.rst)
Added a new subsection “Wrapping
NavigateToBasein aOneShot” under “Memory Flag Choices” with the full code snippet showing how to compose the decorator with the root Selector.Cross-referenced from the new admonition in
requirements.rstso students reading the BT spec can jump straight to the working pattern.
v1.6.2 – Final Project Service-Call Pattern in BT (2026-04-29)
Final Project (assignments/final_project/implementation_guide.rst)
Replaced the “Service Calls in BT Nodes” snippet. The previous example used
call_async+rclpy.spin_until_future_complete, which raisesRuntimeError: Executor is already spinningwhen invoked from inside apy_trees_ros.trees.BehaviourTreetick callback (the BT’s executor is already spinningtree.nodeviarclpy.spin).The new snippet teaches the canonical async-BT pattern: submit
call_asynconce on first tick, yieldRUNNINGuntilfuture.done(), then process the response on the resolving tick.Added an “Important” admonition explaining why
spin_until_future_completecannot be reused here.Updated step 11 of the recommended order to point at the new pattern (added a
:ref:cross-ref to the service-calls section).Added a
final-project-bt-service-callslabel so other pages can link to the pattern.
v1.6.1 – Final Project Parameter File Format (2026-04-29)
Final Project (assignments/final_project/requirements.rst)
Replaced the
zones:list-of-dicts YAML in the Parameter File section with azone_orderstring array plus a nestedzones.<id>mapping. ROS 2 YAML parameter files require every list element to share a primitive type, so the previous list-of-dicts form failed to load withSequence should be of same type.Added an “Important” admonition explaining why the schema is split into two collaborating fields.
Added a “Reading the parameters back” Python snippet showing how the entry point joins
zone_orderandzones.<id>.{x,y,yaw}into thelist[dict]consumed byZoneManager(theZoneManagerconstructor signature is unchanged).Updated the “selective scoping” example so the namespace-specific block references
zone_orderandzonesinstead of the oldzoneslist.
v1.6.0 – L13 Documentation Released (2026-04-26)
Lecture Notes (l13_lecture.rst)
Added “Prerequisites” section: workspace cleanup,
rosdepinstall,--packages-up-to lecture13_metabuild, and a Gazebo smoke-test launch.Added “Mapping” section: motivation for maps (planning, localization, semantics, multi-session), comparison of metric / topological / semantic representations with light/dark figure placeholders.
Added “Occupancy Grid Maps” section: grid parameters (resolution, width, height, origin), the three cell states with a values table, and light/dark figure placeholders. Bayesian / log-odds LiDAR update with worked example.
Added “The map Frame” section: full REP 105 chain table, publisher / drift / jump semantics, light/dark frame-chain figure placeholders, and a side-by-side
mapvs.odomcomparison table.Added “SLAM” section:
slam_toolboxoverview, scan matching (with figure placeholders), pose graph (with figure placeholders), loop closure (with figure placeholders), and a “How the Three Pieces Connect” subsection covering covariance and edge strength.Added “Launching slam_toolbox” subsection: key parameter table (resolution, max_laser_range, minimum_travel_distance / heading, use_scan_matching, do_loop_closing), mapping-mode demonstration, and a “drive fast vs. slow” experiment with answer.
Added “Map Saving and Loading” subsection:
map_saver_cliusage and the.pgm/.yamlformat example.Added “Navigation” section: the four navigation questions, end- to-end Nav2 demonstration table.
Added “Localization” subsection: AMCL overview, why “adaptive,” three ways to set the initial pose (RViz2, parameters, programmatically), and a SLAM vs. AMCL comparison table.
Added “Particle Filters” subsubsection: scoring a particle against the map, the predict / update / resample cycle, and light/dark figure placeholders for the cycle and for initialization vs. converged clouds.
Added “Costmaps” subsection: global vs. local costmap table, layered architecture (static, obstacle, inflation), and the robot footprint with inscribed and circumscribed radii (with light/dark figure placeholders).
Added “Planning and Control” subsection: global planner table (NavFn, Smac Hybrid A*, Theta*), local controller table (DWB, Regulated Pure Pursuit), with explanatory bullets on output topics and behavior-tree plugin selection.
Added “Behavior Trees and Recovery” subsection: Nav2 BT orchestration and recovery behaviors (Spin, Wait, Clear costmap, Back up).
Added “NavigateToPose Action API” subsection: goal / feedback / result, sending a goal from RViz2, sending a goal programmatically with
BasicNavigator. Added key-method table forBasicNavigatorand two worked examples (single goal, follow waypoints) with demonstration tables.Added “Explore Mode” subsection: simultaneous SLAM + Nav2 with
mode:=explore.
Index (l13_index.rst)
Overview, learning objectives, toctree, and next-steps for L13.
Exercises (l13_exercises.rst)
Exercise 1: build, save, and reload a map – map with
slam_toolbox, save withmap_saver_cli, and reload for AMCL navigation.Exercise 2: inflation radius and path quality – sweep four
inflation_radiusvalues, capture screenshots, and reflect on why the planner fails through narrow doorways above a threshold.Exercise 3: sequential goals with
BasicNavigator– parameterized three-goal sequence usinggoToPose, with feedback printing and result logging.Exercise 4: cancel-on-distance behavior – extend Exercise 3 with a “no-progress for 5 s” watchdog that calls
cancelTask()and continues with the next goal.
Quiz (l13_quiz.rst)
8 multiple choice questions covering occupancy-grid encoding, REP 105 jump semantics, loop closure, AMCL adaptivity, global vs. local costmaps, Smac vs. NavFn, the inflation layer, and
NavigateToPosefeedback.5 true/false questions covering AMCL initial pose parameters, inscribed vs. circumscribed radius,
slam_toolboxlocalization mode, planner-call frequency, and theBasicNavigatorwaypoint follower.4 essay questions: SLAM pipeline (scan match / pose graph / loop closure), particle-filter cycle, global vs. local costmaps, and the action goal / feedback / result triplet.
Glossary (glossary.rst)
23 new terms added: AMCL, BasicNavigator, Circumscribed Radius, Costmap, DWB Controller, Footprint, Inflation Layer, Inscribed Radius, Loop Closure,
mapFrame, Map Server,nav2_simple_commander, NavFn Planner,NavigateToPose, Occupancy Grid Map, Particle Filter, Pose Graph, Regulated Pure Pursuit, REP 105, Scan Matching, SLAM,slam_toolbox, Smac Planner.Updated
Behavior TreeandNav2entries with L13 cross-references and an expanded scope.
References (l13_references.rst)
Lecture 13 card summarizing all topics covered.
Mapping and SLAM:
nav_msgs/OccupancyGrid, REP 105, Nav2 + slam_toolbox tutorial,slam_toolboxrepository, Jazzy API.Localization (AMCL): Nav2 AMCL configuration page and
nav2_amclAPI reference.Nav2 Stack: top-level Nav2 docs, concepts overview, costmap configuration, NavFn / Smac planner configuration, DWB / RPP controller configuration, behavior trees, BehaviorTree.CPP.
NavigateToPose API: Simple Commander API, source code,
nav2_msgsaction interface.Recommended Reading: Corke’s Robotics, Vision and Control Chapter 14 and Lynch & Park’s Modern Robotics Chapter 13.
Lectures Index (lectures/index.rst)
Added
lecture13/l13_indexto the toctree.
v1.5.1 – Lecture 12 (2026-04-22)
GP 2 (gp2_requirements.rst)
Moved the
scriptsfolder in the python package for GP2
v1.5 – GP2 scripts folder (2026-04-21)
GP 2 (gp2_requirements.rst)
Moved the
scriptsfolder in the python package for GP2
v1.4.1 – GP1 AI Policy Removed (2026-04-01)
GP 1 (gp1.rst)
Removed AI tools permission from the Collaboration field.
Removed
AI_USAGE.mdfrom the package structure, suggested timeline, pre-submission checklist, and submission requirements.The AI and Academic Integrity Policy dropdown was already commented out in a prior update.
v1.4.0 – L9 Documentation Released (2026-03-28)
Lecture Notes (l9_lecture.rst)
Added “Prerequisites” section: workspace clone, shell setup, and build commands for all three demo packages (
launch_files_demo,parameters_demo,executors_demo).Added “Launch Files” section: why use launch files (six reasons), anatomy (imports,
generate_launch_description, node configuration, naming convention, two equivalent patterns with code examples), and demonstration commands.Added “Advanced Features” section: including other launch files (
IncludeLaunchDescription,FindPackageShare,PathJoinSubstitution), conditional launching (IfCondition,DeclareLaunchArgument,LaunchConfiguration,--show-args), and node grouping (GroupAction, conditional group with example).Added “Parameters” section: characteristics (supported types, node-local scope warning, CLI reference and quick inspection commands), and sensor node parameter tables (camera and LiDAR) with light/dark figure placeholders.
Added “Declaring Parameters” section: three approaches (basic declaration, declaration with
ParameterDescriptorandIntegerRange, anddeclare_parametersfor batch declaration) each with code examples.Added “Retrieving Parameters” section: when and why to retrieve, retrieval API with typed field accessors.
Added “Using Parameters” section: camera_name in logs and camera_rate as timer period control, with note on bandwidth measurement and performance gap.
Added “Setting Parameters” section: six methods (CLI, launch file, YAML file, programmatic,
ros2 param setwith callback, and launch file arguments) each with code examples and demonstration commands. Includes full on-set-parameters callback implementation and timer frequency update pattern.Added “Executors” section: overview of multi-task robotic requirements and concurrency vs. parallelism definition.
Added “Single-Threaded Executor” section: key concepts, execution timeline with light/dark figure placeholders, phase offset table, and
rclpy.spin()vs. explicit executor comparison.Added “Multi-Threaded Executor” section: overview, benefits (performance, scalability, responsiveness), challenges (race conditions, overhead), concurrency vs. parallelism with hot dog stand figures (light/dark), and the Python GIL explanation with impact on ROS 2 and conditions for true parallelism.
Added “Callback Groups” section: overview with summary figure (light/dark), mutually exclusive group (declaration, effect of
num_threads, execution timeline with light/dark figures, and timestamp table), reentrant group (declaration, fast callback timeline, slow/blocked callback timeline with light/dark figures, multiple concurrent instances warning), and comparison table.
Index (l9_index.rst)
Overview, learning objectives, toctree, and next steps for L9.
Exercises (l9_exercises.rst)
Exercise 1: Configurable Publisher – parameter declaration, CLI override,
Float64publisher controlled bypublish_rateandtopic_nameparameters.Exercise 2: Parameter File Node – YAML config file, sensor node with on-set-parameters callback, and a launch file that loads the YAML.
Exercise 3: Mutex vs Single-Threaded Comparison – slow callback demo comparing
rclpy.spin()againstMultiThreadedExecutor(num_threads=4)with aMutuallyExclusiveCallbackGroup; observation questions as code comments.Exercise 4: Reentrant Pipeline – two independent 5 Hz callbacks sharing a log list, deliberate race condition introduction and fix with
threading.Lock, written reflection on CPython list safety.
Quiz (l9_quiz.rst)
10 multiple choice questions covering launch file structure,
FindPackageShare, parameter type inference, on-set callback behavior, parameter retrieval API, executor types, mutex group semantics, reentrant group timing, the GIL, and timer frequency update patterns.10 true/false questions covering
--symlink-installand launch files,ParameterDescriptorimmutability, multi-node YAML files, multi-node executors, GIL release during sleep, reentrant safety,IfConditionbehavior,ros2 param setpersistence,GroupActionconditions, andnum_threadswith a mutex group.4 essay questions: parameter lifecycle, single vs. multi-threaded executor comparison, the Python GIL, and mutually exclusive vs. reentrant callback group comparison with concrete robotic examples.
Glossary (glossary.rst)
12 new terms added: Callback Group, ColCon Symlink Install, Conditional Launch,
DeclareLaunchArgument,generate_launch_description, Global Interpreter Lock (GIL),GroupAction,IfCondition,LaunchConfiguration, Mutually Exclusive Callback Group, Parameter Descriptor, Reentrant Callback Group.
References (l9_references.rst)
Lecture 9 card summarizing all topics covered.
ROS 2 Official Documentation: launch tutorials, parameters concept, parameters tutorial, ros2 param how-to, executors concept, callback groups how-to.
Launch File API: launch package API, launch_ros package API, YAML.org specification, launch file formats comparison.
Python Threading and the GIL: threading module, Real Python GIL article, multiprocessing module.
External Tutorials: Articulated Robotics, The Construct.
Recommended Reading: Koubaa ROS 2 series, Programming Robots with ROS 2, Silberschatz OS Concepts, David Beazley GIL talk.
v1.3.0 – L8 Documentation Released (2026-03-21)
Lecture Notes (l8_lecture.rst)
Added “What Is ROS?” section: overview, where ROS is used (transportation, manufacturing, specialized domains, emerging areas), and ROS 1 vs. ROS 2 comparison table.
Added “ROS 2 Architecture” section: process definition, monolithic vs. distributed design (with figures), core components (nodes, topics, services, actions, when to use each), pick-up-a-part task example with figure, DDS overview (application domains, key properties, resources), and QoS overview (four core policies, supported vendors, runtime inspection commands).
Added “Publish/Subscribe Model” section: node/topic/message definitions, four pub/sub rules, four communication patterns (one-to-many, many-to-one, multi-topic, bidirectional) each with a figure, introspection tools reference, and
ros2 runvs.ros2 launchcomparison table.Added “ROS 2 Setup” section: workspace layout and setup commands, colcon build flags, Python package creation workflow, package layout with directory descriptions,
package.xmlfields and dependency tags, andsetup.pyentry points and data files.Added “Writing Nodes” section: interfaces (three kinds, standard message packages,
.msgto code pipeline, primitive types vs.std_msgs, introspection commands, composite message example), minimal procedural node, OOP node with separate class and entry point, spinning (thread definition with figure, main thread and executor figure, why spinning is required,try/except/finallypattern, spinning alternatives), timers and callbacks, publishers (create, message instantiation options, publish in timer callback, run and inspect), QoS (four policies, default vs. explicit profile, predefined profiles, compatibility rules, diagnostics), and subscribers (create, named vs. lambda callbacks, complete node).Added “Communication Scenarios” section: three scenarios (no subscriber, fast subscriber, slow subscriber) each with a detailed timing table, plus a summary comparison table and diagnostic commands.
Index (l8_index.rst)
Overview, learning objectives, toctree, and next steps for L8.
Exercises (l8_exercises.rst)
Exercise 1: Periodic Logger – OOP node with timer callback and ROS 2 clock.
Exercise 2: String Publisher – publisher with
std_msgs/Stringand introspection verification.Exercise 3: String Subscriber – named callback subscriber, end-to-end verification with Exercise 2.
Exercise 4: QoS Mismatch Investigation – BEST_EFFORT publisher vs. RELIABLE subscriber, silent failure diagnosis, fix and written reflection.
Quiz (l8_quiz.rst)
10 multiple choice questions covering DDS, colcon, node lifecycle, QoS policies, spinning, message types, and timing scenarios.
10 true/false questions covering spin placement, publisher behavior, package.xml/setup.py consistency, TRANSIENT_LOCAL, symlink-install, print vs. logger, silent failures, and ros2 run.
4 essay questions: monolithic vs. distributed architecture, QoS policies with examples, spinning and the executor, and the three communication timing scenarios.
Glossary (l8_glossary.rst)
30 terms defined across 14 letter sections: Action, ament_python, Callback, colcon, DDS, Durability, Entry Point, Executor, Interface, Launch File, Message, Middleware, Node, package.xml, Process, Publisher, QoS, Queue Depth, rclpy, Reliability, ROS 2 Workspace, rosdep, RTPS, Service, Spinning, Subscriber, setup.py, Thread, Timer, Topic, Workspace Overlay.
References (l8_references.rst)
Lecture 8 card summarizing all topics covered.
ROS 2 Official Documentation: Jazzy docs, beginner tutorials, rclpy API, QoS concepts, logging, colcon docs.
DDS and Middleware: OMG DDS Portal, DDS Foundation, Fast DDS, ROS 2 DDS vendor guide.
External Tutorials: Articulated Robotics, The Construct, Real Python OOP review.
Style and Best Practices: ROS 2 Python style guide, PEP 8.
Recommended Reading: Koubaa ROS 2 series, Programming Robots with ROS 2, Silberschatz OS Concepts, OMG DDS Specification.
v1.2.0 – L6 Lecture, Exercises, and Quiz Updated (2026-03-02)
Lecture Notes (l6_lecture.rst)
Added “How Do We Achieve Abstraction?” dropdown with three levels (Documentation, Public Interface, Abstract Classes as L7 preview)
Added “How to Achieve Encapsulation” summary dropdown
Split
@propertydropdown into four separate sections: intro, Defining a Getter, Defining a Setter with Validation, and Using PropertiesAdded “Encapsulation Summary” dropdown after Read-Only Properties
Updated Class Attributes dropdown: removed
max_reachfor clarity, added shadowing warning (selfvs class name)Added full Appendix: Exception Handling section with 12 dropdowns covering: runtime errors, common built-in exceptions,
try/except, accessing the exception object, handling multiple exception types,elseclause,finallyclause, fulltrystatement,raisestatement, whyraisematters for OOP, andreturn NotImplementedvsraise NotImplementedError
Exercises (l6_exercises.rst)
Exercises 1, 2, and 3: added full
if __name__ == "__main__"blocks fromL6_exercises.pyUpdated expected output for all three exercises to match the provided main blocks
Quiz (l6_quiz.rst)
Updated quiz description to reference the exception handling appendix
Added 3 new questions (Q31–Q33) in a new “Exception Handling (Appendix)” section covering
try/exceptoutput,elseclause purpose, andValueErrorvsTypeError
Slides (ENPM605-L6-v1_0.tex)
Bumped version to v1.2
Restructured lecture into Design Phase and Implementation Phase sections
Added “Before We Start” slide referencing the appendix
Added Class Attributes slide with shadowing warning
Added “How Do We Achieve Abstraction?” slide (3 levels)
Added “How to Achieve Encapsulation” summary slide
Split
@propertycontent across separate slides (Pythonic Way, Getter, Setter, Using, Read-Only, Summary)Added Exercise 1, 2, and 3 slides with specifications
Added full Appendix: Exception Handling section (overview, try/except, else, finally, full try, raise, raise for OOP, NotImplemented vs NotImplementedError)
v1.1.0 – RWA 2 Released (2026-03-01)
RWA 2: Search and Rescue Mission Planner (new)
Assignment Overview
New assignment covering Object-Oriented Programming (Lectures 6 and 7)
Two-phase structure: Phase 1 (Design) and Phase 2 (Implementation)
Use case: Disaster Response Operation with aerial drones and ground crawlers searching a disaster zone divided into sectors
Total: 50 points (Design: 6 pts, Implementation: 44 pts)
Due: March 25, 2026
Phase 1: Design Document (6 pts)
Deliverable: single UML class diagram in PDF format (
design_document.pdf)Design phase intentionally lightened to allow students to focus on implementation
Sequence diagram removed from requirements to reduce design workload
Phase 2: Implementation (44 pts)
7 classes across 6 modules:
SensorPayload,Robot(abstract),AerialDrone,GroundCrawler,Sector,Mission,DisasterZoneOOP concepts exercised: abstraction (
abc.ABC), encapsulation (@property), inheritance (2 subclasses), polymorphism (search()/can_search()overrides), composition (Robot owns SensorPayload), aggregation (DisasterZone manages robots/sectors), association (Mission links robot to sector)Dunder methods required:
__str__,__repr__,__eq__,__lt__,__len__,__contains__Main program (9 pts) demonstrates polymorphism, sorting,
__contains__, and report generation
AI Policy
Explicit policy added: AI tools (Copilot, ChatGPT, Claude, etc.) are NOT permitted for code or design
Students instructed to disable GitHub Copilot and other AI extensions in VS Code before starting
Exception: AI may be used to generate docstring documentation after code is written by the student
Other Details
Project naming convention:
firstname_lastname_rwa2/Suggested 3-week timeline included with day-by-day breakdown
All major sections wrapped in
.. dropdown::directives for collapsible navigationUse case separated into subsections using
.. rubric::directives (Robots, Common Robot Characteristics, Sensor Payload, Sectors, Missions, Disaster Zone)
v1.0.0 – Initial Release (2026-01-27)
Initial release of the ENPM605 Spring 2026 course documentation.
Course Structure
Lectures 1 through 6 published with lecture notes, exercises, quizzes, glossaries, and references
Each lecture organized as a self-contained folder with RST files following a consistent structure
RWA 1: Robot Fleet Monitor
First assignment covering Lectures 1 through 4 (variables, data types, control flow, functions)
30 points, 6 parts across 5 Python modules
Due: February 25, 2026