スペースデータ Space Station OSを使ってみた
記事を確認。
「Space Station OS」は、宇宙ステーションの開発や利用に必要なソフトウェアおよびシミュレーション環境をオープンソースとして全世界に公開し、世界中の技術者が協力して宇宙ステーションの開発や利用を促進するためのプラットフォームです。世界共通の宇宙ステーションの開発および運用環境を提供します。
第一弾として、宇宙ステーションの開発に必要なソフトウェアおよびシミュレーション環境を、世界最大のソフトウェア開発プラットフォームであるGitHubにて公開しました。GitHub上では、世界中の数百万人もの開発者と共同開発を進めることができ、国境を越えた技術協力が可能となります。
「Space Station OS」は、いわば「宇宙のOS」です。コンピューター産業におけるWindowsのようなOSは、異なるハードウェアの差異を吸収し、共通の操作環境を提供することで、コンピューターの普及を促進し、インターネットという新たなインフラを生み出しました。同様に、「Space Station OS」は、異なる企業や国が開発した宇宙ステーション間で共通に動作するソフトウェアを提供し、宇宙ステーションの開発や管理、運用を容易にします。これにより、誰もが宇宙ステーション事業に参加できる時代を開きます。
OSというのとはちょっと違うような。
リポジトリを見た。
インストール手順は以下の通り。
# Install ROS 2 Humble (desktop install) https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html
# Clone Space Station OS source
$ cd /path/to/place/
$ git clone https://github.com/space-station-os/space_station_os.git
# Compile Space Station OS source
$ cd /path/to/place/space_station_os/
$ colcon build
$ source install/setup.bash
ROS 2 Humble と colcon がわからんね。
どうも、OSというよりソフトウェアスイートのようだ。
ROS 2 Humble (desktop install) の手順を確認
localeは無視してもいいとして、以下の手順で行けそう。
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop
# Replace ".bash" with your shell if you're not using bash
# Possible values are: setup.bash, setup.sh, setup.zsh
source /opt/ros/humble/setup.bash
ros-dev-tools と python3-colcon-common-extensions がないと、 colcon build でエラーになる。
ros-humble-desktop インストールするときにまとめてインストールするようにするとエラーが無くなった。
apt-get -y install ros-humble-desktop ros-dev-tools python3-colcon-common-extensions
ubuntu-desktop-minimal がないと、 Demo 起動時にエラーになる。
事前にインストールすれば良さそう。
apt-get -y install ubuntu-desktop-minimal
apt-get -y install linux-image-generic しないと、ワーニングが出る。
Ubuntu 22.04 で ubuntu-desktop-minimal をインストールしようとすると、 snap firefox の処理でフリーズする。
--no-install-recommends で回避できそう。
apt-get -y install --no-install-recommends ubuntu-desktop-minimal
vagrant up した瞬間に以下のエラーが出るようになる。
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component MachineWrap, interface IMachine
この手順は効果なし。
virtualbox を upgradeしたらなぜか動くようになった。
> winget upgrade virtualbox
見つかりました Oracle VM VirtualBox [Oracle.VirtualBox] バージョン 7.1.4
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
このパッケージには次の依存関係が必要です:
- パッケージ
Microsoft.VCRedist.2015+.x86
ダウンロード中 https://download.virtualbox.org/virtualbox/7.1.4/VirtualBox-7.1.4-165100-Win.exe
██████████████████████████████ 105 MB / 105 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
以下の処理を実行してみたところ、
# Console1
source /opt/ros/humble/setup.bash
source /home/vagrant/space_station_os/install/setup.bash
ros2 run space_station_gnc demo1b_crisis_mainengine
# Console2
source /opt/ros/humble/setup.bash
source /home/vagrant/space_station_os/install/setup.bash
ros2 launch space_station_gnc launch_gnc.py
# Console3
source /opt/ros/humble/setup.bash
source /home/vagrant/space_station_os/install/setup.bash
ros2 run rviz2 rviz2
Console3で以下のエラー。
$ ros2 run rviz2 rviz2
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
[ros2run]: Aborted
ググったら、エラー原因は、ディスプレイなしがあかん、と出てきた。いや、GUI入れたんだが・・・。
毎回sourceするのだるすぎるから.bash_profile に入れておく。
$ cat .bash_profile
source /opt/ros/humble/setup.bash
source /home/vagrant/space_station_os/install/setup.bash
ググったら、エラー原因は、ディスプレイなしがあかん、と出てきた。いや、GUI入れたんだが・・・。
たんにねぼけて、vagrant ssh経由でコマンド叩いていたせいだった・・・。ちゃんとGUI内でコマンド叩けばいけた。
vagrant up したときにvbguestのバージョンが古いですよINFOが出ていた。
> vagrant up
...
default: Guest Additions Version: 6.0.0 r127566
default: VirtualBox Version: 7.1
更新しておこう。
wget http://download.virtualbox.org/virtualbox/7.1.4/VBoxGuestAdditions_7.1.4.iso
sudo mkdir /media/VBoxGuestAdditions
sudo mount -o loop,ro VBoxGuestAdditions_7.1.4.iso /media/VBoxGuestAdditions
sudo sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run
rm VBoxGuestAdditions_7.1.4.iso
sudo umount /media/VBoxGuestAdditions
sudo rmdir /media/VBoxGuestAdditions
GNOMEがデフォルトだとフォント的にイマイチ。
GNOMEのPreferencesでCustom fontにチェック入れればMonospaceの設定が適用されて見やすくなる。
Space Station OS のdemoを実際に使っていく。
2種類のデモが提供されている。
Demo1a
2021年7月にISSで発生したナウカインシデントで何が起こり、
システムと人々がどのように反応したかを推定するシナリオ。
# Terminal 1: シナリオの説明とユーザー入力を処理
ros2 run space_station_gnc demo1a_nauka_incident_estimatate
# Terminal 2: 宇宙ステーションの推進システムと姿勢制御ダイナミクスを処理
ros2 launch space_station_gnc launch_gnc.py
# Terminal 3: ROS 2 の共通ツールである RVIZ が起動
ros2 run rviz2 rviz2
Demo1b
架空の困難なケースに備えたシナリオ。
# Terminal 1: シナリオの説明とユーザー入力を処理
ros2 run space_station_gnc demo1b_crisis_mainengine
# Terminal 2: 宇宙ステーションの推進システムと姿勢制御ダイナミクスを処理
ros2 launch space_station_gnc launch_gnc.py
# Terminal 3: ROS 2 の共通ツールである RVIZ が起動
ros2 run rviz2 rviz2
Demo1b
コマンドを実行
# Terminal 1: シナリオの説明とユーザー入力を処理
ros2 run space_station_gnc demo1b_crisis_mainengine
# Terminal 2: 宇宙ステーションの推進システムと姿勢制御ダイナミクスを処理
ros2 launch space_station_gnc launch_gnc.py
# Terminal 3: ROS 2 の共通ツールである RVIZ が起動
ros2 run rviz2 rviz2
Fixed Frameをworldに設定する
Fixed Frameを選択し、mapと書いてあるテキストボックスをworldに書き換える。
rvizのマニュアルを読むに、おそらく座標系を慣性座標系に変更していることに相当する。
参考サイト:
宇宙ステーションを配置する
左下のAddボタンを押し、RobotModelを追加する。
"Description Topic"を空白から"/robot_description"に変更する。
RVizで遊んでみる
座標系の変更
Fixed FrameをRootに変更すると、宇宙ステーションに固定された機体固定座標系になる。
Demo1a
コマンドを実行
# Terminal 1: シナリオの説明とユーザー入力を処理
ros2 run space_station_gnc demo1a_nauka_incident_estimatate
# Terminal 2: 宇宙ステーションの推進システムと姿勢制御ダイナミクスを処理
ros2 launch space_station_gnc launch_gnc.py
# Terminal 3: ROS 2 の共通ツールである RVIZ が起動
ros2 run rviz2 rviz2
Fixed Frameをworldに設定する
Fixed Frameを選択し、mapと書いてあるテキストボックスをworldに書き換える。
rvizのマニュアルを読むに、おそらく座標系を慣性座標系に変更していることに相当する。
参考サイト:
宇宙ステーションを配置する
左下のAddボタンを押し、RobotModelを追加する。
"Description Topic"を空白から"/robot_description"に変更する。
遊び方
シナリオの内容は以下のソースコードに定義されている。
シナリオは、以下の6ステップある。
000_init
100_emergency_begin
101_emergency_begin
102_emergency_reaction
103_forward_sim
104_emergency_reaction2
201_bring_back_orientation
000_init
Terminal 1 にOKを入力してdemo開始。
# Terminal 1
[INFO] [1731820947.810892451] [demo_crisis_node]: mode_demo: 000_init
Press `ok` then `enter key` to start demo
[INFO] [1731820947.811091534] [demo_crisis_node]: Received input: 000_init
ok
100_emergency_begin
Terminal 1 にOKを入力して緊急事態のシミュレーションを開始。
# Terminal 1
[INFO] [1731820996.346446519] [demo_crisis_node]: mode_demo: 100_emergency_begin
`Commander, misinjection from the docked module is detected,
over...`
`Nauka main engine with 3800N is firing unexpectedly.
It may last for about 15 minutes.
over...`
Are you ready to take actions? (Answer `ok` to react)
[INFO] [1731820996.346707395] [demo_crisis_node]: Received input: 100_emergency_begin
「コマンダー、ドッキングしたモジュールからの(スラスタの)誤噴射を確認した、どうぞ」
「3800N(ニュートン)の(推力を有する)Nakuaメインエンジンが予期せず噴射した。すくなくとも15分は続いていたようだ。」
あなたはアクションを取る用意ができていますか?
101_emergency_begin
緊急事態が開始される。
# Terminal 1
[INFO] [1731821003.850075384] [demo_crisis_node]: mode_demo: 101_emergency_begin
Emergency situation.
Nauka is forced to be commanded to bring the body to nadir, causing pitching up.Commander, this resulting acceleration and rotation has to be stopped.
Can we use the engines of the docked spacecraft to remedy the situation?
Yes... we currently have a Crew Dragon, a Progress MS-17 and a Soyuz MS-18 docked. Service module Zvezda is also available.
We could also consider using thrusters.
[INFO] [1731821003.850735001] [demo_crisis_node]: Received input: 102_emergency_reaction
「Naukaは機体を天底(Nadia)まで持っていくよう強制的に命令され、ピッチングアップ(機首の引き上げ)を引き起こす。コマンダー、この結果生じる加速と回転を止めなければなりません。」
「ドッキングしている宇宙船のエンジンを使って状況を改善することはできますか?」
「はい...現在、Crew Dragon、Progress MS-17、Soyuz MS-18がドッキングしています。サービスモジュールのZvezdaも利用可能です。スラスターの使用も検討できます。」
102_emergency_reaction
操作方法
Terminal 2に表示される角速度(Angular velocity)を見ながら、Terminal 1で回転を止めるために適切なスラスタを選択してONにする。
# Terminal 2
[attitude_dynamics-3] [INFO] [1731822101.918176866] [attitude_dynamics]: Received input: 0.000000 0.000000 0.000000
[attitude_dynamics-3] [INFO] [1731822101.918463633] [attitude_dynamics]: Angular velocity: 0.161084 -0.129709 0.048608 (deg/sec)
[attitude_dynamics-3] [INFO] [1731822101.918504315] [attitude_dynamics]: [+0.6897, +0.1648, +0.7050]
[attitude_dynamics-3] [INFO] [1731822101.918532448] [attitude_dynamics]: [+0.5064, +0.5862, -0.6324]
[attitude_dynamics-3] [INFO] [1731822101.918556589] [attitude_dynamics]: [-0.5175, +0.7932, +0.3208]
# Terminal 1
[INFO] [1731821003.850735001] [demo_crisis_node]: Received input: 102_emergency_reaction
[INFO] [1731821003.951675668] [demo_crisis_node]: mode_demo: 102_emergency_reaction
Nauka thrusters have 800N of force to bring the body to nadir, causing pitching up.
- Which engine should we fire?
1: Crew-2 Dragon, 8000N (now off)
2: Progress MS-17, 2950N (now off)
3: Progress MS-17 attitude control thruster to zenith, 130N x 2 (now off)
4: Progress MS-17 attitude control thruster to nadir, 130N x 2 (now off)
5: Soyuz MS18, 2950N (now off)
6: Zvezda main engine, 3000N (now off)
7: Zvezda attitude control thruster to zenith, 150N x 2 (now off)
8: Zvezda attitude control thruster to nadir, 150N x 2 (now off)
Enter engines to fire now... Or enter `0` for do nothing.
2
Progress main engine, turned off
103_forward_sim
102_emergency_reactionで0
を入力すると、次のシナリオに移行する。
Enter engines to fire now... Or enter `0` for do nothing.
0
[INFO] [1731821379.270566139] [demo_crisis_node]: mode_demo: 103_forward_sim
Nauka's main zenith thruster has stopped. The propellant has run out by now.
Now rotation needs to be stopped.
Naukaの天頂方向のメイン・スラスターが停止した。推進剤はもう底をついた。回転を止める必要がある。
104_emergency_reaction2
操作方法
Terminal 2に表示される角速度(Angular velocity)を見ながら、Terminal 1で回転を止めるために適切なスラスタを選択してONにする。
# Terminal 2
[attitude_dynamics-3] [INFO] [1731822101.918176866] [attitude_dynamics]: Received input: 0.000000 0.000000 0.000000
[attitude_dynamics-3] [INFO] [1731822101.918463633] [attitude_dynamics]: Angular velocity: 0.161084 -0.129709 0.048608 (deg/sec)
[attitude_dynamics-3] [INFO] [1731822101.918504315] [attitude_dynamics]: [+0.6897, +0.1648, +0.7050]
[attitude_dynamics-3] [INFO] [1731822101.918532448] [attitude_dynamics]: [+0.5064, +0.5862, -0.6324]
[attitude_dynamics-3] [INFO] [1731822101.918556589] [attitude_dynamics]: [-0.5175, +0.7932, +0.3208]
# Terminal 1
[INFO] [1731821741.082990049] [demo_crisis_node]: mode_demo: 104_emergency_reaction2
- Which engine should we fire or stop?
1: Crew-2 Dragon, 8000N (now off)
2: Progress MS-17, 2950N (now on)
3: Progress MS-17 attitude control thruster to zenith, 130N x 2 (now off)
4: Progress MS-17 attitude control thruster to nadir, 130N x 2 (now off)
5: Soyuz MS18, 2950N (now off)
6: Zvezda main engine, 3000N (now off)
7: Zvezda attitude control thruster to zenith, 150N x 2 (now off)
8: Zvezda attitude control thruster to nadir, 150N x 2 (now off)
クリア条件
XYZ軸のすべての角速度をangvel_th = 0.2 / 180.0 * M_PI; //rad/sec
以下にすると、クリアとなる。
クリア時のメッセージは以下の通り。
Progress main engine, turned off
everything is off
Body has stopped! Well done!!!
201_bring_back_orientation
シミュレーション終了。