Играемся с гироскопом ноутбука thinkpad в linux

    В линукс показания с этого датчика можно считать из файла /sys/devices/platform/hdaps/position
    Можно создать виртуальный джойстик и, например, катать им шарики в neverball, крутить google earth и т.п. :)
    Всё это описано тут
    Я тоже решил развлечься и написал небольшую программу, которая заставляет cairo-clock сползать по экрану в зависимости от наклона ноутбука.

    Для поиска и управления окном я использовал wnck и pygtk. Чтобы сгладить движение я взял физический движок pyode(биндинг к Open Dynamics Engine).

    #!/usr/bin/python
    # coding: utf-8
    import gobject
    from os import system
    import gtk,wnck
    import ode
    
    STALE = (501,487) #значения в hdaps/position в нормальном положении
    
    def hdaps():
        pos = list(eval(open('/sys/devices/platform/hdaps/position').read()))
        pos[0]+=STALE[0]
        pos[1]+=STALE[1]
        if abs(pos[0])<4: pos[0]=0
        if abs(pos[1])<4: pos[1]=0
        if not any(pos): return 0
        return pos
    
    def find_clock(scr,body,world):
        """ пытаемся найти окно cairo-clock, если не находим-запускаем его
        и пытаемся найти снова """
        clk = None
        for w in scr.get_windows():
            if w.get_application().get_name()=='cairo-clock':
                print clk
                clk = w
                break
        if not clk:
            system('cairo-clock &')
            gobject.timeout_add(500,find_clock,scr,body,world)
        else:
            print 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()
        if 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()
        if x<-(w/2): bx=sw-(w/2)
        elif x>sw-(w/2): bx=-(w/2)
        if 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))
        return True
    
    def main():
        try: 
            scr=wnck.screen_get_default()
            scr.get_windows()
            world = ode.World()
            world.setGravity( (0,0,0) )
            body = ode.Body(world)
            M = ode.Mass()
            M.setSphere(2500.0, 0.05)
            M.setBox(1000,250,250,1)
            M.mass = 0.5
            body.setMass(M)
            gobject.timeout_add(200,find_clock,scr,body,world)
            gtk.main()
        except Exception,e: 
            print(e) 
             
    if __name__ == "__main__": 
        main()
    


    Вот как это выглядит:
    www.youtube.com/v/l_Ts2BESraI&hl=en — снято фотиком для наглядности
    www.youtube.com/v/5oBpODqookY&hl=en_US&rel=0 — видео с экрана

    Ещё небольшой скриптик, который поворачивает экран если его сильно наклонить.(тот что есть на сайте ibm — не рабочий)
    #!/usr/bin/env python
    # coding: utf-8
    import os,sys
    from time import sleep
    
    ROTATE_ON = 100
    STALE_VALUE = 500 # первое значение в hdaps/position в нормальном положении
    
    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
    
    if __name__ == '__main__':
        while True:
            sleep(0.1)
            x = readx()
            if x<-ROTATE_ON: rotate('right')
            elif x>ROTATE_ON: rotate('left')
            else: rotate('normal')
    
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 21
    • 0
      переноси в Python
      • +2
        каармы нету
        • +2
          Бери единичку. Ещё кто-то один подкинет — и переноси спокойно!
      • +1
        круто!
        • +2
          А может лучше в Linux для всех?
          • 0
            Мне тоже кажется, что лучше в «Linux для всех», т.к. основная фишка тут не в Питоне, и его вполне можно заменить другим языком.
          • 0
            Оригинальное применение!
            • +7
              Не совсем по теме, но линки видео лучше все-таки заменить на оригинальные, а не те что на полный экран.
              • +1
                Прекрасная идея! Всё полезное, что делается своими руками, достойно уважения, а в данном случае это так весело)
                • 0
                  Здорово! Думается, для планшета с гироскопом было бы очень актуально…
                  • 0
                    тьфу, вернее не для планшета, а для «планшетного» лэптопа
                    • 0
                      угу ) одной из первых пользовательских применений показаний с датчика антишоковой защиты жесткого диска был скролинг google earth'a — forum.thinkpads.com/viewtopic.php?f=12&t=74841&view=previous www.youtube.com/watch?v=cqCP1_JCEz0

                      На любом планшетном thinkpad (вроде моего x41t) в свернутом состоянии — это очень интересные ощущения летать по гугловской карте, ощущаешь себя настоящим генералом из какого-нибудь comand&conquer )
                    • 0
                      Хм, у меня Lenovo SL500, Ubuntu 9.10 — дириктории /sys/devices/platform/hdapps нету. Хотя в штатной винде гироскоп работал.
                      • +1
                        www.thinkwiki.org/wiki/HDAPS
                        там всё описано. скорее всего, надо собрать модуль hdaps с помощью module-assistant
                        • 0
                          The ThinkPad SL series and IdeaPad series have firmware that is completely different from other ThinkPad models. Neither tp_smapi nor thinkpad-acpi support these models.
                      • 0
                        спасибо, необычный подход. и видеодемонстрация весьма убедительная. Какая модель thinkpad использовалась?
                      • +1
                        1.) Поправьте, пожалуйста, название статьи — в IBM thinkpad нету и не было никогда гироскопа — там акселерометр
                        2.) Показания датчика можно читать также и из под Windows, с установленным APS. — www.almaden.ibm.com/cs/people/marksmith/sdl.html

                        • –5
                          охуенно!
                          • 0
                            Спасибо, статья очень заинтересовала, нужно будет попробовать написать свое что-нибудь.
                            • 0
                              Спасибо, было интересно.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.