LinuxでThinkPadラップトップジャイロを操作する

Linuxでは、このセンサーからの読み取り値はファイル/ sys / devices / platform / hdaps / positionから読み取ることができます

仮想ジョイスティックを作成し、たとえば、ネバーボールでボールを転がしたり、Google Earthをねじったりすることができます。 :)

このすべてについて、 ここで説明します。

私はまた、楽しい時間を過ごすことに決め、ラップトップの傾きに応じて画面上でカイロ時計をスライドさせる小さなプログラムを作成しました。



ウィンドウを検索および管理するために、wnckとpygtkを使用しました。 動きをスムーズにするために、物理的なpyodeエンジン( Open Dynamics Engineにバインド)を使用しました。



 #!/ usr / bin / python
 #コーディング:utf-8
 gobjectをインポートする
 OSインポートシステムから
インポートgtk、wnck
インポートオード

 STALE =(501,487)#hdapsの値/通常位置の位置

 def hdaps():
     pos = list(eval(open( '/ sys / devices / platform / hdaps / position')。read()))
     pos [0] + = STALE [0]
     pos [1] + = STALE [1]
     abs(pos [0])<4の場合:pos [0] = 0
     abs(pos [1])<4の場合:pos [1] = 0
    ない場合(pos):0を返す
    返品可能

 def find_clock(scr、body、world):
     "" "カイロ時計ウィンドウを見つけてください。見つからない場合は起動してください
     「」「もう一度」を見つけてください
     clk =なし
     scr.get_windows()のw:
         if w.get_application()。get_name()== 'cairo-clock':
            印刷clk
             clk = w
            破る
     clkでない場合:
        システム(「cairo-clock&」)
         gobject.timeout_add(500、find_clock、scr、body、world)
    その他:
        印刷clk
         clk = gtk.gdk.window_foreign_new(clk.get_xid())
         gscr = clk.get_screen()
         body.setPosition((list(clk.get_root_origin())+ [1]))
         #ウィンドウを見つけ、それを制御するタイマーを開始します
         gobject.timeout_add(20、play、clk、body、world、gscr.get_width()、gscr.get_height())

 def play(clk、body、world、sw、sh):
     gval = hdaps()
     gvalの場合:
         body.addForce((gval + [0]))
     world.step(0.04)

     fx、fy、fz = body.getLinearVel()
     body.addForce((-fx / 2、-fy / 2.0))#ゆっくりと動きを遅くする

     #画面の端を出るとき、反対側の端から飛び出す
     bx、by、bz = body.getPosition()
     x、y = clk.get_position()
     w、h = clk.get_size()
     x <-(w / 2)の場合:bx = sw-(w / 2)
     elif x> sw-(w / 2):bx =-(w / 2)
     y <-(h / 2)の場合:by = sh-(h / 2)
     elif y> sh-(h / 2):by =-(h / 2)
     body.setPosition((bx、by、bz))
     clk.move(int(bx)、int(by))
    真を返す

 def main():
    試してください: 
         scr = wnck.screen_get_default()
         scr.get_windows()
         world = ode.World()
         world.setGravity((0,0,0))
         body = ode.Body(世界)
         M = ode.Mass()
         M.setSphere(2500.0、0.05)
         M.setBox(1000,250,250,1)
        質量= 0.5
         body.setMass(M)
         gobject.timeout_add(200、find_clock、scr、body、world)
         gtk.main()
    例外を除く、e: 
        印刷(e) 
         
 __name__ == "__main__"の場合: 
    メイン()




これは次のようなものです。

www.youtube.com/v/l_Ts2BESraI&hl=en-明確にするために撮影

www.youtube.com/v/5oBpODqookY&hl=en_US&rel=0-画面からのビデオ



画面が強く傾いた場合に画面を回転させる別の小さなスクリプト(ibmのスクリプトは機能していません)

 #!/ usr / bin / env python
 #コーディング:utf-8
 os、sysのインポート
インポートスリープから

 ROTATE_ON = 100
 STALE_VALUE = 500#hdapsの最初の値/通常の位置

 def rotate(where):
     return os.system( 'xrandr --output LVDS --rotate%s'%where)

 def readx():
     return int(open( '/ sys / devices / platform / hdaps / position')。read()。split( '、')[0] .lstrip( '('))+ STALE_VALUE

 __name__ == '__main__'の場合:
     Trueの場合:
        睡眠(0.1)
         x = readx()
         x <-ROTATE_ONの場合:回転(「右」)
         elif x> ROTATE_ON:回転(「左」)
        その他:回転(「通常」)



All Articles