もくじ
章 | タイトル | 内容 | 備考 |
---|---|---|---|
1 | はじめに | 自己紹介および本記事について | |
2 | WROとは | WROについての説明 | |
3 | 過去の開発経緯 | 昨年までの本システム開発について | WROの事をご存知 の方はここから |
4 | 今年の大会について | 今年の各大会の状況を説明 | |
5 | 基本機能説明 | 本システムの重要な部分をご紹介 | システムをサクッと 見たい方はここから |
6 | アップデート項目 | 今年追加した新機能などをご紹介 | |
7 | 来年に向けて | 来年追加予定の機能などを説明 | |
8 | 最後に | 謝辞と来年への抱負 |
1. はじめに
自己紹介
改めて自己紹介をさせて頂きます。
私は現在某大学にて電気電子情報工学を学んでいる大学生です。
中学・高校時代より、クラブ活動でロボットの研究を行っており、主に WRO(World Robot Olympiad)
という大会に参加しておりました。
現在、WROには運営側で関わっており、本年は公認京都予選会の実行委員(昨年までの技術委員長は後輩に引き継ぎ)、および昨年に引き続きJapan決勝大会のRoboMission エレメンタリー部門 チーフジャッジとしてお仕事をさせて頂きました。
WROについて詳しくは、以下のページをご覧ください👇
今回のお話
毎年恒例となっておりますが、WROで私の開発した 「得点計算システム」 を運用したお話です。
「得点計算システム」は、WROの各大会にて、各チームのロボットが行ったミッションの得点を計算・集計し、順位付けを行うシステムです。
タイトルにもある通り、今年は 7つ の予選会と Japan決勝大会 の 計8大会 に導入することとなりました。これらの大会への導入へ至った経緯、今年のアップデート項目、来年に向けての展望などを記していければと思います。
2. WROとは
WROをご存じの方は読み飛ばしてください!
まず初めに、WROというロボットコンテストについて、改めて説明したいと思います。
全体概要
WRO(World Robot Olympiad) とは、LEGO社のMindstorms EV3 および SPIKE Prime 等を使用して参加するロボットコンテストです。
全国各地で公認予選会が開かれており、それらの優秀チームがJapan決勝大会で戦います。
さらに決勝大会の上位チームは、国際大会に出場することが出来ます。
WROでは以下の画像に示すように4つのカテゴリを展開していますが、私が携わっているのは 「ROBO MISSION」 となります。
ROBO MISSION の概要
ROBO MISSIONでは2~3人1組のチームを組み、ミッションをこなすロボットを製作します。
(WRO Japan 2024 公認京都予選会 シニアエキスパート競技 の様子)
(WRO Japan 2024 公認京都予選会 シニアエキスパート競技 の様子)
(WRO Japan 2024 公認京都予選会 エレメンタリー部門 開会式 の様子)
参加できるのは主に小中高生で、8~12歳のエレメンタリーカテゴリ、11~15歳のジュニアカテゴリ、14~19歳のシニアカテゴリと3つの年齢区分があります。
また国内大会においては、中・上級者向けのエキスパート競技と初級者向けのミドル競技に分かれており、計6カテゴリが展開されています。
尚、京都予選会では初参加の小学生向けのエレメンタリーベーシックも開催しており、計7カテゴリを実施しております。
毎年更新されるルール は、その年のテーマ(国際大会開催国の特徴を表したもの)に沿ったものとなっています。ただし本質的に問われていることは同じで、以下のような技術が問われます。
- 正確なロボットの走行
- オブジェクトの操作・運搬
- オブジェクトの認識や色読み
- 指定された通りの手順(アルゴリズム)
今年2024年の国際大会はトルコ 🇹🇷 で、 EARTH ALLIES というシーズンテーマを基にしたルールとなっています。
ルール等については👇こちらから
3. 過去の開発経緯
昨年までの開発経緯を軽く振り返っておきましょう。
2019年
システム開発初年度、京都予選会への参加者数が増加し、得点計算が追いつかなくなった事から、自動で計算するシステムを開発しました。
当初はGoogle Formsでの回答をGoogle Spreadsheetで集計、そこにGoogle Apps Scriptsを用いてマクロをかけるという非常に簡易的なシステムでした。
2020年、2021年
コロナ禍へ突入。2020年は大会が中止となりました。翌21年は何とか開催まで漕ぎつけたものの、得点計算システムの出番はありませんでした。この間、次の使用機会に備えひっそりとメンテナンスを続けます。
2022年
未だコロナ禍ではあるものの、徐々に落ち着きを取り戻してきた頃。大会は昨年よりパワーアップし21年大会よりも大きな会場を使うことになりました。
この年から、得点計算システムが復活。GAS + スプレッドシートでの運用を行いましたが、同時並列的に競技結果が送信されるとデータベースが崩れるバグが発生。
スプレッドシートでの管理に限界を感じ、次年度以降の関係データベース(いわゆるSQLを用いるもの)への切り替えを決意します。
2023年
昨年と同じ会場で、同規模での開催。
得点計算システムは、新たに 福岡予選会の技術委員(高校の後輩君)と二人体制 での開発になりました。UIを一新し、京都予選会以外でも、様々な大会で使用できるようパワーアップを遂げました。又、データ管理も関係データベースに移行。
リニューアル初年度という事でまだまだバグが散乱した状態でしたが、なんとか運営する事が出来ました。
又、この年から Japan決勝大会 よりお声がけがあり、決勝大会の得点集計システムとして採用して頂ける事になりました。
結果、京都・福岡・決勝の3大会に導入する事となり、本システムが大幅に拡大した年となりました。
昨年の課題
昨年の記事の最後に記した本システムの課題点について、振り返りたいと思います。
エクストラチャレンジへの正式対応
2023年度大会から導入された新ルール。大会当日に全く新しい競技ルールが公開され、その場でミッションを攻略するのですが、採点の仕組みがこれまでと大きく変わり、システム改修に時間がかかるという事で、この年の対応は見送りました。
汎用UIの開発
採点結果入力フォームについて、これまでは全て私が、手打ちでHTML(厳密にはejs)を作成していましたが、ルール変更のたびにフォームを作り直していては効率が落ちてしまいます。DBに登録するだけでフォームを生成できるようなシステムを開発したいと思っていました。
レスポンシブUI
この年まではPCやタブレット端末を想定してUIを作成していましたが、幅広く使ってもらうためにはスマホへの対応もしなければということで、レスポンシブUI対応は必須です。
4. 今年の大会について
今年の各大会開催までの経緯・当日の様子などを記したいと思います。
京都予選会
コロナもようやく収束し、コロナ禍以前のように大会が開催できる状態です。
そこで、会場を5年ぶりに東山中学・高等学校へ戻しての開催となりました。
外部の会場ではないため時間制限等も無く、とても余裕のある運営が行えたと思います。
又、得点計算システムの威力を発揮して、こちらも5年ぶりに大会中の表彰式を実施しました。こちらは非常に好評でした。
(WRO Japan 2024 公認京都予選会 表彰式 の様子)
各地方予選会
昨年に引き続き福岡予選会の後輩とともにシステムを開発しているため、福岡では継続導入となりました。その他の地方予選会について…
4月ごろのWRO Japan 全国連絡会議にて、得点計算システムの広報機会を頂き、各予選会主催者様にシステムをご紹介しました。
その結果、京都、福岡以外に計5つの予選会に、システムを導入して頂けることとなりました。
ご連絡を頂いた予選会から順番にオンラインミーティングを行い、大会の実施日や実施カテゴリ、規模感(参加チーム数など)、当日の審判体制などをヒアリングしました。
大会当日も、私もしくは相方がオンライン上で監視し、不具合やトラブルの発生に備えました。結果的には、全ての予選会で大きなトラブル無く終える事ができ、良かったと思います。
本システムを導入して頂いた各予選会主催者様に、この場を借りて改めてお礼申し上げます。
Japan決勝大会
6月頃、WRO Japan運営陣とお話し、今年も得点計算システムを決勝大会で使用する事となりました。
今年からルールが変わり、土曜日に予選、日曜日に決勝という二日体制となりましたが、その両日に対応するシステムを構成。
又、昨年度課題としていたエクストラチャレンジにも対応し、万全の体制で導入することになりました。
その結果、土曜日の「決勝ラウンド進出者発表」ならびに日曜日の「表彰チーム」選出を素早く行うことが出来、円滑な大会運営に貢献しました。
(WRO 2024 Japan 決勝大会 開会式前 の様子)
5. 基本機能説明
昨年の記事でも説明をしておりますが、改めて本システムの基本機能を紹介したいと思います。
機能がどんどん増えており全ての項目を紹介出来なくなってきました。
ご興味がありましたら昨年の記事も併せてお読みください。
システム構成
本システムはNode.jsをエンジンにして動いております。
主に使用しているパッケージは以下の通りです。
- Express
- Socket.io
- sqlite3
- bcrypt
- json2csv
2つのアプリケーション
本システムは「審判用」と「選手・観客用」の2つのアプリケーションに別れています。
「審判用」
「審判用」はここまで説明してきた通り、審判がチームの走行を採点し、フォームに入力するためのアプリケーションです。
ホーム画面には各大会が並んでおり、ログインするアカウントに応じて大会が選択できるようになります。
大会選択後はカテゴリ選択、チャレンジ選択と続き、最終的に採点フォームが現れるといった構造になっています。
「選手・観客用」
もう一つの「選手・観客用」は、システムが算出した得点やランキングを閲覧するためのアプリケーションとなります。
各カテゴリのランキングを見る事ができる他、各チーム・各走行の細かい採点状況も確認する事が可能です。
この「選手・観客用」コンテンツは、大会主催者の意向により表示・非表示を切り替える事が出来ます。
京都予選会では観客に対する臨場感演出、また選手に対しては各走行の採点データを提供する事で今後の活動に役立てて貰おうという意図から、適切なタイミングでコンテンツを公開しています。
一方で、不要なトラブル発生を防ぐために、コンテンツを一律非公開にしている大会もあります。
採点フォーム
ここからは「審判用」アプリケーションに含まれる個々の機能についてです。
まず初めに、システムの顔とも言える「採点フォーム」を紹介します。
現行のデザインの採点フォームは2022年版から使い続けており、かれこれ3年目です。
毎年細かな修正を重ね、かなり洗練されてきました。
➀ヘッダー部
ヘッダーには「ナビゲーションウィンドウボタン」「言語切り替えボタン」「タイトル」「現在時刻」が表示されています。
「ナビゲーションウィンドウボタン」を押すと、左からウィンドウがせり出してきます。ここには、そのカテゴリにエントリーしているチームが、 コート・出走順・呼び出しボタン とともに表示されています。
これにより、審判はスムーズに次のチームがどこかを把握し、呼び出す事が可能です。
(呼び出しボタンを押すと、別画面に当該チームが表示、合成音声により放送がかかります。詳しくは昨年の記事で)
「言語切り替えボタン」はその名の通りで、ミッションの説明文を日本語と英語で切り替える事ができます。そもそも、ルールブックは英語で公開されますが、普段は日本語の方が分かりやすいので独自に翻訳したものを掲載しています。原文を確認したいときには英語へ切り替えれば良いということになります。
➁チーム選択
採点を行うチームをプルダウンから選択します。
➂ラウンド選択
走行回(ラウンド)を選択します。ミッションチャレンジ(1月公開のルールそのもの)は第1・2回、エクストラチャレンジ(大会当日公開の新ルール)は第3・4回に対応しています。
又、車検違反等によりエキシビジョン走行となる場合は、「エキシビジョン」にチェックを入れることで、順位決定時に計算に含めない設定に出来ます。
➃ミッション採点
各ミッションを採点していきます。
フォームに表示される採点UIには4種類あり、フォーム作成時に私が適切なものを選んでいます。
➃タイム入力
ストップウォッチ等で計測したタイムを入力します。小数点での入力に対応しています。
➄データ確認
ここまで入力したデータを表に一覧表示しています。この表を審判と選手が一緒に見て、入力に間違いが無いかを確認します。
➅確認・送信
問題なければ選手は「確認ボタン」のチェックボックスを押します。又、審判も問題無ければ、送信ボタンを押して、採点情報をサーバに送信します。
以上で、1チーム分のフローが完了します。
順位・採点結果閲覧
審判用ページでも、送信された採点結果を確認する事ができます。
観客用ページよりもより詳細に、何時に・誰が・どのような内容のデータを送ったのかが一覧表示されています。
6. アップデート項目
ここからは、2024年版で新たに追加された機能や、アップデートされた項目について記していきます。
デザイン改良
主にヘッダー部の色味を、流行りのデザインに変更しました。細かな修正ですが、このように並べてみるとかなり印象が良くなったと感じています。
レスポンシブUI対応
得点計算システムは当初、iPadなどのタブレットでの使用を想定して作られていたため、採点フォームは長らくの間タブレットに合ったデザインとなっていました。
しかし、ユーザー様が増えた結果いい加減スマホでも見やすいUIに改良する必要があると感じ、今年からようやく全ページレスポンシブUIに対応しました。
エクストラチャレンジ対応
昨年の最大の課題となっていた「エクストラチャレンジ」への対応がついに完了しました。エクストラチャレンジルールの対応により、ただ単純にフォームが増える(分岐が増える)だけでは無く、得点計算アルゴリズムにも手を加える必要があり、対応が遅れてしまいました。
CSVで結果ダウンロード
これまで、計算された結果(順位)を閲覧するには、都度サイトにアクセスする必要がありました。しかし、大会運営者は、事あるタイミングで確定結果を確認する必要があり、その度にサイトにアクセスするのは少し面倒です。
そこで、採点結果や順位をCSVファイルに書き出し、ローカルに保存出来るようにしました。
これは非常に好評で、得点計算システムならではの機能が作れたと思います。
ただ、今年版のCSVは少し形式が分かりにくかったため、来年に向けてより見やすいCSVを生成出来るようにしたいと思います。
採点表の印刷対応
観客用ページから閲覧出来る、各チーム・各走行の詳細結果(採点表)について、印刷ボタンを配置し、簡単に印刷が出来るようにしました。
ただ単に印刷のショートカットボタンになっている訳ではなく、印刷時には必要のないヘッダー部や各種ボタンを非表示にした上で、印刷ダイアログを出す形にしています。
バックアップ機能
せっかくのQiitaの記事ですので、今期犯してしまったポカについても書き残しておきたいと思います。
予選会と決勝大会の間の期間でシステムアップデートを行っていた際、誤ってデータベースファイルを取り違えてしまい、それまでの予選会の一部データが削除されてしまうという大失態を犯してしまいました。データ収集ツールとしてあるまじき失敗です。
幸い、各予選会主催者様が上記のCSVファイルをダウンロードして下さっていたため事なきを得ましたが、タイミング次第では最悪の事態が起こっていました。
そこでインシデント発生後、すぐに対策用のツールを作成しました。
まず、データベースファイルと、ソースコード丸ごとをコピーするPythonスクリプトを作成。本番用フォルダとは別の場所に逐次保存するようにしました。
そしてこのPythonスクリプトをcronを用いて定期的に実行するよう設定しました。(データベース単体は10分ごと、ソースコード丸ごとは半日ごと)
これにより、万が一データベースファイルを削除してしまっても、バックアップから復元できる体制を整えました。
(ご迷惑をおかけした予選会主催者様、改めて申し訳ございませんでした)
参考記事
Pythonスクリプトに関して
cronに関して
7. 来年に向けて
来年に向けて、改善していこうと考えている点を挙げていきたいと思います。
HTTPSへの対応(SSL化)
これまでずっと、サーバーへの接続はHTTPで行っていましたが、他の予選会の皆様にも使って頂く上で、HTTPSへの対応(SSL化)は必須だということになりました。
来年のシステムはHTTPSに対応した状態での提供を予定しています。
得点入力フォームについて
得点を入力するためのフォームは、毎年私が作り直しています。これにかなり時間を要する他、当日発表のルールなどには対応出来ないという欠点がありました。(決勝大会では、私がチーフジャッジでしたので、事前にフォームを作成し、当日の発表までローカルに保存していました)
この状況を脱却するため、Excel等でフォームの構成を書き記し、自動的にフォームを生成するプログラムを書き進めています。
これにより、フォーム作成時間の短縮、また属人化の解消を行います。
各種UIの改善
実は「戻るボタン」が配置されるべき場所に無かったり、レスポンシブデザインへの対応が不十分でコンテンツが途切れていたりと、UI面での改善も多く必要な状況です。多くの人に使って貰えるような状況になってきたからこそ、より分かりやすいデザインへ改良していきます。
8. 最後に
今年も機会に恵まれ、得点計算システムを多くの大会にて使って頂く事が出来ました。
調べたところ、 本システムが計算したチームは計8大会、総チーム数は530 に上りました。
改めて計算してみると自分でもビックリです…
もともとは自分の予選会だけのツールだったものがここまで成長し、嬉しい感情とともに責任感も毎年増しています。
決勝大会でお会いする方々からはお褒めの言葉をたくさん頂き、それがオフシーズンのアップデート作業の糧となっています。みなさま本当にありがとうございます。
来年以降もどうぞよろしくお願いします。
そして、新規導入のお声がけもお待ちしております!