コーディング規則
この文書では、RobomationLAB でロボットコーディングをするときに守るべきコーディング規則について説明します。
参考: スクリプトコーディングは Python 専用で動作し、ブロックは
robomationの Python パッケージを使う Python コードへ 1 対 1 で変換されます。
順序の案内: 共通の重要な規則(1~2) → ブロックコードの規則(3~5) → Python スクリプトコードの規則(6~11) の順に整理されています。ブロックコードと Python コードの生成のどちらも、重要なものとして守る必要があります。
1. ブロック ↔ Python の 1 対 1 変換の制約
ブロックコーディングエディターと Python コーディングエディターは 1 対 1 で対応し、リアルタイムに双方向で変換されます。
- ブロック → Python: ブロックは常に正しい Python コードへ変換されます。
- Python → ブロック: ブロックで表現できるコードに限って変換されます。
そのため、Python エディターで次のようなコードを書くと、Python からブロックコーディングエディターへの切り替えができないことがあり、
その場合は切り替えが失敗した原因が一緒に表示されます。
- Python の文法エラーがあるコード
- ブロックに対応しない(変換規則に定義されていない)関数・メソッド・文法を使ったコード
ブロックコーディングエディターへの切り替えを正常に保つには、
この文書と各ロボットの文書に定義されたクラス・メソッド・関数、および対応している文法の範囲内でコードを書く必要があります。
2. コードの提示に関する規則
robomation Python API マニュアルとブロック ↔ Python 変換規則の文書に明記されたクラス、メソッドおよび関数だけを使えます。
ロボットを制御するとき、上の文書に定義されていない新しいロボット制御メソッドを作って使うことは厳格に禁止されます。 ただし、ユーザーが新しい関数の作成を要求した場合は可能です。
上の文書に明記された変換の例に現れない一時変数(例: ロボットのインスタンスを入れる変数以外の追加の変数)の宣言は、ユーザーが変数の作成を要求したときにだけ作れます。
また、メソッドの引数は必ずリテラルで書く必要があります。
# 正しい例
hamster_s.set_wheel_speed('both', 100)
# 誤った例 - API マニュアルに明記されていない関数の使用
hamster_s.set_wheel('both', 100)
# 誤った例 - 任意の変数の宣言
SPEED = 100
hamster_s.set_wheel_speed('both', SPEED)3. ブロックコードの基本構造
ブロックコードを提示するときは常に、プログラムの入口の役割をする最上位の関数ブロックであるセットアップ関数とループ関数を、基本構造として必ず含めて提示します。
この規則を加えると、これ以降のすべてのブロックコードは次のような基本構造を持つことになります。
| ブロック構造 (Block Composer) | 提示の方法(テキスト形式) |
|---|---|
| セットアップ関数 | セットアップ関数 |
| (内部のブロック) | (内部のブロック) |
| ループ関数 | ループ関数 |
| (内部のブロック) | (内部のブロック) |
4. ブロックコードの形式(改行とインデントの規則)
- 最上位のブロック(セットアップ関数、ループ関数など)は左揃えにします。
- 各命令ブロックは必ず改行文字で区切り、1 行にブロック 1 つだけを出力しなければなりません。
- 内部に実行領域を持つブロック(もし、繰り返す、関数の定義など)の内部に含まれる下位のブロックは、インデントを適用して階層構造を明確に表現します。
5. 内部のブロックと条件の表現に関する規則
ドロップダウンメニューの選択値または入力値はブロックの機能的な引数(Argument)に当たり、ブロックの文の中でその値が置かれる場所に角かっこ([])を使って直接挿入して表現します。
これは、ブロック固有の文とユーザーが選択・入力した値を統合して視覚的に再現する役割をします。
すべてのブロックコードは、ブロック固有の名前、ドロップダウンメニューの選択値、そしてユーザーが入力した値を角かっこ([])を使ってすべて含める形で、
実際の Block Composer のブロックの形をテキストでできるだけ近く再現して提示しなければなりません。
| ブロック構造 (Block Composer) | 提示の方法(テキスト形式) |
|---|---|
| もし [条件] 実行 [命令] そうでなければ [命令] | もし [条件] 実行 [命令] そうでなければ [命令] |
| RaccoonBot: [速度] 制御モードに設定 | RaccoonBot: [速度] 制御モードに設定 |
| RaccoonBot: 関節 [1] の速度を [100] に設定 | RaccoonBot: 関節 [1] の速度を [100] に設定 |
6. スクリプトコードの基本構造
スクリプトコード(Python)を提示するときは常に、プログラムの入口の役割をする関数である setup() と loop() を、基本構造として必ず含めて提示します。
また、ロボットの制御に必要なクラス・ユーティリティを使えるように、コードの最上部に from robomation import * を含め、使うロボットはインスタンスとして宣言します。
この規則を加えると、これ以降のすべてのスクリプトコード(Python)は次のような基本構造を持つことになります。
# Python コードの基本構造
from robomation import *
# (使うロボットがあればインスタンスとして宣言、例)
hamster_s = HamsterS(0)
# ここに1回だけ実行するセットアップコードを入力します:
def setup():
pass
# ここに繰り返し実行する制御コードを入力します:
def loop():
pass7. スクリプトコードの形式(改行とインデントの規則)
- 最上位の関数(setup, loop など)は左揃えにします。
- 改行のときに生じるインデントは、必ずタブ(
\t) 1 個を基準にします。(エディターのインデントの基準と同じ)
8. ロボット制御の規則(インスタンス / メソッド)
ロボットを制御するときは、次のような規則に従わなければなりません。
- コードの最上部に
from robomation import *を含めます。 - 使うロボットをインスタンスとして宣言します。変数名はロボットごとに決められたデフォルトの変数名を、インデックスは 0 から付けます。
- 宣言したインスタンスのメソッドを呼び出してロボットを制御します。
from robomation import *
hamster_s = HamsterS(0)
def setup():
hamster_s.set_wheel_speed('both', 50)
def loop():
pass同じ種類のロボットを複数台使う場合は、インデックスを 0, 1, 2 … と増やして宣言します。(例:
hamster_s = HamsterS(0),hamster_s_1 = HamsterS(1))
ロボットの車輪速度の設定・移動などは、メソッドの内部で必要な初期化(例: 以前の移動命令の整理)を自動的に処理するので、別に先行の初期化コードを書く必要はありません。
9. ユーティリティ関数の呼び出しに関する規則
時間の遅延、音の再生、ログ出力、色など、共通のユーティリティ機能は Utils クラスのメソッドを通じて呼び出します。
Utils.wait(1) # (seconds)
Utils.play_sound('', 100, False)
Utils.log(0, '', '')詳しいユーティリティ関数の一覧は、次の文書を参照してください。
10. ロボット専用メソッドを優先して使う規則
ロボットのハードウェア(車輪速度、LED、音など)を制御するときは、
共通のユーティリティ関数よりも、ロボット(例: 「HamsterS」)のインスタンスの専用メソッドを優先して使う必要があります。
たとえば、ロボットを使って音を出す場合は、
ユーティリティ関数の Utils.play_sound() よりも「HamsterS」のインスタンスの sound_clip() メソッドを優先して使う必要があります。
# HamsterS のロボットを通じて音を出します。(推奨)
hamster_s.sound_clip('beep')
# PC / タブレット / モバイルデバイスを通じて音を出します。(非推奨)
Utils.play_sound('beep', 100, False)11. Import の規則
Python コードを書くときは、コードの実行に必要なモジュールだけを import します。
- ロボットの制御のため、コードの最上部に
from robomation import *を基本的に含めます。 math.を使うコードにはimport mathが、random.を使うコードにはimport randomが自動的に追加されます。- それ以外の不要なモジュールは import しません。
