Az unwrap state service 運用メモ

結論

antenna_az_unwrap_state.json は、encoder_readout が読んでいる state_path に保存されなければ意味がない。 Docker 内の ~/.necst が永続化されていない場合、state_path = "~/.necst/antenna_az_unwrap_state.json" のまま運用すると、container 再作成で branch state が消える危険がある。

本パッチでは、制御PCから直接 local file を書かず、encoder_readout node に ROS service call で依頼する経路を追加した。 実際に JSON を書くのは encoder_readout process なので、実行端末の ~/.necst ではなく、encoder node の state_path に書かれる。

推奨設定

Docker 内の ~ に依存しないように、観測所 TOML では永続 bind mount された絶対パスを使う。

[antenna_encoder_unwrap.az]
enabled = true
state_path = "/necst_state/antenna_az_unwrap_state.json"

Docker 起動時には host 側の永続 directory を bind mount する。

-v /persistent/necst_state:/necst_state

通常操作

encoder_readout が起動している状態で、制御PCから次を実行する。

necst az-unwrap-state status
necst az-unwrap-state set --raw-az 8.997253 --continuous-az 368.997253

または ROS executable として直接呼ぶ。

ros2 run necst necst-antenna-az-unwrap-state status
ros2 run necst necst-antenna-az-unwrap-state set --raw-az 8.997253 --continuous-az 368.997253

これらは default では encoder_readout の service を呼ぶ。

local fallback

encoder node が起動していない非常時だけ、encoder PC/container 内で明示的に --local を付けて使う。

python3 -m necst.ctrl.antenna.az_unwrap --local status
python3 -m necst.ctrl.antenna.az_unwrap --local set --raw-az 8.997253 --continuous-az 368.997253

--local は実行した process の config/state_path を直接読むため、制御PCで使うと誤った ~/.necst に書く可能性がある。 通常運用では使わない。

service 名

/necst/<OBSERVATORY>/ctrl/antenna/az_unwrap_state/get
/necst/<OBSERVATORY>/ctrl/antenna/az_unwrap_state/set

set service は raw/continuous/branch の整合性、drive range、enabled/state_path を encoder node 側で検査し、拒否時は JSON を書かない。

unwrap無効時のAz指令制限

absolute-modulo Az encoder 用の [antenna_encoder_unwrap.az] が設定されているが、enabled = false の場合、controllerはbranchを持たない。この状態で Az=370 deg のような連続Azを許すと、raw 10 deg と区別できず危険である。

そのため、本パッチでは enabled = false の間、Az指令を次のraw absolute encoder範囲に制限する。

[antenna_encoder_unwrap.az]
enabled = false
"raw_min[deg]" = 0.0
"raw_max[deg]" = 360.0

対象は次の共通経路である。

necst mount-move
operator console mount move / dry-run
Commander.antenna(... az_target_mode="mount")
horizontal_coord node が生成する最終Az command

antenna_encoder_unwrap 設定自体が存在しない望遠鏡では、この制限は入らず従来通りである。北またぎ・Az>360運用を行う場合は、enabled = true とし、progress/consoleでbranchとraw Azを確認する。