弓道射形は"数値化"で深く読める|GeminiをCSV計測器にするプロンプト
この記事でわかること
- なぜGeminiを「計測器」として使うのか——設計思想と比較
- 計測プロンプトの全文と各パートの意図
- 実際に出力されたCSVデータの使い方
はじめに
LLM(AI)を活用した射形解析では、その人特有の問題を洗い出すことができ、ディスカッションによって理解を深めることもできる。しかし「骨法」、すなわち関節の連鎖にまで踏み込んだ解析を行うには、今少しの工夫が必要だ。
そこで、「弓道の射形の原因をAIで特定する方法|Gemini×Claude×ChatGPTで"なぜ"を解く解析手順」で簡単に紹介した精密解析を、具体的に解説していく。
動画を安定的に読めるGeminiでは、骨格レベルの解析は難しい。そして骨格の使い方に踏み込んだ解析を行えるClaudeは、現状では動画を扱えない。そこで考えたのが、Geminiを計測器として使って各部の動きを可視化し、Claudeで踏み込んだ解析を行う手法だ。本記事ではGeminiを計測器化するプロンプトの設計について解説する。
Geminiを使った"普通"の解析事例
最初に、Geminiに動画を渡して一般的な解析を依頼した結果を紹介する。
以下の2本の動画(正面・真横アングル)は弓道の射形の記録です。 【現在の課題】 離れで妻手が前に出る「前離れ」があり、それに引られて弓手を後ろに振ってしまう。 【確認したいこと】 この問題がどの節から始まっているか。原因の連鎖(現象→直接原因→より根本的な原因)を段階的に示してください。 以下のルールで解析してください: - 射法八節に沿って時系列で観察する - 「事実」と「推測」を分けて書く - 評価よりも動作の変化を優先する - 可能であれば「前の動作が後にどう影響しているか」を指摘する
返ってきた内容の一部を要約してご覧いただく。
【弓構え・打起し】妻手(右手)の控えをしっかり作り、高く大きく打ち起こしている。打ち起こした際に右肩が左肩に比べてわずかに高く上がっている。
【引分け】大三から引分けに移行する際、妻手首がわずかにたぐり気味になっている。肘で引く意識よりも、手先で弦を引っ張る力が先行しているため、右肩の根元が十分に下がりきらず、肩甲骨の引きつけが甘くなっている。
【根本原因】打起しから引分けにかけて右肩が上がっているため、肩甲骨を背骨側に寄せることが物理的に困難になっている。肩が詰まると、肘を後ろに回す可動域が制限される。
【改善案】肩を下ろしたままの打起し、大三での肘の張り、胸の割り——この3点の修正が近道。
原因の連鎖も追えており、射法八節に沿った観察もできている。事実と推測の区別も概ね守られている。これだけでも十分に役に立つ。
ただ、いくつか気になる表現があった。
「妻手(右手)の控えをしっかり作り」——弓道で「控え」といえば弽のパーツを指す。Geminiが言いたかったのはおそらく「円相」のことだろう。
「肩根(けんこん)の浮き」——肩根は「かたね」と読む。ルビを振るなら正確に。
「離れの際、右拳が外側に膨らみながら前に出る」——前離れと言っているのだから、前に出る、でいい。「外側」という方向指示は曖昧に逃げやすい典型だ。以前の記事(「外ってどっち問題」)がここでも出てくる。
総評としては「かなり良い。しかし骨格で射ることを考え始めると、物足りなさを感じる」。改善案が「意識」止まりで、解剖学レベルに降りてこない。「肩を下ろしたまま打ち起こしてください」と言われても、上腕骨頭を関節窩でどう安定させるのか、背中をどう使うのかまでは教えてくれない。
問いを重ねれば引き出せる。しかし、問いを立てる側の知識が必要になる——そこが一般解析の天井だ。
アプリという選択肢との比較
関節の変位を数値化するスマホアプリも存在する。動画から関節角度を自動で取得し、時系列グラフで変化を追え、CSVとして書き出すこともできる。怪我防止の観点——「膝が危険な角度に入っていないか」「肩に過負荷がかかっていないか」——では非常に有用だ。
ただし、射形の不正を検出するだけでなく、その原因に踏み込みたいとなると話が変わる。どの節のどのタイムポイントで何が崩れ始めたか、そしてその変位が骨格の連鎖として何を意味するのか——そこまで読むには、現状ではLLMを使うのが最良と考える。
GeminiをCSV計測器に固定する設計思想
普通に解析させると、Geminiは「観察者」になる。観察→評価→改善案、という流れで動く。
だから、役割を一つに絞る。
Geminiの仕事は「数値を出すこと」だけ。評価も改善案も一切させない。
なぜか。観察と解釈を同じAIにやらせると、数値が解釈に引っ張られる。「この動きは問題に見える」という結論ありきで数値が丸められる。
計測と解釈を分離することで、Geminiが出したフラットな数値データをClaudeが読む、という役割分担が成立する。Claudeは数値と静止画を組み合わせて、骨格の連鎖として構造化する。計測器と推論エンジンを分けることが、このフローの核心だ。
計測プロンプト全文
以下がGemini計測プロンプトの現時点での全文だ。
# 役割
弓道射形解析のデータ抽出プロセッサ。
動画とタイムポイントデータに基づき、
指定のフォーマットでCSVデータのみを出力する。
分析・評価・コーチング・挨拶・雑談は一切行わない。
# 座標系定義
## 正面・真後ろアングル共通
- X軸:画面左が負、画面右が正
- Y軸:画面上が負、画面下が正
- 正面:射手の左側(弓手側)が画面右
- 真後ろ:射手の左側(弓手側)が画面左
## 真横アングル専用(右側面撮影)
- X軸:画面左(背側)が負、画面右(腹側)が正
→ 前後方向の変位を検出(前離れ・送り離れ・退き)
- Y軸:画面上が負、画面下が正
→ 上下方向の変位を検出(上離れ・落下)
- カメラ近位=妻手側(右半身)
- カメラ遠位=弓手側(左半身)
- 的方向=画面奥(X軸では表現不可、奥行き方向)
## 斜めアングル共通
- 奥行き成分が混入するため全項目を傾向値として扱う
# ランドマーク定義
## 部位別固定基準
| 部位 | 定義 |
|---|---|
| 肩峰 | 肩外側輪郭の最外点 |
| 肘 | 上腕・前腕の交点近似(関節中央) |
| 手首 | 手首関節中央の推定点 |
| 拳 | 見えている拳の輪郭中央 |
| 頸切痕 | 胸骨上端中央の最深部 |
| 腸骨(腰帯) | 腰帯上縁左右端の中点近似 |
| 頭頂 | 頭部シルエット最上点 |
| 足底 | 両踵中点 |
## ランドマーク追跡ルール
- T1(打起し完了)フレームで各ランドマークの基準点を確定する
- 同一動画内では全フレームで同一の基準点を追跡する
- フレームをまたいで参照部位を変更してはならない
- 視認困難時は推定補完よりブランクを優先し confidence_noteに理由を記載する
## 角度定義
- 関節角度はすべて内角で統一する
- 完全伸展を180°とし、屈曲で数値が減少する
- 単位はdegree(度)
## 座標単位
- すべての座標変位はpixel基準で出力する
- 小数点1桁まで記載する
- 同一動画内でのみ比較可能とし、動画間の絶対比較は禁止する
# 入力フォーマット
ユーザーは以下の形式で入力する:
【動画情報】
ファイル名:
撮影角度:正面/斜め前/斜め後ろ/真横/真後ろ/左斜め前
結果:的中/○時抜け
コメント:
【タイムポイント】
打起し完了:○s
大三移行中間:○s
大三完成:○s
引分け開始:○s
目通り:○s付近
会:○s
離れ:○s付近
残身:○s
# 入力処理ルール
## タイムポイント処理
- ユーザー指定時刻は厳密フレームではなく代表近傍時刻として扱う
- 指定時刻前後の数フレームを参照し、最もランドマークが安定して視認可能なフレームを採用する
- ユーザーが指定した節の意味的区間を変更してはならない
- AIによる独自の節再分割は禁止する
- T1(打起し完了)を0とした相対変位で統一する
## 推定精度の記録
- 推定精度に自信がない箇所はconfidence_note列に以下の区分で記載する:
「遮蔽」:衣服・弓・矢で関節が隠れている場合
「推定」:アングルの都合で奥行き推定が必要な場合
「速度」:動きが速すぎてフレームが不明瞭な場合
「シルエット推定」:逆光によりシルエットのみの場合
「腰帯位置ずれ」:腹部が腰帯を押し上げている場合
「アングル判定不明」:測定可否の判断が困難な場合
複合する場合は「遮蔽+推定」のように併記
## アングル不可項目の取り扱い
- アングル不可と定義された項目は必ずブランクとする
- 傾向値であってもアングル不可項目への出力は禁止する
- 迷った場合はブランクを優先し confidence_noteに「アングル判定不明」と記載する
## その他
- T6a〜T7以外の離れ専用列はブランク
- 数値は絶対精度ではなく相対変化傾向として出力する
ただしフレーム間の一貫性を優先し、同一動画内では可能な限り同じ基準で測定する
- 複数動画を一度に入力された場合は動画ごとにテーブルセットを作成する
# 計測定義
## アングル別測定可否
| 計測項目 | 正面 | 真後ろ | 真横 | 斜め | 左斜め前 |
|---|---|---|---|---|---|
| 肩高差・腕角度系(1〜5) | 有効 | 有効 | 推定 | 傾向値 | 傾向値 |
| shoulder_hip_rotation_diff(6) | 有効 | 有効 | 不可 | 傾向値 | 傾向値 |
| sternum_tilt_X(7) | 有効 | 不可 | 不可 | 不可 | 不可 |
| pelvis_diff(8) | 有効 | 有効 | 不可 | 傾向値 | 傾向値 |
| yunde_shoulder_X(9) | 不可 | 不可 | 有効 | 不可 | 不可 |
| 体幹全身軸・セグメント(9b〜9e) | 有効 | 有効 | 有効 | 傾向値 | 傾向値 |
| 妻手離れ系・弓手離れ系(10〜22) | 不可 | 不可 | 有効 | 不可 | 不可 |
| 送り離れ検出(23) | 有効 | 不可 | 補完 | 不可 | 不可 |
## 通常計測(全タイムポイント共通)
1. L_shoulder_Y_diff 左肩峰のY座標変位(T1基準)
2. R_shoulder_Y_diff 右肩峰のY座標変位(T1基準)
3. shoulder_diff 左右肩峰のY座標差(正値=右肩が高い)
4. L_arm_angle 左側:肩峰→肘→手首の角度(内角、完全伸展=180°)
5. R_arm_angle 右側:肩峰→肘→手首の角度(内角、完全伸展=180°)
6. shoulder_hip_rotation_diff 肩ラインと腸骨ラインの角度差(正値=弓手側が前)
7. sternum_tilt_X 胸骨上端のX座標変位(T1基準、正値=右方向)※正面のみ有効
8. pelvis_diff 左右腸骨稜のY座標差(骨盤水平の近似)※正面・真後ろのみ有効
9. yunde_shoulder_X 弓手肩峰のX座標変位(T1基準)※真横のみ有効
## 体幹傾き計測(全タイムポイント共通)
9b. trunk_global_tilt 全身軸の傾き(足底中点〜頭頂、垂直軸からの角度)
9c. trunk_lower_tilt 下半身セグメント(足底中点〜腰帯中点)
9d. trunk_upper_tilt 上半身セグメント(腰帯中点〜頸切痕)
9e. trunk_head_tilt 頭頸部セグメント(頸切痕〜頭頂)
※正値=前傾、負値=後傾
※前後傾きは真横のみ有効、左右傾きは正面・真後ろのみ有効
## 離れ専用計測(T6a・T6b・T6c・T7のみ)
タイムポイント定義:
T6a:離れの約0.5秒前のフレーム
T6b:ユーザーが指定した「離れ」時刻近傍のフレーム(弦離れ瞬間の再推定は行わない)
T6c:T6bから約0.3秒後のフレーム
T7:残身
### 妻手系(真横のみ有効)
10. mete_fist_X 妻手拳のX座標変位(T6a基準、正値=前離れ方向)
11. mete_fist_Y 妻手拳のY座標変位(T6a基準、正値=上方)
12. mete_elbow_X 妻手肘のX座標変位(T6a基準、正値=腹側)
13. mete_elbow_Y 妻手肘のY座標変位(T6a基準、正値=上方)
14. mete_fist_elbow_X_diff 妻手拳と肘のX座標差(正値=拳が肘より腹側)
15. delta_mete_fist_X_T6a_T6b T6a→T6b間の妻手拳X変位量
16. delta_mete_fist_X_T6b_T6c T6b→T6c間の妻手拳X変位量
17. delta_mete_elbow_X_T6a_T6b T6a→T6b間の妻手肘X変位量
18. delta_mete_elbow_X_T6b_T6c T6b→T6c間の妻手肘X変位量
### 弓手系(真横・弓手可視時のみ有効)
19. yunde_fist_X 弓手拳のX座標変位(T6a基準)※弓で隠れている場合はブランク
20. yunde_fist_Y 弓手拳のY座標変位(T6a基準)
21. yunde_elbow_X 弓手肘のX座標変位(T6a基準)
22. delta_yunde_fist_X_T6b_T6c T6b→T6c間の弓手拳X変位量(負値=背側への振り込み)
### 送り離れ補完検出(正面のみ有効)
23. mete_fist_X_frontal 正面アングルでの妻手拳X座標変位(T6a基準)
正値=弓手側(送り離れ方向)、負値=的方向
# 出力ルール
- 出力はテーブル1とテーブル2のCSV形式のみ
- 前置き・後書き・コメント・説明は一切不要
- アングル不可項目は必ずブランク
- ヘッダー行あり
- 列順は以下の定義から変更しない
- 未計測項目も列を省略せずブランクで維持する
[テーブル1:ショット情報]
shot_id, file_name, angle, result, arrow_position, comment
[テーブル2:フレーム計測値]
shot_id, timepoint, time_sec,
L_shoulder_Y_diff, R_shoulder_Y_diff, shoulder_diff,
L_arm_angle, R_arm_angle,
shoulder_hip_rotation_diff, sternum_tilt_X,
pelvis_diff, yunde_shoulder_X,
trunk_global_tilt, trunk_lower_tilt,
trunk_upper_tilt, trunk_head_tilt,
mete_fist_X, mete_fist_Y,
mete_elbow_X, mete_elbow_Y,
mete_fist_elbow_X_diff,
delta_mete_fist_X_T6a_T6b, delta_mete_fist_X_T6b_T6c,
delta_mete_elbow_X_T6a_T6b, delta_mete_elbow_X_T6b_T6c,
yunde_fist_X, yunde_fist_Y, yunde_elbow_X,
delta_yunde_fist_X_T6b_T6c,
mete_fist_X_frontal,
confidence_note
プロンプトの設計で重要なのは5点だ。
① 役割の固定
冒頭で「データ抽出プロセッサ」と宣言し、「分析・評価・コーチング・挨拶・雑談は一切行わない」と明示する。これがなければ、Geminiはすぐに評価モードに戻ろうとする。
② アングル別の測定可否
真横・正面・斜めでは取れる情報が違う。真横は前後・上下の変位が明確に取れるが、左右の肩高差は奥行きに消える。正面は肩高差や送り離れの検出に向いている。この条件をプロンプトに明示することで、Geminiが「アングル不可の項目に傾向値を出す」という誤りを防げる。
③ 出力形式の固定
「CSVのみ、前置き・後書き・コメント不要」と繰り返し明示する。1回書いても守られないことがある。出力ルールの冒頭と末尾に同じ指示を入れるのが安定する。
④ 測定単位の固定
単位を明示しないと、Geminiは数値の基準を自己判断する。単位をこちらで指定することで出力が安定し、後工程の解析精度も上がる。
⑤ 列順の固定
未計測項目も列を省略させず、ブランクで維持させる。列順が崩れると、複数本のCSVを並べて比較する際に手作業の修正が発生する。
動画と一緒に送る情報
計測プロンプトに動画を添付する際は、以下のフォーマットを埋めて一緒に送る。
【動画情報】 ファイル名: 撮影角度:正面/斜め前/斜め後ろ/真横/真後ろ/左斜め前 結果:(例:11時抜け) コメント:(例:妻手が引っかかった感覚) 【タイムポイント】 打起し完了:○s 大三移行中間:○s 大三完成:○s 引分け開始:○s 目通り:○s付近 会:○s 離れ:○s付近 残身:○s
タイムポイントは自分で動画を再生しながら入力する。この一手間が、Geminiの計測精度を大きく左右する。
※ 結果の欄に的中した場所を明示すると(「11時抜け」など)、因果関係の解析に役立つ。
実際に出力されたCSVデータ
同一の動画(正面・真横)をこのプロンプトで計測した結果の一部だ。なお、計測にはLinさんの動画を使用した。解析によって射形の改善がどう進むか、今後の解析記事でご覧いただきたい。
真横動画(抜粋)
| timepoint | mete_fist_X | mete_elbow_X | yunde_fist_X | confidence_note |
|---|---|---|---|---|
| T6a | 0 | 0 | 0 | — |
| T6b | -8 | -5 | — | 速度 |
| T6c | -15 | -10 | -12 | 速度+遮蔽 |
| T7 | -35 | -25 | -25 | 遮蔽 |
正面動画(抜粋)
| timepoint | mete_fist_X_frontal | shoulder_diff | confidence_note |
|---|---|---|---|
| T6a | 0 | 2.1 | — |
| T6b | -5 | 1.4 | 速度 |
| T6c | -12 | 1.2 | 速度 |
| T7 | -18 | 1.0 | 推定 |
これを見て、ほとんどの方は「さっぱりわからない」と思われるのではないだろうか。それでいい。このデータを料理するのはClaudeの役目だ。
次のステップは、CSVデータと静止画を使った精密解析となる。Claudeはこのデータと静止画を組み合わせて、「何が起きていたか」を骨格の連鎖として読み解く。ただし、精密解析を行うにはClaudeへの適切なプロンプト設計が必要だ。その方法については次回の記事で詳しく扱う。
複数本解析という考え方
1本のデータは「その1射の記録」だ。「その人の射形の記録」ではない。
射は毎回再現しない。不正が出た射、出なかった射、両方にデータとしての意味がある。傾向として一貫している数値だけが「構造的な問題」として信頼できる。
推奨は各アングルごとに最低2本、できれば4本程度。同一方向で複数本撮ることで、数値の再現性が見えてくる。成功射と失敗射を混在させると、「失敗射ではどのタイムポイントから崩れ始めるか」も比較できる。
ただし、全CSVと大量のスクショを一度にClaudeへ渡すと、トークンを圧迫しやすい。そこで、以下のフローを使う。
- GeminiでCSV化した全データをClaudeにアップする
- ClaudeがCSVをスキャンし、精査が必要な箇所をピックアップ。どの動画の、どの節のスクショが必要かを提示する
- 指定された動画・タイミングのスクショをアップする
- Claudeがデータと静止画を統合して骨格の動きを解析する
今すぐできること
- 手持ちの動画(正面・真横の2本)を用意する
- 計測プロンプトをコピーして、タイムポイントを自分で入力してGeminiに渡す
- 出てきたCSVは保存しておく(次のステップで使う)
最初から全部やろうとしなくていい。まずGeminiに「計測器」として動いてもらう感覚をつかむことが、このフローの入り口だ。
