世界を動かす技術を、日本語で。

TrackWeight: MacBookのトラックパッドをデジタル体重計に変える

概要

TrackWeightは、MacBookのForce Touchトラックパッドを精密なデジタルはかりに変えるmacOSアプリケーション。 Open Multi-Touch Supportライブラリを用いて圧力データを取得し、グラム単位で計測可能。 キャリブレーションは従来のはかりと比較して高精度を実現。 指の接触が必要など、利用にはいくつかの制約あり。 主に実験・学習用途向けで、商用や重要な計測には非推奨。

TrackWeight: MacBookのトラックパッドをデジタルはかり化

  • TrackWeightmacOS用アプリケーション
  • MacBookのForce Touchトラックパッドデジタルはかり として利用可能
  • Open Multi-Touch Supportライブラリ (Takuto Nakamura氏作)を活用
  • トラックパッドの 圧力センサー から得たデータを グラム単位 で計測
  • SwiftUI によるユーザーインターフェース
  • Combine によるリアクティブデータフロー
  • Xcodeプロジェクト として提供

使い方

  • アプリケーションを開いて スケール画面 を表示
  • 指をトラックパッドに軽く接触 させる
  • 指の接触を維持 しつつ、計測したい物体をトラックパッドに置く
  • できるだけ指圧を加えず に接触を維持
  • 表示された数値が 物体の重さ(グラム)

仕組み

  • Open Multi-Touch SupportライブラリmacOSのトラックパッドイベント へプライベートアクセス
  • 圧力データ は指などの 静電容量 が検出されたときのみ取得可能
  • Force Touchセンサー の値を キャリブレーション し、重量へ変換
  • キャリブレーション方法
    • MacBookのトラックパッドを既存のデジタルスケール上に設置
    • 既知の重り を指接触状態で順次載せ、データを比較・調整
    • マルチタッチデータ は既にグラム単位で取得可能

必要要件

  • macOS 13.0以降 (ライブラリ対応のため)
  • Force Touchトラックパッド搭載MacBook (2015年以降のPro、2016年以降のMacBook)
  • App Sandbox無効化 (トラックパッドへの低レベルアクセス必須)
  • Xcode 16.0+、Swift 6.0+ (開発用)

インストール手順

  • リポジトリをクローン
  • TrackWeight.xcodeprojXcodeで開く
  • App Sandboxを無効化 (プロジェクト設定)
  • ビルド&実行 でアプリ起動

制限事項

  • 指の接触必須 :静電容量検出時のみ圧力データ取得可能
  • 物体の設置方法 :指の接触を妨げないように物体を配置
  • 金属物体 :金属は指と誤認される場合あり、 紙や布を間に挟む ことで対応
  • 直接計量不可 :指接触なしでは計量不可

技術詳細

  • SwiftUI でUI構築
  • Combine でデータフロー管理
  • Open Multi-Touch Supportライブラリ 利用
    • macOSトラックパッドの グローバルなマルチタッチイベント 取得
    • 位置・圧力・角度・密度 など詳細なタッチデータ
    • スレッドセーフなasync/await対応
    • タッチ状態追跡 ・センサーデータ網羅
  • MITライセンス (Takuto Nakamura氏による)

免責事項

  • 本アプリは 実験・教育用途 向け
  • 精度保証なし、重要な計測や商用利用には非推奨
  • 正確な計量が必要な場合は従来のはかりで検証 が必須

Hackerたちの意見

昔、似たようなことができるiPhoneアプリがあったよね。 - https://www.theverge.com/2015/10/28/9625340/iphone-6s-gravit...

誰かiPhone 6S使ってる人いないかな… http://touchscale.co/

https://archive.li/KtfxO

私の記憶だと、重さのAPIは、iPhoneを使ってドラッグ取引をする人が出てくるのを避けるためにプライベートにされたんだよね。

バロメーターが付いてる電話なら、どれでもスケールを作れるよ。iPhoneは6以降、Pixelも、Samsungのフラッグシップモデルもみんなそうだし。ジップロックの袋を用意して、空気を入れて膨らませて、圧力を大きなフォントで表示するアプリを動かしてる電話を袋の中に入れるんだ(ジップロック越しに見えるようにね)。その後、25セント硬貨みたいな既知の重さの物体を、空気が入ったジップロックの上に慎重にバランスを取って置いて、表示された圧力の変化をメモする。これで、重さと圧力の変化が線形にスケールすると思うから、ジップロックの上にバランスを取れる小さいものなら何でも測れるようになるよ。

あ、iPhone 6Sでこれができたのを覚えてる。

