浅葱輪業

Programming & Bicycle

OGK Kabuto AERO-V1 レビュー

f:id:tk-r:20190416204125j:plain

アイウェアなしで運用できるエアロヘルメット

前作AERO-R1は周りでも使ってる人がいて、付属のシールドを使用することでアイウェアが不要になることが絶賛されていました。自分も泊りがけのツーリングの際にはアイウェアとは別に普段の眼鏡もケースごとパッキングしているので、これらをひとまとめにできるのは魅力的です。

ただし、エアロ性能とのトレードオフで、夏場は非常に暑いという致命的な欠点があるとのことで、自分での購入には至っていませんでした。

とはいえ旧ZENARDも3年が経過して、ヘルメット買い替えだなあと悩んでいたところ、昨年のサイクルモードで発表されたのが本作AERO-V1です。

公式の引用だと、

エアロフォルムによる空力性能と、スムーズなエアフローを実現した快適エアロモデル。

ということで、エアインテークがAERO-R1より増えて熱の籠りを抑えているとのこと。AERO-R1と同様にARS-3シールドを使用可能ということで、発売を心待ちにしていました。 

一般流通は6月以降ですが、破損交換登録店では先行して4月に入荷するとの前情報が流れていました。Twitterを眺めていたところ、

 とのことだったので新宿に行く用事のついでにIYHしてきました。

新宿店では4人目の購入者だったそうです。

AERO-R1とは異なり、標準ではシールドは付属しません。Y'sRoadではシールドアップグレードキャンペーンということで、6/16までにARS-3シールドを同時購入すると10%OFFとのことだったで、調光シールドもセットで購入しました。

 

重量

本体(S/M):220g

f:id:tk-r:20190416190515j:plain

調光シールド:28g

f:id:tk-r:20190416190519j:plain

どちらも公称値ジャストでした。

インプレ

早速90km程度のサイクリングに使用してみたので、インプレをまとめたいと思います。比較対象は3年ほど使用した旧ZENARDになります。

装着感

割と上々で、バイザーをつけると「ちょっと重いかな」という程度。心配していた眼鏡との干渉もありません。

今の季節(4月上旬)の気温だと、熱がこもるような暑さは全く感じませんが、こちらは引き続き使用して様子を見たいと思います。

空力

エアロ効果は意外と体感できます。特に顕著なのが30km/h以上で巡行しているときに首を横に向けた際で、頭の周辺の空気の流れが変わって抵抗が増えるのがハッキリとわかります。

重量はZENARDから重くなってますが、高速巡行中に正面を向いているときには「なんとなく」首に掛かる負担が小さいような気がします。

気になった点

本ヘルメットを購入する人のほとんとがセットで購入すると思われるARS-3シールドですが、シールド装着時に内部で光が反射しているのが気になりました。

今回購入したのは調光モデルですが、店頭で試着した際にはクリア系よりミラー系カラーの方が反射光が激しいように感じました。気になる方は一度実物を確認してみることをお勧めします。

総評

普段使用している眼鏡を着用したまま使用できるシールドが秀逸なモデルです。

エアロ効果も体感できますし、眼鏡ユーザーは選択肢としてかなりオススメできます。6月の富士ヒルは平坦区間も考慮して、ZENARDではなくAERO-V1で出場する予定です。

眼鏡ユーザーとしては、空力に魅力を感じず20g程度の重量増を許容できるなら、より安価な同社のVITTも選択肢としてはアリかと思います。

www.ogkkabuto.co.jp

Rust on EV3RTの構築手順(ETロボコンにRustで参加しようと思っている方向け)

この記事はETロボコン&EV3 Advent Calendar 2018 - Qiitaの22日目の記事です。
来年のETロボコンにRustで参加する人のために、プロジェクトをビルドして実機で動作させる手順を記載します。
本記事は、以下の環境で検証しています。

EV3RT開発環境のインストール

qiita.com
こちらの記事を参考に、EV3RTの環境を構築します。

Rustのインストール

Rustのツールチェイン管理ツールであるrustupをインストールして、必要なコンパイラを追加します。

$ curl https://sh.rustup.rs -sSf | sh
$ rustup default nightly
$ rustup target add armv5te-unknown-linux-gnueabi

Rust on EV3RT SDKのインストール

hrp2をダウンロードしたディレクトリに移動して、Rustのサンプルプロジェクトのリポジトリをダウンロード及び解凍します。

$ pwd
/mnt/c/Users/hogehoge/Documents/hrp2
$ wget https://github.com/TK-R/ev3rt-hrp2-sdk-rust/archive/0.1.zip
$ unzip 0.1.zip
$ cd ev3rt-hrp2-sdk-rust-0.1/workspace

サンプルプログラムの確認

ダウンロードしたリポジトリは下記の構成となっています。

