🛰️

Space Station OSの使い方

2024/11/17に公開1

サマリー

この記事では、株式会社スペースデータ(本社:東京都港区、代表取締役社長:佐藤航陽、以下スペースデータ)が公開した世界初の宇宙ステーション制御OSS「Space Station OS」のセットアップ方法とそのdemoシミュレーションの使い方を紹介します。

Space Station OS とは

「Space Station OS」は、日本発の宇宙ステーションの開発や利用に必要なソフトウェアおよびシミュレーション環境のプラットフォームです。

https://spacedata.jp/news/202411_ssos

「Space Station OS」は、宇宙ステーションの開発や利用に必要なソフトウェアおよびシミュレーション環境をオープンソースとして全世界に公開し、世界中の技術者が協力して宇宙ステーションの開発や利用を促進するためのプラットフォームです。世界共通の宇宙ステーションの開発および運用環境を提供します。

第一弾として、宇宙ステーションの開発に必要なソフトウェアおよびシミュレーション環境を、世界最大のソフトウェア開発プラットフォームであるGitHubにて公開しました。GitHub上では、世界中の数百万人もの開発者と共同開発を進めることができ、国境を越えた技術協力が可能となります。

「Space Station OS」は、いわば「宇宙のOS」です。コンピューター産業におけるWindowsのようなOSは、異なるハードウェアの差異を吸収し、共通の操作環境を提供することで、コンピューターの普及を促進し、インターネットという新たなインフラを生み出しました。同様に、「Space Station OS」は、異なる企業や国が開発した宇宙ステーション間で共通に動作するソフトウェアを提供し、宇宙ステーションの開発や管理、運用を容易にします。これにより、誰もが宇宙ステーション事業に参加できる時代を開きます。

宇宙ステーションの開発基盤OSSは従来存在しなかったので、世界初のOSSと言えるでしょう。

Space Station OSのロードマップによれば、いまはまだファーストリリースのPhase1ですが、2027年にはPhase4に到達して宇宙利用にふさわしい品質(Flight Ready)になるようです。

image-20241117155738415

出典:https://spacestationos.com/

楽しみですね。

実行要件

VM上でSpace Station OSを実行するため、以下のソフトウェアが必要です。

  • VirtualBox 7.x
  • Vagrant 2.4.x
  • メモリ 4GB以上、HDD容量 20GB以上、インターネットに繋がる環境

Windows ユーザーの場合は、以下のコマンドで簡単にインストールできます。

winget install vagrant virtualbox

VM起動

以下のスクリプトを実行して、VMを起動します。

git clone git@github.com:space-software-portal/space-station-os-vm.git
cd space-station-os-vm
vagrant up

このスクリプトは、Vagrantを使用して自動的にVMを作成するスクリプトです。

vagrant upを実行した瞬間に、Vagrant CloudからSpace Station OSを実行するためのUbuntu 22.04のイメージファイルのダウンロードが始まります。

ダウンロード後には、Ubuntu内に自動でSpace Station OSをインストールします。

VMの設定はVagrantfileに定義されています。

Vagrantfileの概要

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # OSとしてUbuntu 22.04を選択
  config.vm.box = "ubuntu/jammy64"
  config.vm.box_version = "20241002.0.0"

  config.vm.provider "virtualbox" do |vb|
    vb.name = "spacestation"
    vb.gui = false
    # VMが使用するCPUとメモリを指定。環境に応じてもっと増やしてOK。
    vb.cpus = 2
    vb.memory = "2048"
    vb.customize [
      "modifyvm", :id,
      # VMでGUIを使うためのビデオカードなどの設定
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--graphicscontroller", "vmsvga",
      "--accelerate3d", "on",
    ]
  end

  config.vm.provision "shell", inline: <<-SHELL
    # Install prerequirements
    apt-get -y update
    apt-get -y install --no-install-recommends linux-image-generic software-properties-common
    apt-get -y install --no-install-recommends ubuntu-desktop-minimal

    # Install ROS2
    add-apt-repository universe -y
    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" | tee /etc/apt/sources.list.d/ros2.list > /dev/null
    apt-get -y update
    apt-get -y install ros-humble-desktop ros-dev-tools python3-colcon-common-extensions
    source /opt/ros/humble/setup.bash

    # Install space station os
    cd /home/vagrant/ && git clone https://github.com/space-station-os/space_station_os.git && cd ./space_station_os/
    colcon build
    source install/setup.bash

    # Setup bash_profile
    echo "source /opt/ros/humble/setup.bash" >> /home/vagrant/.bash_profile
    echo "source /home/vagrant/space_station_os/install/setup.bash" >> /home/vagrant/.bash_profile

    # Update vbguest
    wget http://download.virtualbox.org/virtualbox/7.1.4/VBoxGuestAdditions_7.1.4.iso
    mkdir /media/VBoxGuestAdditions
    mount -o loop,ro VBoxGuestAdditions_7.1.4.iso /media/VBoxGuestAdditions
    sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run
    rm VBoxGuestAdditions_7.1.4.iso
    umount /media/VBoxGuestAdditions
    rmdir /media/VBoxGuestAdditions

    # Reboot
    shutdown -r now
  SHELL
