预检补上 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:
@@ -113,6 +113,53 @@ def test_leftovers_does_not_match_its_own_command_line() -> None:
|
||||
assert c.level == pf.LEVEL_OK
|
||||
|
||||
|
||||
def test_leftovers_reports_arm_control_orphans() -> None:
|
||||
"""2026-09-28 实测:栈主体早没了,只剩 arm_control 这一族**独立存活**的孤儿。
|
||||
|
||||
上面两条老模式(ros2_control_node / stack.launch)一条都匹配不到它们,
|
||||
而它们的危害是**冒名顶替**:照样接 /trajectory、照样发 /arm_status。
|
||||
"""
|
||||
ps = (
|
||||
" 100 /home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 "
|
||||
"/home/cc/ros2/install/arm_control/lib/arm_control/real_trajectory_adapter\n"
|
||||
" 200 /home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 "
|
||||
"/home/cc/ros2/install/arm_control/lib/arm_control/arm_status_node\n"
|
||||
" 300 /usr/bin/htop\n"
|
||||
)
|
||||
c = check_leftovers(ps)
|
||||
assert c.level == pf.LEVEL_WARN, "孤儿 adapter/status 必须报出来"
|
||||
assert any("arm_control" in ln for ln in c.lines)
|
||||
assert any("发给残留的那个" in ln for ln in c.lines), (
|
||||
"要说清危害是'新一轮请求被发给残留的那个',而不是含糊的'有残留'"
|
||||
)
|
||||
|
||||
|
||||
def test_leftovers_flags_mock_joint_state_publisher() -> None:
|
||||
"""joint_state_publisher 是 **mock 专用**:真机上出现 = 上一轮 mock 栈的残留。
|
||||
|
||||
它发的静态 /joint_states 会盖掉真实关节角 —— 控制器 feedback 与 reference
|
||||
完全一致(控制器没坏),TF 却显示末端一动不动。这个假象极难查,
|
||||
所以必须点名。
|
||||
"""
|
||||
ps = " 200 /usr/bin/python3 /opt/ros/humble/lib/joint_state_publisher/joint_state_publisher\n"
|
||||
c = check_leftovers(ps)
|
||||
assert c.level == pf.LEVEL_WARN
|
||||
assert any("joint_state_publisher" in ln for ln in c.lines)
|
||||
|
||||
|
||||
def test_leftovers_ignores_sim_install_prefix() -> None:
|
||||
"""仿真的同名节点在 install_sim/ 下,不该被真机体检误报。
|
||||
|
||||
"install_sim/" 不含子串 "install/"(_sim 把它截断了),这条断言就是钉住
|
||||
这个性质 —— 哪天有人把模式改成笼统的 "install",真机会对着仿真一直喊残留。
|
||||
"""
|
||||
ps = (
|
||||
" 100 /home/cc/ros2/install_sim/arm_control/lib/arm_control/arm_status_node\n"
|
||||
)
|
||||
c = check_leftovers(ps)
|
||||
assert c.level == pf.LEVEL_OK
|
||||
|
||||
|
||||
def test_network_ok_when_ping_works() -> None:
|
||||
c = check_network(0, "3 received", [], "192.168.2.101")
|
||||
assert c.level == pf.LEVEL_OK and not c.actions
|
||||
|
||||
Reference in New Issue
Block a user