$ tree rust-sample
rust-sample/
├── Cargo.lock
├── Cargo.toml
├── Makefile.inc
├── app.c
├── app.cfg
├── app.h
├── balancer.c
├── balancer.h
├── balancer_param.c
├── balancer_private.h
├── src
│   ├── ev3
│   │   ├── balancer.rs
│   │   ├── battery.rs
│   │   ├── button.rs
│   │   ├── ev3rt.rs
│   │   ├── lcd.rs
│   │   ├── led.rs
│   │   ├── mod.rs
│   │   ├── motor.rs
│   │   └── sensor.rs
│   ├── lib.rs
│   └── sample.rs
....

この中で、lib.rsがプログラムのエントリポイントであり、balancer~のソースコードが公式から提供されている倒立振子ライブラリとなります。
先日の記事で紹介したように、FFIを持ちいて呼び出すことで、C言語のライブラリを資産として活用しつつ、
呼び出し側は安全なRustによって記述することができています。

ソースコードのビルドとインストール

続いて上記のソースコードをビルド、インストールします。
EV3とBluetoothで接続した状態で、以下のコマンドを実行します。

$ make app=rust-sample
$ ll
total 484
drwxrwxrwx 1 tk-r tk-r   4096 Dec 20 23:37 ./
drwxrwxrwx 1 tk-r tk-r   4096 Dec 20 23:21 ../
-rwxrwxrwx 1 tk-r tk-r   4516 Dec 20 23:06 Makefile*
-rwxrwxrwx 1 tk-r tk-r 485832 Dec 20 23:42 app*
drwxrwxrwx 1 tk-r tk-r   4096 Dec 20 23:42 rust-sample/

出力されたappがEV3RTで実行可能なアプリケーションとなりますので、Bluetooth/USBなどの方法でSDカードにコピーします。
β7-2の環境でコピーするなら、Bluetoothが一番簡単かと思います。
ビルドしたプロジェクトを実行するには、センサとモータを以下の通りに接続します。

  • Lモータ : PortC
  • Rモータ : PortB
  • 尻尾モータ : PortA
  • タッチセンサ : Port1
  • ジャイロセンサ : Port4

起動後、タッチセンサを操作すると倒立振子で直進します。
www.youtube.com

動きました。

最後に

この記事が、ETロボコンにRustで参加する方の手助けになれば幸いです。

RustをEV3RT上で動かす話

はじめに

この記事は、ETロボコン&EV3 Advent Calendar 2018 - Qiitaの16日目の記事です。
昨年はEV3RTとC++ETロボコンに参加していましたが、今年はRustをEV3RTで動作させる実験をしたので、その話を書きます。

ETロボコンにおけるRustの利点

Rustは「速度、平行性、安全性を言語使用として保証するC/C++に代わるシステムプログラミングに適したプログラミング言語」を目指しています。

Rust (プログラミング言語) - Wikipedia

Rustはコンパイル基盤にLLVMを用いており、EV3のCPU(ARM)に対応しています。後述するアプローチで、C言語の関数と同様にEV3RT上で実行することができます。
個人的に、以下に示すRustの長所は、ETロボコンに適用するにあたり非常に有用であると感じています。

  • モダンな言語が備えていてほしい機能を有している(Pattern Maching / Traits 等)
  • C/C++と同等の実行速度であり、リアルタイムOSであるEV3RT上で実行できる
  • C/C++や他言語と連携が可能な仕組みがあり、公式APIを含む資産を活用できる
  • 標準環境で単体テストを実行できる(cargo test)
  • Bare-metalまたはRTOS上で動作させるための標準ライブラリを使用しない設定ができる(no-std)

今回の記事ではRustそのものの有用性については割愛しますが、ETロボコンC/C++の置き換えを検討するに値すると感じています。

RustをEV3RT上で実行するためのアプローチ

以下の方式で、Rustで書いたコードをEV3RT上で実行することができました。

EV3用バイナリの出力方法

前述の通り、RustはEV3のCPUであるARM向けにバイナリを出力することができます。(target=armv5te)
ビルドオプションを使用することで、EV3RTのappバイナリとリンク可能なオブジェクトファイルを出力することができます。

$ cargo rustc --target armv5te-unknown-linux-gnueabi -- -C panic=abort  -O 

targetがarmv5te-unknown-linux-gnueabi となっていますが、-Oオプションを用いるとオブジェクトファイルを出力することができます。
また、ソースコード内で#![no_std]宣言を行うことにより、OSの機能を使用しないバイナリとなるため、EV3RTとリンクさせて動作させることができます。
標準ライブラリーの不使用

エントリポイント

FFIにより、lib.rsに以下の用に記述した関数を、C言語の関数のように呼び出させることができます。