end

デモ実行

Space Station OS の公式demoを実際にやってみましょう。

公式demoは2つのシナリオが用意されています。

  1. Demo1a

    2021年7月にISSで発生したナウカインシデントで何が起こり、システムと人々がどのように反応したかを推定するシナリオ。

    https://www.nasaspaceflight.com/2021/07/nauka-docking/

  2. Demo1b

    架空の困難なケースに備えたシナリオ。

操作方法はほぼ同じなので、Demo1aを使ってSpace Station OSの使い方を解説していきます。

demoは以下の3ステップで実行できます。

  • Step1. Space Station OSを起動する
    TerminalからSpace Station OSを起動します。

  • Step2. RVIZにシミュレーション条件を設定する
    Step1.で起動した際に表示されるRVIZにシミュレーション条件を設定します。

  • Step3. シナリオを実行する

    Terminalからシナリオを実行します。

以降では、ステップごとに手順を解説します。

Step1. Space Station OSを起動する

UbuntuのGUI上で、3つのTerminalを開いて、以下のコマンドをそれぞれ実行します。

# 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

Terminal 2とTerminal 3を実行するとそれぞれウィンドウが表示されます。

Terminal 3で表示されたRVIZというツールについては、シミュレーション開始前に条件設定が必要です。

次のステップでは、RVIZにシミュレーション条件を設定していきます。

Step2. RVIZにシミュレーション条件を設定する

Fixed Frameをworldに設定する

Fixed Frameを選択し、mapと書いてあるテキストボックスをworldに書き換えます。

変更前

変更後

rvizのマニュアルを読むに、おそらく座標系を慣性座標系に変更していることに相当します。

参考サイト:

宇宙ステーションを配置する

左下のAddボタンを押し、RobotModelを追加します。

img

img

"Description Topic"を空白から"/robot_description"に変更します。

img

img

この設定で、国際宇宙ステーションの3Dモデルが配置されました。

Step3. シナリオを実行する

シナリオの内容は以下のソースコードに定義されています。

https://github.com/space-station-os/space_station_os/blob/main/src/space_station_gnc/src/demo1a_nauka_incident_estimate.cpp

シナリオは、以下の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!!!

クリアするコツは、以下のとおりです。

  1. zenith方向とnadir方向にあるスラスタの内、対角線上にある近い推力を持ったスラスタを同時に噴射します。
    • スラスタ番号でいうと、3と7、4と8、2と5などの組み合わせが適しています。
    • 対角線上にある近い推力を持ったスラスタを同時に噴射すると、加速度はできるだけ増やさずに角速度を変更することができます。
    • ただしこのとき、回転方向と逆向きに噴射してしまうと角速度が増えて回転が早くなってしまうことに注意が必要です。
    • いくつかの組み合わせを試して、Pitch軸回転の角速度が減る組み合わせを探すとよいでしょう。

201_bring_back_orientation

シミュレーション終了です。お疲れ様でした。

まとめ

Space Station OSのVMを簡単に用意する方法とデモシナリオを紹介しました。

宇宙ステーション向けの物理シミュレーションが簡単に実行できましたね。

このようなOSSの公開によって宇宙開発がより効率的になって、ますます宇宙が身近になるといいですね。

Discussion