Two new packages: - saltybot_emergency_msgs: EmergencyEvent.msg, RecoveryAction.msg - saltybot_emergency: threat_detector, alert_manager, recovery_sequencer, emergency_fsm, emergency_node Implements: - ObstacleDetector: MAJOR <30cm, CRITICAL <10cm; suppressed when not moving - FallDetector: MINOR/MAJOR/CRITICAL tilt thresholds; floor-drop edge detection - StuckDetector: MAJOR after 3s wheel stall (cmd>threshold, actual~0) - BumpDetector: jerk = |Δ|a||/dt with gravity removal; MAJOR/CRITICAL thresholds - AlertManager: per-(type,level) suppression; MAJOR×N within window → CRITICAL escalation - RecoverySequencer: REVERSING→TURNING→RETRYING FSM; max_retries before GAVE_UP - EmergencyFSM: NOMINAL→STOPPING→RECOVERING→ESCALATED; acknowledge to clear - EmergencyNode: 20Hz ROS2 node; /saltybot/emergency, /saltybot/e_stop, cmd_vel mux 59/59 tests passing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
33 lines
992 B
Python
33 lines
992 B
Python
from setuptools import setup, find_packages
|
|
import os
|
|
from glob import glob
|
|
|
|
package_name = "saltybot_emergency"
|
|
|
|
setup(
|
|
name=package_name,
|
|
version="0.1.0",
|
|
packages=find_packages(exclude=["test"]),
|
|
data_files=[
|
|
("share/ament_index/resource_index/packages",
|
|
[f"resource/{package_name}"]),
|
|
(f"share/{package_name}", ["package.xml"]),
|
|
(os.path.join("share", package_name, "config"),
|
|
glob("config/*.yaml")),
|
|
(os.path.join("share", package_name, "launch"),
|
|
glob("launch/*.py")),
|
|
],
|
|
install_requires=["setuptools"],
|
|
zip_safe=True,
|
|
maintainer="sl-controls",
|
|
maintainer_email="sl-controls@saltylab.local",
|
|
description="Emergency behavior system — collision avoidance, fall prevention, stuck detection, recovery",
|
|
license="MIT",
|
|
tests_require=["pytest"],
|
|
entry_points={
|
|
"console_scripts": [
|
|
f"emergency_node = {package_name}.emergency_node:main",
|
|
],
|
|
},
|
|
)
|