デザインと論理の架け橋。デザイナーが知っておきたいPythonの正体
LOG32R2R2R2026/1/10

デザインと論理の架け橋。デザイナーが知っておきたいPythonの正体

ロボティクスという未知の領域に挑んで半月。 正直に告白すれば、自分の隣にあるPythonのコードたちは、自分が一からキーボードを叩いて生み出したものではありません。AIの力を借り、先人の知恵を借り、継ぎ接ぎしながら形にしてきたものです。

しかし、本格的なフェーズ3(自律制御)を前にした今、自分はこの「一から書いていないコード」に対して、かつてないほどの「自分の道具」としての手応えを感じています。

※本プロジェクトの目的:実機「mechArm 270 M5」の制御を通じて、AIの判断をいかに物理的な動きへ変換するか。そのロボット制御の仕組みを理解するプロセスを記録・検証するものです。

画面の中の「完璧な世界」から、ノイズのある「現場」へ

これまで29年、WebやUIデザインの世界で「完璧なピクセル」を追求してきました。しかし、ロボットの現場は不確実性の嵐です。 Pythonコードは、デジタルな画面(Pixels)と、重さや摩擦のあるモーター(Motors)を繋ぐ、唯一の架け橋でした。

1.ロボットに話しかけるための「窓口」を作る

このコードは、一言で言うと「キーボードの入力を読み取って、ロボットアームに『どの関節をどれくらい動かすか』という命令をリアルタイムで送り届ける送信機」の役割を果たしています。

Python

# デザイナーの私が向き合った、物理世界への送信プロセス
def on_press(self, key):
    # 【翻訳】キー入力を受け取り、どの関節を動かすか決める
    try:
        if hasattr(key, 'char') and '1' <= key.char <= '6':
            self.selected_joint = int(key.char) - 1
            print(f"選択中: link{self.selected_joint+1}")
    except: pass

    # 【設計】矢印キーで角度(質感)を微調整する
    if key == keyboard.Key.left:
        self.current_pos[self.selected_joint] += 0.1 # 0.1という「手触り」
        self.publish_joints() # 【送信】封筒をロボットへ飛ばす!
    elif key == keyboard.Key.right:
        self.current_pos[self.selected_joint] -= 0.1
        self.publish_joints()

コードの最初の方(__init__ の部分)では、ロボットと通信するための設定を行っています。

  • パブリッシャー(送信機): self.pub の部分です。これは「/arm_joints」という名前の専用チャンネルを使って、ロボットにメッセージを届けるための無線局のようなものです。

  • メッセージの箱: self.msg は、ロボットに送るための専用の封筒です。ここに関節の名前(link1〜link6)や、今の角度を書き込んでいきます。

  • 記憶: self.current_pos は、ロボットの腕が今どの角度にあるかをプログラムの中で覚えておくためのメモ帳です。

2. 操作:人間の動きを「命令」に変換する

中盤の on_press はキーボードを叩いた瞬間に動く「翻訳機」です。

  • 関節を選ぶ(1〜6キー): 「今から3番目の関節を動かすよ」といった切り替えを行っています。selected_joint という変数に、今どの関節に注目しているかを保存します。

  • 角度を変える(矢印キー): * 左矢印を押すと、選んでいる関節の角度を 0.1 ずつ増やします。

  • 右矢印を押すと、逆に 0.1 ずつ減らします。

  • 送信ボタンを押す: 角度を変えた直後に self.publish_joints() を呼び出すことで、最新の角度データをロボットへ即座に送り出しています。

3. 動かし続ける:ROS 2の「心臓の鼓動」を管理する

最後の main 関数の部分が、プログラム全体を動かし続ける仕組みです。

  • 聞き耳を立てる: with keyboard.Listener は、プログラムが動いている間ずっと、キーボードが押されるのを待ち構えています。

  • スピン(rclpy.spin_once): ここが少し特殊で重要なポイントです。

ROS 2の世界では、命令を送るだけでなく、「通信の順番待ちを処理する時間」が必要です。spin_once を定期的に呼び出すことで、プログラムがフリーズすることなく、スムーズに命令を送り続ける「呼吸」のような役割をさせています。

コードエディタの色分けの意味について

コードエディタで文字がカラフルに色分けされているのは何がどんな役割を持っているかをパズルのようにひと目で判別するためです。これを専門用語で「シンタックスハイライト」と呼びますが、デザイナーの視点で見れば、情報の優先順位をつけるタイポグラフィの設計に近いものです。

PythonとC#の画面を参考に、それぞれの色が持つ意味を日常的な言葉で紐解いてみます。

コードの色分けが教えてくれる「役割」

エディタの設定によって多少異なりますが、一般的には以下のようなルールで整理されています。

コードエディタ-C#
コードエディタ-Python

ピンクや紫:魔法のキーワード(予約語)

import, class, def, if, return などがこれに当たります。 これらはプログラムを動かすための決まり文句です。自分で勝手に変えることができない魔法の呪文のようなものだと考えてください。これらが光っていることで、プログラムの骨組みがどこにあるのかがすぐにわかります。

黄色や青:具体的な「アクション」(関数・メソッド)

print(), publish(), init() などの、後ろにカッコがついているものです。 これらは「〜を表示せよ」「〜を送信せよ」といった具体的な動作(動詞)を表しています。デザイナーが「ここをクリックしたら動く」と機能を割り当てるボタンのような存在です。

オレンジや薄緑:中身の「文字」や「数値」(リテラル)

'manual_control_node' などの引用符で囲まれた文字や、0.1 などの数字です。 これらはプログラムが扱うデータそのものです。質感を調整するために数値を書き換えるとき、この色を目印に探せば、どこを触ればいいかがすぐに見つかります。

緑やグレー:自分への「メモ」(コメント)

# や // で始まる文章です。 これはプログラムとしては無視される、人間用の注釈です。AIが解説を書いてくれたり、自分が後で思い出すために残したメモだったりします。ここを読むだけで、そのコードが何をしようとしているのかのヒントが得られます。

白や水色:データの「保管場所」や「名前」(変数・クラス名)

current_pos, selected_joint, JointStateSubscriber などです。 これらは自分でつけた「ラベル(名前)」です。Figmaのレイヤー名をつけるのと同じ感覚で、何が入っている箱なのかを分かりやすくするために使われます。

デザイナーが色分けを活用するメリット

一からコードを書かなくても、この「色のルール」を知っているだけで、世界の見え方が変わります。

  • 間違い探しが簡単になる: もし入力を間違えて色が消えたり、変な色になったりしたら、「あ、呪文を書き間違えたな」と視覚的に気づけます。

  • 構造が透けて見える: 「ピンク(骨組み)」と「黄色(アクション)」を追いかけるだけで、なんとなくここで判断して、ここで動かしているんだなという流れが掴めるようになります。

  • 調整箇所がすぐわかる: 質感を決める「オレンジ(数値)」を探すだけで、試行錯誤のスピードが格段に上がります。

読み解き、操るスタイルでプロジェクトを進める上で、この色は地図のような役割を果たしてくれます。

フェーズ3:愛されるロボットの「振る舞い」をデザインするために

わからないまま進んできましたが、今ではPythonが描いた「愛されるロボットの定義」——理解、透明性、リカバリビリティを実現するための唯一の手段だと実感しています。

これからのフェーズ3では、この送信機の仕組みをさらに進化させます。 ただ動かすだけでなくロボットが今、何をしようとしているかを動き(質感)で伝える。そんな高度なHRIデザインに、Pythonという杖を手に挑んでいくつもりです。