これ面白いけど、ルーブ・ゴールドバーグマシンみたいな感じだね。やり方はこんな感じ:1. スケールを開く 2. トラックパッドに指を置く 3. 指をつけたまま、物をトラックパッドに置く 4. 接触を保ちながら、トラックパッドにあまり圧力をかけないようにする。これが物の重さだよ。つまり、圧力センサーは静電容量を検知しないと動かないから、何かを測るときはトラックパッドに触れてないとダメなんだ(でも、あまり強く触れないでね!)。

指をトラックパッドの数ミリ上に浮かせると、静電容量が検知されることもあるよ。

濡れたスポンジで静電容量を得られないかな?普通の食器用のセルローススポンジみたいなやつ。小さなプラットフォームを作れるかも?

小さな導電性フォームや、うまく重ねたアルミホイルと紙の組み合わせはどうかな?物体をシムの上に置けばいいんだよね(シムは重さが分かってるか、ほとんど無視できるくらいの)。

iPhoneだと、金属のスプーンを画面に置いて、そのスプーンに何かを乗せて重さを測るっていうハックがあったよね。

ホットドッグを正確に測れるかな?

これはすごく賢いハックだね。まさにHacker Newsに載るべきものだよ。

これ賢いね!しかも、役に立ちそう。どれくらい正確かテストしたことある?意図された使い方じゃないから、ノートパソコンによって結構バラつきがあると思うんだ。

「ノートパソコンの間にはかなりのばらつきがあると思う。これは意図された使い方じゃないから。」そうそう、普通のひずみゲージ、つまりロードセルもそうだよね。2点キャリブレーション(無負荷の後に既知の負荷)を使うか、もっと精度が欲しいなら3点キャリブレーションを使うことができるよ。[1] https://en.wikipedia.org/wiki/Load_cell

Appleのハードウェアは、出荷前にキャリブレーションされてると思うよ。製品ラインの均一性がすごく大事だから、ディスプレイやオーディオハードウェアも個別にキャリブレーションされてるしね。新しいノートパソコンを手に入れて、トラックパッドの感触が違うなんて変だよね。

サファリではタッチの強さがあるらしいから、これをウェブ用に作るのも可能かも、いいね。

誰かこれを出発点にできるかも。http://touchscale.co/ タッチの強さと重さのデータを集めて、回帰パラメータを出さないといけないけど。(もしやるなら教えてね。上のサイトに追加できるし、意外と多くのアクセスがあるのを一緒に楽しめるよ。)

誰かバイナリを作ってくれない?それだけのためにXcodeをダウンロードしたくないんだ…

これ、20年前にPowerBookのハードドライブの振動センサーを使って、建設音を測るための地震計を作ったことを思い出すな。

ThinkPadの振動センサーを使って、機械に叩きつけられたのを検出して、適切な側から叩かれたら仮想デスクトップを切り替えるようにXウィンドウマネージャを改造した人たちを思い出すな。左側を叩かれたら右に、右側を叩かれたら左にパンするってやつ。

IBMがこのビルから移転したって聞いたよ。[1] 向かいの塔の建設による振動で、コンピュータセンターのハードドライブが壊れ続けてたから。[1] https://en.wikipedia.org/wiki/330_North_Wabash

iPhoneを気圧レコーダーとして使ったことがあるよ。それ用のアプリがいくつかあるんだ。とにかく、車のトランクがちゃんと閉まらなくて、高速道路の舗装の継ぎ目を越えるとちょっと開いて、すぐに閉まるのが気持ち悪かった。データをテスラのサービスに見せたら、(文句を言いながら)トランクを調整してくれた。問題は解決したよ。

Appleはずっと前にアプリを作ってたと思うけど、誰かがタイヤを載せたら訴えられちゃうだろうね。

トラックパッドをスケールに使って、逆さまのエアロプレスで失敗する様子が想像できるな。

すごいね、Krish!フォートマクマリーからこんにちは!このプロジェクトをコンピュータサイエンスの授業の例に使うつもりだよ。

TrackWeightは中村拓人のOpen Multi-Touch Supportライブラリを利用して、macOS上のすべてのマウスとトラックパッドのイベントにプライベートアクセスを得ている。このライブラリは、通常のアプリケーションではアクセスできない圧力データを含む詳細なタッチデータを提供する。ライブラリとして利用できるのに、ネイティブインターフェースとしては利用できないってどういうこと?SwiftはそのAPIを公開してないの?

Mac OSには「プライベートフレームワーク」があって、システムで使われる共有ライブラリだけど、デフォルトではヘッダーが付属してないんだ。これらのヘッダーをライブラリから生成するのは簡単で、MultitouchSupport.frameworkのラッパーであるOpenMultitouchSupportみたいにラッパーを作ることができる。