预检补上 arm_control 孤儿与 mock 的 joint_state_publisher
上一轮残留的那四条孤儿(real_trajectory_adapter / named_pose_server /
arm_status_node / joint_state_publisher)在预检里**一条都报不出来**:
老的六条模式只覆盖 ros2_control_node 和 stack.launch,而它们的特征恰恰是
"栈的主体已经没了、只剩它们",所以两条老模式全都匹配不到。
补两条:
· `install/arm_control/lib/arm_control/` —— 一次覆盖该包全部节点
(用 install/ 而不是 install_sim/:仿真同名节点不该被真机体检误报,
"install_sim/" 不含子串 "install/",这条性质用测试钉住了);
· `joint_state_publisher` —— mock 专用节点,真机上出现 = 上一轮 mock 栈的
残留。它发的**静态** /joint_states 会盖掉真实关节角,是"控制器一切正常、
TF 显示臂没动"这个假象的元凶,所以说明里把它写清楚。
人工动作也改成先指向新的 stop_real.sh(它真能带走这些孤儿),保留手动 pkill 兜底。
新增 3 项单测(含"不许误报 install_sim/"的负向用例)。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -68,6 +68,29 @@ LEFTOVER_PATTERNS: Tuple[Tuple[str, str], ...] = (
|
||||
("arm_application/tactile", "触觉服务还在跑(V4L 独占)"),
|
||||
("dh_pgea", "夹爪节点还在跑(串口独占)"),
|
||||
("controller_manager/spawner", "孤儿 spawner 还在等 controller_manager"),
|
||||
# ↓ 2026-09-28 实测补的:这一族**独立于** ros2_control_node 存活。
|
||||
# `ros2 launch` 被 Ctrl-C / 崩掉时,子进程不一定跟着退;而下面这几条
|
||||
# 恰恰是"栈的主体已经没了、只剩它们"的那个状态 —— 上面两条模式全都
|
||||
# 匹配不到(`ros2_control_node` 已退、`stack.launch` 的命令行也没了)。
|
||||
# 留着的危害不是"占资源",而是**冒名顶替**:残留的
|
||||
# real_trajectory_adapter 照样订阅 /trajectory、named_pose_server 照样
|
||||
# 提供 /set_named_pose、arm_status_node 照样发 /arm_status,于是新一轮
|
||||
# 的请求被 DDS 负载均衡到"残留的那个",日志上看不出任何异常,现象是
|
||||
# "指令发了、臂没动"或"状态跳来跳去"。仿真侧早在 sim_procs.sh 的注释里
|
||||
# 记过同一个坑(两个适配器同时跑 → 开口恒为 0mm),真机这边的表当时没同步。
|
||||
# 用 `install/`(不是 install_sim/)前缀:仿真的同名节点在 install_sim/ 下,
|
||||
# 不该被真机体检误报。
|
||||
(
|
||||
"install/arm_control/lib/arm_control/",
|
||||
"arm_control 的节点还在跑(trajectory_bridge / real_trajectory_adapter / "
|
||||
"named_pose_server / arm_status_node 会继续接发 /trajectory、/set_named_pose、"
|
||||
"/arm_status,新一轮的调用可能被发给残留的那个)",
|
||||
),
|
||||
(
|
||||
"joint_state_publisher",
|
||||
"joint_state_publisher 还在跑(**mock 专用**节点:它发的 /joint_states 会盖掉"
|
||||
"真实关节角,TF 看着像'臂根本没动',而控制器那边其实一切正常)",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -196,8 +219,11 @@ def check_leftovers(
|
||||
LEVEL_WARN,
|
||||
["上一轮有进程没退干净,这一轮的现象会指向别处:"] + [f" · {h}" for h in hits],
|
||||
actions=[
|
||||
"先清干净再起栈:pkill -f '[r]os2_control_node';"
|
||||
"pkill -f '[a]rm_bringup.*stack.launch';pkill -f '[s]pawner'"
|
||||
"先清干净再起栈:bash scripts/stop_real.sh"
|
||||
"(按 install/ 前缀兜底扫 + 按 ROS_DOMAIN_ID 避开仿真进程,能带走上面这些孤儿;"
|
||||
"没有它时手动清:pkill -f '[r]os2_control_node';"
|
||||
"pkill -f '[a]rm_bringup.*stack.launch';pkill -f '[s]pawner';"
|
||||
"pkill -f '[a]rm_control/lib/arm_control';pkill -f '[j]oint_state_publisher')"
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user