#[no_mangle]
pub extern "C" fn main_task(_exinf: i32) {
	// Rustのエントリポイント
}

この関数をEV3RTのタスクとして起動するためのapp.cfgファイルは以下の通りです。

INCLUDE("app_common.cfg");
#include "app.h"

DOMAIN(TDOM_APP) {
	CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
}

ATT_MOD("app.o");
ATT_MOD("rust.o");

EV3RT APIの呼出し

FFIの機能を用いて、EV3RTが提供するセンサやモータの操作関数をRustから呼び出すことができます。
以下のコードで、カラーセンサの値を読み出すことが可能です。

#[repr(C)]
#[derive(Default, Debug)]
pub struct RGBRaw {
	pub red: u16,
	pub green: u16,
	pub blue: u16,
}

pub fn color_sensor_get_rgb_raw(port: &SensorPort, rgb_raw: &mut RGBRaw) {
	let port = get_sensor_port(&port);
	unsafe {
		ev3_color_sensor_get_rgb_raw(port, &mut *rgb_raw);
	}
}

extern "C" {
	fn ev3_color_sensor_get_rgb_raw(port: u8, raw: *mut RGBRaw) -> i32;
}

サンプルプロジェクトのビルド

以上をまとめて、EV3RTのディレクトリに放り込める形のソース一式を作成しました。
github.com
以下のデバイスについて、動作検証を行いました。
ev3rt\hrp2\sdk に含まれるファイルを、上記リポジトリのファイルで置き換えてください。
あとはETロボコン参加者の皆さんにはお馴染みのコマンドでビルドできます。

$ cd sdk_rust/workspace/
$ make app=rust-sample

f:id:tk-r:20181214000255j:plain
デデーン

上記のリポジトリのソースファイルでは、以下のデバイスを検証した際のコードを含めています。

  • モータ(L / M)
  • カラーセンサ
  • 超音波センサ
  • ジャイロセンサ
  • タッチセンサ
  • 本体機能( LCD / LED / Button / Battery)

本記事の検証は以下の環境で実施しました。

最後に

この記事を読んで、少しでもRustに興味を持ってもらえればと思います。
それでは、来年ETロボコンに参加される皆さん、どうかご安全に。

Bash on WindowsでPDFファイルからベクタ画像を取得する

ETロボコンの競技規約から、マップ画像を抜き出したくなったのでメモ。

pdftkを使用してPDF画像を1ページごとに分割。

# sudo apt-get install pdftk
$ cd work
$ pdftk hoge.pdf burst
$ ls
doc_data.txt  pg_0007.pdf  pg_0014.pdf  pg_0021.pdf  pg_0028.pdf  pg_0035.pdf  pg_0042.pdf  pg_0049.pdf
pg_0001.pdf   pg_0008.pdf  pg_0015.pdf  pg_0022.pdf  pg_0029.pdf  pg_0036.pdf  pg_0043.pdf  pg_0050.pdf
pg_0002.pdf   pg_0009.pdf  pg_0016.pdf  pg_0023.pdf  pg_0030.pdf  pg_0037.pdf  pg_0044.pdf  pg_0051.pdf
pg_0003.pdf   pg_0010.pdf  pg_0017.pdf  pg_0024.pdf  pg_0031.pdf  pg_0038.pdf  pg_0045.pdf  pg_0052.pdf
pg_0004.pdf   pg_0011.pdf  pg_0018.pdf  pg_0025.pdf  pg_0032.pdf  pg_0039.pdf  pg_0046.pdf  pg_0053.pdf
pg_0005.pdf   pg_0012.pdf  pg_0019.pdf  pg_0026.pdf  pg_0033.pdf  pg_0040.pdf  pg_0047.pdf  pg_0054.pdf
pg_0006.pdf   pg_0013.pdf  pg_0020.pdf  pg_0027.pdf  pg_0034.pdf  pg_0041.pdf  pg_0048.pdf

あとは該当ページをInkscapeで編集して、保存。

富士五湖巡りライド

以前より計画していた富士五湖ライドを実行に移すときが来た…

富士山ライドは去年の9月に自走で富士スカイラインを攻略して以来二回目のチャレンジ。 

f:id:tk-r:20160509225825j:plain

ただし、最寄り駅から輪行マン。

今回のプランは輪行富士駅まで移動して、富士五湖を巡りつつ山中湖で一泊、道志みちを下って帰宅というプラン。

というわけで、

f:id:tk-r:20160509230112j:plain

こしらえた。

富士駅からゆるゆると20kmほど走って、白糸の滝。

f:id:tk-r:20160509230516j:plain

ビンディングシューズからビーチサンダルに履き替えて、いざ滝の麓へ。

なるほど滝じゃねーの。

f:id:tk-r:20160509230701j:plain

