web-dev-qa-db-ja.com

Mars Curiosity Roverに組み込まれているソフトウェアは何ですか?

Mars Curiosity ローバーが正常に着陸し、プロモーションビデオの1つである「7分の恐怖」が500,000行のコードがあることを自慢しています。それは間違いなく複雑な問題です。しかし、それはたくさんのコードであり、確かにその背後にかなりのプログラミング努力がありました。誰もがこのプロジェクトについて何か知っていますか?それはある種の組み込みCだとしか想像できません。

554
InfinitiesLoop

RAD750プロセッサー[〜#〜] bae [〜#〜] で実行されている Cの250万行 を実行しています。 [〜#〜] jpl [〜#〜] にはもう少し情報がありますが、詳細の多くは公開されていないと思います。テストスクリプトはPythonで作成されたようです。

基盤となるオペレーティングシステムは Wind River'sVxWorks RTOS です。問題の [〜#〜] rtos [〜#〜] は、C、C++、AdaまたはJavaでプログラムできます。ただし、CとC++だけがOSの標準であり、AdaとJavaは拡張機能でサポートされています。ウインドリバーは VxWorks

根本的なチップセットはほとんどばかげています robust 。その仕様は最初はあまりよくないように思えるかもしれませんが、15年ごとに1つだけの「ブルースクリーン」を持つことが許可されています。心に留めておいてください。これは、何回も人間を殺す放射線の衝撃を受けています。宇宙では、堅牢性が速度よりも優れています。もちろん、そのような堅牢性は犠牲になります。この場合、それは$ 200,000から$ 500,000です。

Erlangプログラマー talks コンピューターとCuriosityのコードベースの機能について。

514
World Engineer

コードはMER( Spirit および Opportunity )に基づいています。これらは最初の着陸船MPF( Sojourner )に基づいています。これは、350万行のC(その多くは自動生成)であり、 [〜#〜] bae [〜#〜] および VxWorks オペレーティングシステムによって製造されたRA50プロセッサで実行されています。 。 100万行以上が手動でコーディングされました。

コードは150の個別のモジュールとして実装され、それぞれが異なる機能を実行します。高度に結合されたモジュールは、それらが含むモジュールを抽象化し、「特定の機能、アクティビティ、または動作のいずれかを指定する」コンポーネントに編成されています。これらのコンポーネントはさらにレイヤーに編成されており、「トップレベルコンポーネントは10個以下」です。

出典: Benjamin Cichy による基調講演 2010 Workshop on Spacecraft Flight Software(FSW-10)slides、audio、and video (で始まるミッションの概要、スライド80のアーキテクチャに関する議論)。


Hacker Newsの誰かが、「ほとんどのCコードが自動生成されるという意味がわからない。何からだ」と質問しました。

私は100%確信はありませんが、おそらくその年または別の年に、自動生成プロセスを説明する別のプレゼンテーションがあるでしょう。 FSW-11カンファレンスでは、それが一般的に人気のあるトピックだったことを知っています。

Simulink が可能です。これは、機械エンジニア、したがってほとんどのナビゲーションおよび制御エンジニアの間で人気のあるMATLABコンポーネントであり、コーディングしているとは考えずに「コーディング」およびシミュレーションを行うことができます。

モデルベースのプログラミングは、業界が徐々に認識し始めていることは間違いありませんが、 [〜#〜] jpl [〜#〜] でどの程度うまく機能しているかはわかりませんプロジェクトの開始時にそれを使用することを選択したでしょう。

3番目に考えられる可能性は、通信コードです。すべての宇宙システムでは、地上ソフトウェアから飛行ソフトウェアにコマンドを送信し、飛行ソフトウェアからテレメトリを受信して​​、地上ソフトウェアで処理する必要があります。各コマンド/テレメトリパケットは異種のデータ構造であり、両側がまったく同じパケット定義から機能し、片側で正しくフォーマットされ、反対側で解析されるようにパケットをフォーマットする必要があります。これには、データ型、サイズ、エンディアンなど、多くのことを正しく行うことが含まれます(後者は通常グローバルなものですが、エンディアンが異なる複数のプロセッサを搭載することもできます)。

しかし、それは表面にすぎません。ロギング、コマンド/テレメトリの検証、制限チェック、エラー処理などを処理するには、両側に多くの反復的なコードが必要です。そして、より洗練されたことができます。たとえば、ハードウェアレジスタの値を設定するコマンドがあり、その値がテレメトリーで特定のパケットに返されたとします。このテレメトリポイントを監視する地上ソフトウェアを生成して、このレジスタ値が設定されると、最終的にテレメトリが変更を反映するように変更できます。そしてもちろん、一部のテレメトリポイントは他よりも重要であり(メインバス電流など)、複数のパケットでダウンするように指定されています。これには、フライト側での追加のコピーと地上側でのデータの重複排除が含まれます。

以上のことから、静的テキストファイルのコレクションを1つ(XML、CSV、またはDSL/what-have-you)で記述し、Perl/Pythonスクリプトで実行する方がはるかに簡単です(私はそう思います)。コード!

私はJPLで働いていないので、ビデオにない詳細は提供できませんが、1つ例外があります。自動生成されたCコードはPythonスクリプトによって記述されており、プロジェクトの自動コーディングの量はFSWのリーダーによって大きく異なります。

175
Nate Parsons