Compare commits
No commits in common. "340248a0d230dc5dd3d16725b4074e53c8946bd8" and "285178b2f90af5fb52eece58568add99ea4772ba" have entirely different histories.
340248a0d2
...
285178b2f9
@ -194,12 +194,6 @@ def generate_launch_description():
|
|||||||
description="Launch rosbridge WebSocket server (port 9090)",
|
description="Launch rosbridge WebSocket server (port 9090)",
|
||||||
)
|
)
|
||||||
|
|
||||||
enable_docking_arg = DeclareLaunchArgument(
|
|
||||||
"enable_docking",
|
|
||||||
default_value="true",
|
|
||||||
description="Launch autonomous docking behavior (auto-dock at 20% battery, Issue #489)",
|
|
||||||
)
|
|
||||||
|
|
||||||
follow_distance_arg = DeclareLaunchArgument(
|
follow_distance_arg = DeclareLaunchArgument(
|
||||||
"follow_distance",
|
"follow_distance",
|
||||||
default_value="1.5",
|
default_value="1.5",
|
||||||
@ -424,25 +418,6 @@ def generate_launch_description():
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
# ── t=7s Docking (auto-dock at 20% battery, Issue #489) ──────────────────
|
|
||||||
docking = TimerAction(
|
|
||||||
period=7.0,
|
|
||||||
actions=[
|
|
||||||
GroupAction(
|
|
||||||
condition=IfCondition(LaunchConfiguration("enable_docking")),
|
|
||||||
actions=[
|
|
||||||
LogInfo(msg="[full_stack] Starting autonomous docking (auto-trigger at 20% battery)"),
|
|
||||||
IncludeLaunchDescription(
|
|
||||||
_launch("saltybot_docking", "launch", "docking.launch.py"),
|
|
||||||
launch_arguments={
|
|
||||||
"battery_low_pct": "20.0",
|
|
||||||
}.items(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
# ── t=14s Nav2 (indoor only; SLAM needs ~8s to build initial map) ────────
|
# ── t=14s Nav2 (indoor only; SLAM needs ~8s to build initial map) ────────
|
||||||
nav2 = TimerAction(
|
nav2 = TimerAction(
|
||||||
period=14.0,
|
period=14.0,
|
||||||
@ -493,7 +468,6 @@ def generate_launch_description():
|
|||||||
enable_follower_arg,
|
enable_follower_arg,
|
||||||
enable_bridge_arg,
|
enable_bridge_arg,
|
||||||
enable_rosbridge_arg,
|
enable_rosbridge_arg,
|
||||||
enable_docking_arg,
|
|
||||||
follow_distance_arg,
|
follow_distance_arg,
|
||||||
max_linear_vel_arg,
|
max_linear_vel_arg,
|
||||||
uwb_port_a_arg,
|
uwb_port_a_arg,
|
||||||
@ -524,9 +498,6 @@ def generate_launch_description():
|
|||||||
perception,
|
perception,
|
||||||
object_detection,
|
object_detection,
|
||||||
|
|
||||||
# t=7s
|
|
||||||
docking,
|
|
||||||
|
|
||||||
# t=9s
|
# t=9s
|
||||||
follower,
|
follower,
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
ir_threshold: 0.50 # amplitude threshold for beacon detection
|
ir_threshold: 0.50 # amplitude threshold for beacon detection
|
||||||
|
|
||||||
# ── Battery thresholds ────────────────────────────────────────────────────
|
# ── Battery thresholds ────────────────────────────────────────────────────
|
||||||
battery_low_pct: 20.0 # SOC triggering auto-dock (%) — Issue #489
|
battery_low_pct: 15.0 # SOC triggering auto-dock (%)
|
||||||
battery_high_pct: 80.0 # SOC declaring charge complete (%)
|
battery_high_pct: 80.0 # SOC declaring charge complete (%)
|
||||||
|
|
||||||
# ── Visual servo ──────────────────────────────────────────────────────────
|
# ── Visual servo ──────────────────────────────────────────────────────────
|
||||||
@ -26,8 +26,8 @@
|
|||||||
k_angular: 0.80 # yaw P-gain
|
k_angular: 0.80 # yaw P-gain
|
||||||
lateral_tol_m: 0.005 # ±5 mm alignment tolerance
|
lateral_tol_m: 0.005 # ±5 mm alignment tolerance
|
||||||
contact_distance_m: 0.05 # distance below which contact is assumed (m)
|
contact_distance_m: 0.05 # distance below which contact is assumed (m)
|
||||||
max_linear_ms: 0.10 # forward speed ceiling during servo (m/s) — conservative for FC+hoverboard (Issue #475)
|
max_linear_ms: 0.10 # forward speed ceiling during servo (m/s)
|
||||||
max_angular_rads: 0.30 # yaw rate ceiling (rad/s) — conservative for FC+hoverboard (Issue #475)
|
max_angular_rads: 0.30 # yaw rate ceiling (rad/s)
|
||||||
|
|
||||||
# ── Undocking maneuver ────────────────────────────────────────────────────
|
# ── Undocking maneuver ────────────────────────────────────────────────────
|
||||||
undock_speed_ms: -0.20 # reverse speed (m/s; must be negative)
|
undock_speed_ms: -0.20 # reverse speed (m/s; must be negative)
|
||||||
|
|||||||
@ -76,7 +76,7 @@ from rclpy.qos import HistoryPolicy, QoSProfile, ReliabilityPolicy
|
|||||||
|
|
||||||
from geometry_msgs.msg import PoseStamped, Twist
|
from geometry_msgs.msg import PoseStamped, Twist
|
||||||
from sensor_msgs.msg import BatteryState, CameraInfo, Image
|
from sensor_msgs.msg import BatteryState, CameraInfo, Image
|
||||||
from std_msgs.msg import Bool, Float32, String
|
from std_msgs.msg import Bool, Float32
|
||||||
|
|
||||||
from saltybot_docking.charge_monitor import ChargeEvent, ChargeMonitor
|
from saltybot_docking.charge_monitor import ChargeEvent, ChargeMonitor
|
||||||
from saltybot_docking.dock_detector import ArucoDetector, DockPose, IRBeaconDetector
|
from saltybot_docking.dock_detector import ArucoDetector, DockPose, IRBeaconDetector
|
||||||
@ -209,9 +209,6 @@ class DockingNode(Node):
|
|||||||
self._resume_pub = self.create_publisher(
|
self._resume_pub = self.create_publisher(
|
||||||
Bool, "/saltybot/resume_mission", reliable
|
Bool, "/saltybot/resume_mission", reliable
|
||||||
)
|
)
|
||||||
self._docking_state_pub = self.create_publisher(
|
|
||||||
String, "/saltybot/docking_state", reliable
|
|
||||||
)
|
|
||||||
self._status_pub = None
|
self._status_pub = None
|
||||||
if _MSGS_OK:
|
if _MSGS_OK:
|
||||||
self._status_pub = self.create_publisher(
|
self._status_pub = self.create_publisher(
|
||||||
@ -386,11 +383,6 @@ class DockingNode(Node):
|
|||||||
self._cmd_vel_pub.publish(twist)
|
self._cmd_vel_pub.publish(twist)
|
||||||
|
|
||||||
# ── Status ────────────────────────────────────────────────────────────
|
# ── Status ────────────────────────────────────────────────────────────
|
||||||
# Publish docking state (Issue #489)
|
|
||||||
state_msg = String()
|
|
||||||
state_msg.data = out.state.value
|
|
||||||
self._docking_state_pub.publish(state_msg)
|
|
||||||
|
|
||||||
if self._status_pub is not None:
|
if self._status_pub is not None:
|
||||||
self._publish_status(inp, out)
|
self._publish_status(inp, out)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user