衛星追尾のアンテナ方位・仰角の制御について

この記事は、趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト](https://www.rymansat.com/)」 がお送りする[新春アドベントカレンダー](https://qiita.com/rsp-dgkz/items/a6ff573c07dbe2c6166f)の1月29日分の投稿になります。

私はリーマンサットプロジェクトで、RSP-01の地上局：アンテナ制御に係わっています。高校生時代(NECからPC-8001が発売されるより2年前の頃）、学校側が使わずに放置していたプログラム電卓(シャープPC-5200)を使わせてもらうべく生徒会に申請して電算機同好会を創って以来、還暦過ぎた今もプログラミングやっています。（高校の文化祭では、清一色の聴牌形を入力すると、１から９までの、どの牌で上れるかを答えるプログラムを発表しました。多面聴もコレでOK :stuck_out_tongue_winking_eye:）

ここでは衛星追尾の間にアンテナの方位角と仰角とを逐次、更新していくアンテナローテータの制御について説明します。

リーマンサットプロジェクトで使っているアマチュア無線用の八木アンテナは、望遠鏡の経緯台と同様に2軸制御で、方位と仰角とを、アンテナローテータでコントロールしています。1個のアンテナローテータには、２つのローテータが組み合わせてあり、仰角側のローテータは0度から180度まで角度を変えられます。これが方位角を変えるローテータに載っているのですが、この方位角のローテータの可動範囲は 0度から450度：つまり、電車に例えると何周でもできる環状線ではなく、大江戸線のような具合で、可動範囲は1+1/4周までと、とりうる角度に上限下限が存在します。この範囲を超える場合が問題で（0度～90度と360度～450度とでは、アンテナが同じ方向を向いていても、0度～90度の方は0度をまたいで360度未満の方向に進めず、360度～450度の位置からは、450度を超えて90度以上の方向へは進めません）、この点を後に示す運用方法でカバーします。

ISSから放出されるRSP-01は、放出直後はISSとほぼ同様のコースをたどり、約90分で地球を一周すると想定されます。　ISSの軌道は赤道面に対して50数度傾いています。ISSのように高度400km程度以下を飛ぶRSP-01は、概ね、第一宇宙速度7.9km/sを少し下回る速度（例えばISSは約7.7km/s）で、1日に15周程度、地球を周回する間に、日本上空を通過する機会が2回程度あると想定され、1回に通信できる時間は、ISSが見える時と同様に、長くても10分間程度となります。例えば、東京上空を通過する場合には、北西から南東へ、あるいは、南西から北東へという具合に通過することになります。これに　地球の自転も加わって地上からの見掛けの進行方向は、少し東から西へカーブしていきます。
地上の特定の位置から、衛星と通信できる可視期間と、その期間内の方位と仰角とは、pyorbitalで求めることができます[^1]。可視期間と言っても、目視ではなくアンテナにとっての地上から通信できる期間(AOS：Acquisition of Signal から LOS：Loss of Signalまで)を意味します。AOSとLOSの間には最大仰角MEL(Maximum Elevation)をとるタイミングがあり、これら3か所での時刻は、後記の参考文献[^2]にある[aqua_orbit.py]( https://qiita.com/grinpeaceman/items/23af7733962268bd900c)に下記内容を追記することで、元のソースで得られるAOSの時刻に続けてLOS,MELの時刻が判ります。

```Python
print('次のAquaのLOS時刻[UTC]: ',
      pass_time_list[0][1].strftime('%Y/%m/%d %H:%M:%S'))
print('次のAquaのMEL時刻[UTC]: ',
      pass_time_list[0][2].strftime('%Y/%m/%d %H:%M:%S'))
```

このAOSからLOSまでの時間を細分して各時刻別の衛星の方位角・仰角をpyorbitalで予め求めておき、その時刻になったら算出した方位角、仰角へ、逐次アンテナを向けていければ良いのですが、方位角のローテータ可動範囲には、上限下限が存在するのと、ローテータの方位角を瞬間的に大きくは変化できない点をカバーするように仰角側のローテータを制御しなければなりません。アンテナ仰角を90度以上に倒せば、アンテナの方位は、方位角制御のローテータとは180度反対方向を向く事を利用します。

以下の説明では、方位角0度が真北を表し、以下時計回りに東は90度、南が180度、西が270度で、pyorbitalから直接得られる方位角は0度から360度未満, 仰角は0から90度までになります。

仰角・方位角の制御範囲としては次のケースが考えられます。
__（１）仰角 0度から90度以下を使うケース：__
　　　　　方位角は0度から360度を使用。（衛星が真北を通過しないケース）
　　　　　【pyorbitalから得られる方位角・仰角をそのまま使うケース】
__（１′）仰角 0度から90度以下を使うケース：__
 　　　　　衛星が__真北__を通過する（かつ真東は通過しない）ケース
　　　　　方位角は90度から450度までを使用。
　　　　　方位角は0度から90度に替えて360度から450度を使う。
　　　　　【360度未満 ⇔ 0度以上での方位角急変を回避】
__（２）仰角 180度から90度以上を使うケース：__
　　　　　衛星が__真北__と__真東__とを通過するケース
　　　　　仰角x度の替わりに(180-x)度として　
　　　　　方位角はpyorbitalから得られる方位角Aを180度反転させ
　　　　　(A+180) % 360　に置き換えて使うケース
　　　　【方位角360度未満⇔0度以上 と450度未満⇔90度以上との両方の境界を回避】
__（３）仰角 0度から180度まで全部使うケース：__
　　　　【 (1)か(1') と (2)との複合ケース：検討中】

__（１）__は通常のケースで、これは方位角が0度から360度の範囲を使う場合で、真北の0度前後を跨がない場合です。
__（１′）__は、360度すなわち0度の真北を跨ぐ場合、例えば方位角が360度手前の北西方向から、真北を通過して0度以上の北東方向を通過する場合です。この場合、方位角のローテータは0度から360度の範囲を使う替わりに90度から450度までの連続範囲を使うことで360度前後での方位角の急変を避けることができます。pyorbitalで得られた方位角が90度以下ならば、360度加算した角度に置き換えて使うことになります。
__（２）__は、(1’)の真北を跨ぐだけでなく真東90度も通過する場合です。衛星が地上局の北西側から北東側を通過し、南東側へ抜けるケースや、その逆方向に進む場合がこれに該当します。アンテナを、いわば __裏返し__にして使うケースです。
　　仰角を90度以上に：つまり__x__度の替わりに(__180-x__)度とし、方位角のローテータを、pyorbitalで得た値とは180度反対側に向けることより、方位角の使用範囲を：

不連続が発生する範囲の
　　　270度以上360度未満 ⇔ (0～90度または360～450度) ⇔ 90度以上
を避けて180度反対側の
  　　　90度以上180度未満 ⇔ 180度から270度 ⇔　270度以上 
までの連続する範囲内に納めることができます。

__（３)__の仰角0度から180度までを使うケースについては、実装はまだこれからですが、これは、丁度、天頂を衛星が通過するケースです。天頂で仰角が90度になった直後、瞬時に方位角側のローテータを180度回転させることはできないので、方位角のローテータはそのままで、仰角側をさらに傾けて90度以上倒すことになります。アンテナ仰角が90度超えた瞬間にアンテナ自体の方位角は、180度反対を向くことになります。

##天頂問題
悩ましい問題は、天頂<b>付近</b>を衛星が通過する場合です。この場合には、方位角が天頂付近で短時間に大きく変化します。例えば10秒間に120度以上 方位角が変化することもありえます。これに対し、360度一周するのに1分以上かかるようなローテータでは間に合わないことになります。
　このことは、経緯台の天頂問題にあたります[^3]。幸い八木アンテナの指向性は望遠鏡の視野ほどには狭くはないので、この場合も、丁度、天頂を衛星が通過する場合に似せて、アンテナ側はわざと天頂を通過させることで、急な方位角の変化に方位側ローテータが追従できなくなることを回避させることが考えられます。追尾方向に誤差を生むことになりますが、アンテナの指向特性で許される範囲内で、追従遅れよりも角度誤差が小さくなれば良いとする考え方です。　わざとそっぽに向かう制御で、いわば、例えは古いですが某空手漫画の「三角飛び」のようなものです。
![AngleControl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564037/afe8f02b-d5ad-439c-6bb8-11e40e664589.png)


例えば、上図のように天頂付近通過時に、衛星側の方位が120度変化する時間内では、方位角のローテータが60度しか回転が追い付けないケース：ここでは最大仰角となる時刻での衛星の見える方位角をAとし、衛星方位が A-60°の方からA＋60°に向かうと想定した場合では：
衛星がA-60°の位置からは、わざと方位角のローテータを反対方向に進めて、A-60°からA-120°の方位に向かわせます。アンテナの方位はA-60°からA-90°を経て、天頂通過後はA+90°からA+60°に向かいます。

途中、衛星が最大仰角をとる方位Aに到達したときには、アンテナ方位角は衛星とは、直角なA-90°になり、そこでの仰角を90度としてアンテナを天頂に向け、その後は仰角を90度以上にすることとし、方位角側のローテータをA-90°から A-120°に回転させると、アンテナ自身は A+90°から A+60°の方向を向くこととなり、衛星方位が120度変化する間に方位角のローテータは逆方向への60度回転で済ませることができるようになるわけです。A+60°で衛星の方位にアンテナ側が合流した後は、アンテナ方位を衛星に一致させる追尾を再開します。

つまり仰角の制御範囲からみればA手前までは(1)(1')で、A以降では(2)の制御に切り替えることで、仰角側ローテータは0度から180度までを使うこととなります。また、真北(360度≡0度) や　真東（90度≡450度）を通過するか否かの判別も併せて必要になるので、逆に(2)の状態から始めた場合には天頂通過後では(1)に移行して、仰角は180度から0度までを使うことになります。

このように、天頂付近を衛星が通過する場合には：

 　(a)どの程度 天頂に近づく場合には(3)の制御を行うべきか？
　　　最大仰角がどれだけ90度に近づいたら、どれだけの追従遅れが発生するのか？
　　　また、それは、わざと天頂に向かわせるのと、どちらが角度誤差が小さいか？
 　(b)最大仰角に到達する手前のどこから、逆方向に方位角の制御を切り替えるか？
 　(c)そこから天頂までの間、アンテナ仰角は、衛星側の仰角に対して、
　　どのように嵩上げして、衛星側が最大仰角を取る時刻に丁度90度になるようにするか？
　　  （線形補間も一つの便法だが、アンテナと衛星との方位角が異なる場合に
　　　角度誤差が最小になる仰角の最適解は？）
　 (d) これらの制御を、なるべく煩雑にならないように実装するには？

・・・・といった点が課題にあげられます。（ちょっとウザい:rolling_eyes:）

 これらをどうすべきかは、ローテータのとりうる最大速度と衛星速度・高度・通過位置等々に依存する問題で、今は、まだ検討中ですが2月中には片づけたいと思っています。

###終わりに
次回(2月1日)は @ad_motsuさんの [「Pythonやり直しのために「宇宙探査のためのPythonの概要」をやってみた」](https://qiita.com/ad_motsu/items/fc35b2fa0e8b5ee1b089)です。

リーマンサット・プロジェクトは「普通の人が集まって宇宙開発しよう」を合言葉に活動をしている民間団体です。
興味を持たれた方は https://www.rymansat.com/join からお気軽にどうぞ

##参考文献・リンク
[^1]: pyorbitalで軌道予測やってみた 
 https://yoheikoga.github.io/2019/07/07/my-first-pyorbital
[^2]: [Python]pyorbitalで簡単衛星軌道予測
 https://qiita.com/grinpeaceman/items/23af7733962268bd900c
[^3]: 経緯台の天頂問題と実機への反映 
 http://www2.synapse.ne.jp/haya/zeus/zenith_prob.html