人は結構いたけど、水しぶきが飛んでるからかなり涼しかった。清涼清涼。

コンビニ補給を挟みつつ、朝霧高原を目指したけど、桜まつりをやってたみたいで渋滞が凄かった。だらだらと緩い斜度の道を上る。

そんなこんなで道の駅朝霧高原

f:id:tk-r:20160509231340j:plainf:id:tk-r:20160509231700j:plain

ここで食べたアイスクリームが美味すぎた!ただ流石に少し寒かったかな。

残りの上りも片づけて、食事処で昼食。

f:id:tk-r:20160509232239j:plain

胡麻うどん。

それなりのアップダウンを挟みつつも本栖湖精進湖、西湖、河口湖と回っていく。

f:id:tk-r:20160509232249j:plain

この日は天気が最高で、常に右手に富士山が見えていた。ただし風はそれなりに強く、途中で先頭を交代しながら登って行った。

あと、GWだからだろうけど普段運転していないような自動車が目立っていた気がする。対向車線であわや接触、みたいなタイミングも見た。

安全運転でさらに走行。

f:id:tk-r:20160509232259j:plain

 本日のゴール、山中湖。湖畔にはサイクリングロードが整備されていたので、ゆったり流しながらクールダウン(この看板を探してた)。

近所のコインランドリーで洗濯物を回しつつ、夕飯。

・・

・・・

 

 

翌朝。朝6時に目が覚めて…

f:id:tk-r:20160509234136j:plain

宿から見た富士山。快晴すぎる。

 

山中湖畔から道志みちに入って、2kmほど上ったあとは延々とダウンヒル

途中で吊り橋を発見したので撮影タイム。

f:id:tk-r:20160509234902j:plain

そのあと宮ケ瀬湖を抜けて伊勢原に降りて、だらだら走って帰宅。

GWを利用して初めての泊りがけライドに挑戦したけど、全工程を通して好天に恵まれてラッキーだった。2日間の総走行距離は190km。

 

日本最高標高を誇る富士山。

次はヒルクライムも交えてぜひ挑戦したい。

f:id:tk-r:20160509233346j:plain

Di2バッテリー台座にボトルケージを追加

3ボトルケージ化

輪行を絡めたロングライドを行う場合、輪行袋の収納場所が問題になります。

大型サドルバッグにまとめて放り込むのが定番だと思いますが、重心が高くなるのと無駄さにかさばるのが非常によくない。

 

そこでBB下のスペースにボトルゲージを追加して、積載量を増やす方法があります。

cbnanashi.net

これを使うことで、ボトルケージを3個搭載して

を同時に積載することができます。さらに比較的重たいツール缶を最下部に積載することで重心が低くなります。

ただし、この方法だとフレームとボトルケージのサイズによっては前輪と干渉する場合があります(した)。

 

 Di2バッテリー台座

あれやこれやと考えていたときに、この穴が目に入りました。

f:id:tk-r:20160125111729j:plain

自分の使用しているフレームは2014年モデルのBH Quartzであり、このフレームはシマノの電動コンポDi2に対応しています。

この穴はDi2のバッテリー台座固定用の穴であり、M4でねじ切りされています。

自分のQuartzはUltegra Di2で組んでいますが、バッテリーは内蔵用をシートポストに搭載しているため、この穴は使用していませんでした。

というわけで改造作業の始まりです。

 

ボトルケージマウントアダプター SM-BA01

www.amazon.co.jp

この製品はDi2バッテリーとボトルゲージが干渉した場合に、ボトルケージの位置を調整するためのアダプターです。

f:id:tk-r:20160125112459j:plain

ただし、Di2のバッテリー穴の間隔は40mmのため、このアダプタはそのままでは使用することができません。

レッツ工作。

f:id:tk-r:20160125112924j:plain

10mmほど削ることで、固定可能な幅を確保することができました。

M4x10mmのネジを調達して、

f:id:tk-r:20160125113021j:plain

無事にBB下にボトルケージを追加することができました。

前述の製品を使用した場合よりさらにボトルケージの位置を下げれたため、前輪との干渉もありません。 

(当然ですが本改造は完全に自己責任となりますので、真似した場合に発生した問題は一切負えません)

Windows 10 で LifeCam Studio が動かないときの対処法

www.microsoft.com

 

一時期安売りしてたんで持ってる人も多いかと思います。

ですが、 Windows10にアップデートしてからSkypeなどでカメラを認識しなくなっていました。(マイクは使用可能)

 

http://answers.microsoft.com/en-us/windows/forum/windows_10-hardware/microsoft-lifecam-windows-10/9c54aaac-d91a-4dc6-988b-362150eeebfa?page=5

 

ここに書いてある通り、一旦ドライバをアンインストールしてからオンラインからの自動インストールで動作しました。