Пора избавляться от мышки или Hand Pose Estimation на базе LiDAR за 30 минут

  • Tutorial
image

Всем привет! Пока киберпанк еще не настолько вошел в нашу жизнь, и нейроинтерфейсы далеки от идеала, первым этапом на пути к будущему манипуляторов могут стать LiDAR. Поэтому, чтобы не скучать на праздниках, я решил немного пофантазировать на тему средств управления компьютером и, предположительно, любым устройством, вплоть до экскаватора, космического корабля, дрона или кухонной плиты.

Предлагаю начать с просмотра коротенького видео, на котором видно, как можно за пару вечеров накидать простейшее управления курсором мышки на основе Object Detection, Hand Pose Estimation и камеры Intel Realsense L515. Конечно, оно далеко от идеала, но кажется, что осталось совсем немного подтянуть технологии и появятся принципиально новые способы управлять устройствами.


Справа на экране в реальном времени происходит отображение руки в RGB и Depth формате, то есть на карте глубины, получаемой с лидара, что даёт нам возможность получить координаты ключевых точек фаланги пальца — это красные и чёрные точки соотвественно. Как видно на видео, курсор двигается довольно плавно, и мне не потребовалось долго привыкать к такому управлению.

Зелёный луч, выходящий из указательного пальца — это проекция прямой, пересекающий плоскость монитора на ось XY. Спустя пару минут я уже мог направить палец-курсор в нужное мне место.

Основная идея — это двигать мышь, передвигая не всю руку, а только указательный палец, что позволит не отрывая рук от клавиатуры, бегать по меню, нажимать кнопки и в совокупности с горячими клавишами превратиться в настоящего клавиатурного ninja! А что будет если добавить жесты пролистывания или скролла? Думаю будет бомба! Но до этого момента нам еще придётся подождать пару-тройку лет)

Начнём собирать наш прототип манипулятора будущего


Что понадобится:

  1. Камера с LiDAR Intel Realsense L515.
  2. Умение программировать на python
  3. Совсем чуть-чуть вспомнить школьную математику
  4. Крепление для камеры на монитор ака штатив

Крепим камеру на шатив с алиэкспресс, он оказался очень удобный, лёгкий и дешевый )

image

image

Разбираемся, как и на чём делать прототип


Существует много подходов для реализации подобной задачи. Можно самому обучить детектор или сегментацию руки, вырезать полученное изображение правой руки и дальше применить к изображению вот этот замечательный репозиторий от Facebook research, получить отличный результат или сделать еще проще.

Использовать mediapipe репозиторий, прочитав эту ссылку можно понять, что это один из лучших вариант на сегоднешний день.

Во-первых, там все уже есть из коробки — установка и запуск потребует минут 30, с учётом всех пререквизитов.

Во-вторых, благодаря мощной команде разработчиков, они не только берут State Of Art в Hand Pose Estimation, но и дают лёгкое в понимание API.

В-третьих, сеть готова работать на CPU, так что порог входа минимален.

Наверное, вы спросите почему я не зашёл вот сюда и не воспользовался репозиториями победителей этого соревнования. На самом деле я довольно подробно изучил их решение, они вполне prod-ready, никаких стаков миллионов сеток и т.д. Но самая большая проблема, как мне кажется — это то, что они работают с изображением глубины. Так как это академики, они не гнушались все данные конвертировать через матлаб, кроме того, разрешение, в котором были отсняты глубины, мне показались маленьким. Это могло сильно сказаться на результате. Поэтому, кажется, что проще всего получить ключевые точки на RGB картинке и по XY координатам взять значение по оси Z в Depth Frame. Сейчас не стоит задача сильно что-то оптимизировать, так что сделаем так, как это быстрее с точки зрения разработки.

Вспоминаем школьную математику


Как я уже писал что бы получить координату точки, где должен оказаться курсор мышки, нам необходимо построить линию, проходящую через две ключевые точки фаланги пальца, и найти точку пересечения линии и плоскости монитора.

image

На картинке схематично изображена плоскость монитора и линия, ее пересекающая. Посмотреть на математику можно тут

По двум точкам получаем параметрическое представление прямой в пространстве.

image

Не буду сильно заострять внимание на школьной программе математики.

Установка бибилотеки для работы с камерой


Пожалуй, это самая сложная часть этой работы. Как оказалось, софт для камеры под Ubuntu очень сырой, librealsense просто завален всевозможными багами, глюками и танцами с бубном.

До сих пор мне не удалось победить странное поведение камеры, иногда она не подгружает параметры при запуске.

Камера работает только один раз после рестарта компьютера!!! Но есть решение: перед каждым запуском делать программно hard reset камеры, резет usb, и, может быть, всё будет хорошо. Кстати для Windows 10 там все нормально. Странно разработчики себе представляют роботов на базе винды =)

Чтобы под Ubuntu 20 у вас завелся realsense, сделайте так:

$ sudo apt-get install libusb-1.0-0-dev

Then rerun cmake and make install. Here is a complete recipe that worked for me:

$ sudo apt-get install libusb-1.0-0-dev

$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd librealsense/
$ mkdir build && cd build
$ cmake ../ -DFORCE_RSUSB_BACKEND=true -DBUILD_PYTHON_BINDINGS=true -DCMAKE_BUILD_TYPE=release -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=true
$ sudo make uninstall && make clean && make && sudo make install

Собрав из сорцов, оно будет более или менее стабильно. Месяц общения с техподдержкой выявил, что надо ставить Ubuntu 16 или страдать. Я выбрал сами понимаете что.

Продолжаем разбираться в тонкостях работы нейросети


Теперь посмотрим еще одно видео работы пальца-мышки. Обратите внимание, что указатель не может стоять на одном месте и как бы плавает вокруг предполагаемой точки. При этом я могу легко его направить к необходимому мне слову, а вот с буквой сложнее, приходится, аккуратно подводить курсор:


Это, как вы поняли, не тряска моих рук, на праздниках я выпил всего одну кружку New England DIPA =) Все дело в постоянных флуктуациях ключевых точек и Z-координаты на основе значений, получаемых от лидара.

Посмотим вблизи:


В нашей SOTA от mediapipe флуктуаций конечно меньше, но они тоже есть. Как выяснилось, они борются с этим путём прокидывания из прошлого кадра heatmap в текущий кадр и обучают сеть — это даёт больше стабильности, но не 100%.

Еще, как мне кажется, играет роль специфика разметки. Вряд ли можно сделать на таком количестве кадров одинаковую разметку, не говоря уже о том, что разрешение кадра везде разное и не очень большое. Также мы не видим мерцание света, которое, вероятнее всего, не постоянно из-за разного периода работы и величины экспозиции камеры. И еще сеть возвращает бутерброд из heatmap, равный количеству ключевых точек на экране, размер этого тензора BxNx96x96, где N — это кол-во ключевых точек, и, конечно же, после threshold и resize к оригинальному размеру кадра, мы получаем то что получаем (

Прмер визуализации heatmap:

image

Обзор кода


Весь код находится в этом репозитории и он очень короткий. Давайте разберём основной файл, а остальное вы посмотрите сами.

import cv2
import mediapipe as mp
import numpy as np
import pyautogui
import pyrealsense2.pyrealsense2 as rs
from google.protobuf.json_format import MessageToDict
from mediapipe.python.solutions.drawing_utils import _normalized_to_pixel_coordinates
from pynput import keyboard

from utils.common import get_filtered_values, draw_cam_out, get_right_index
from utils.hard_reset import hardware_reset
from utils.set_options import set_short_range

pyautogui.FAILSAFE = False

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

# инициализируем mediapipe для Hand Pose Estimation
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.9) 

def on_press(key):
    if key == keyboard.Key.ctrl:
        pyautogui.leftClick()
    if key == keyboard.Key.alt:
        pyautogui.rightClick()


def get_color_depth(pipeline, align, colorizer):
    frames = pipeline.wait_for_frames(timeout_ms=15000) # ождидаем фрейм от камеры
    aligned_frames = align.process(frames) 
    depth_frame = aligned_frames.get_depth_frame()
    color_frame = aligned_frames.get_color_frame()

    if not depth_frame or not color_frame:
        return None, None, None

    depth_image = np.asanyarray(depth_frame.get_data())
    depth_color_image = np.asanyarray(colorizer.colorize(depth_frame).get_data())
    color_image = np.asanyarray(color_frame.get_data())

    depth_color_image = cv2.cvtColor(cv2.flip(cv2.flip(depth_color_image, 1), 0), cv2.COLOR_BGR2RGB)
    color_image = cv2.cvtColor(cv2.flip(cv2.flip(color_image, 1), 0), cv2.COLOR_BGR2RGB)
    depth_image = np.flipud(np.fliplr(depth_image))

    depth_color_image = cv2.resize(depth_color_image, (1280 * 2, 720 * 2))
    color_image = cv2.resize(color_image, (1280 * 2, 720 * 2))
    depth_image = cv2.resize(depth_image, (1280 * 2, 720 * 2))

    return color_image, depth_color_image, depth_image


def get_right_hand_coords(color_image, depth_color_image):
    color_image.flags.writeable = False
    results = hands.process(color_image)

    color_image.flags.writeable = True
    color_image = cv2.cvtColor(color_image, cv2.COLOR_RGB2BGR)

    handedness_dict = []

    idx_to_coordinates = {}
    xy0, xy1 = None, None
    if results.multi_hand_landmarks:
        for idx, hand_handedness in enumerate(results.multi_handedness):
            handedness_dict.append(MessageToDict(hand_handedness))

        right_hand_index = get_right_index(handedness_dict)

        if right_hand_index != -1:
            for i, landmark_list in enumerate(results.multi_hand_landmarks):
                if i == right_hand_index:
                    image_rows, image_cols, _ = color_image.shape
                    for idx, landmark in enumerate(landmark_list.landmark):
                        landmark_px = _normalized_to_pixel_coordinates(landmark.x, landmark.y,
                                                                       image_cols, image_rows)
                        if landmark_px:
                            idx_to_coordinates[idx] = landmark_px

            for i, landmark_px in enumerate(idx_to_coordinates.values()):
                if i == 5:
                    xy0 = landmark_px
                if i == 7:
                    xy1 = landmark_px
                    break
    return color_image, depth_color_image, xy0, xy1, idx_to_coordinates


def start():
    pipeline = rs.pipeline() # инициализируем librealsense
    config = rs.config() 

    print("Start load conf")
    config.enable_stream(rs.stream.depth, 1024, 768, rs.format.z16, 30)
    config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30)

    profile = pipeline.start(config) 

    depth_sensor = profile.get_device().first_depth_sensor()
    set_short_range(depth_sensor) # загружаем параметры для работы на маленьком расстоянии
    colorizer = rs.colorizer()
    print("Conf loaded")
    align_to = rs.stream.color
    align = rs.align(align_to) # совокупляем карту глубины и цветную картинку

    try:
        while True:
            color_image, depth_color_image, depth_image = get_color_depth(pipeline, align, colorizer)
            if color_image is None and color_image is None and color_image is None:
                continue

            color_image, depth_color_image, xy0, xy1, idx_to_coordinates = get_right_hand_coords(color_image,
                                                                                                 depth_color_image)
            if xy0 is not None or xy1 is not None:
                z_val_f, z_val_s, m_xy, c_xy, xy0_f, xy1_f, x, y, z = get_filtered_values(depth_image, xy0, xy1)
                pyautogui.moveTo(int(x), int(3500 - z))  # 3500 хард код специфичый для моего монитора
                if draw_cam_out(color_image, depth_color_image, xy0_f, xy1_f, c_xy, m_xy):
                    break
    finally:
        hands.close()
        pipeline.stop()


hardware_reset() # делаем ребут камеры и ожидаем её появления
listener = keyboard.Listener(on_press=on_press) # устанавливаем слушатель нажатия кнопок клавиатуры
listener.start()
start() # запуск программы

Я не стал использовать классы или потоки, потому что для такого простого случая достаточно всё выполнять в основном потоке в бесконечном цикле while.

В самом начале происходит инициализация mediapipe, камеры, загрузка настроек камеры для работы short range и вспомогательных переменных. Следом идёт магия под названием «alight depth to color» — эта функция ставит в соответствие каждой точки из RGB картинки, точку на Depth Frame, то есть даёт нам возможность получать по координатам XY, значение Z.

Понято, что необходимо произвести калибровку на вашем мониторе. Я специально не стал вытаскивать отдельно эти параметры, чтобы читатель, решивший запустить код, сделал это сам, заодно резберётся в коде =)

Далее мы берём из всего предсказания только точки под номером 5 и 7 правой руки.

image

Осталось дело за малым — полученные координаты фильтруем с помощью скользящего среднего. Можно было конечно применить более серьезные алгоритмы фильтрации, но взглянув на их визуализацию и подёргав разные рычажки, стало понятно, что для демо вполне хватит и скользящего среднего с глубиной 5 фреймов, хочу заметить, что для XY вполне хватало и 2-3-х, но вот с Z дела обстоят хуже.

deque_l = 5

x0_d = collections.deque(deque_l * [0.], deque_l)
y0_d = collections.deque(deque_l * [0.], deque_l)

x1_d = collections.deque(deque_l * [0.], deque_l)
y1_d = collections.deque(deque_l * [0.], deque_l)

z_val_f_d = collections.deque(deque_l * [0.], deque_l)
z_val_s_d = collections.deque(deque_l * [0.], deque_l)

m_xy_d = collections.deque(deque_l * [0.], deque_l)
c_xy_d = collections.deque(deque_l * [0.], deque_l)

x_d = collections.deque(deque_l * [0.], deque_l)
y_d = collections.deque(deque_l * [0.], deque_l)
z_d = collections.deque(deque_l * [0.], deque_l)


def get_filtered_values(depth_image, xy0, xy1):
    global x0_d, y0_d, x1_d, y1_d, m_xy_d, c_xy_d, z_val_f_d, z_val_s_d, x_d, y_d, z_d

    x0_d.append(float(xy0[1]))
    x0_f = round(mean(x0_d))

    y0_d.append(float(xy0[0]))
    y0_f = round(mean(y0_d))

    x1_d.append(float(xy1[1]))
    x1_f = round(mean(x1_d))

    y1_d.append(float(xy1[0]))
    y1_f = round(mean(y1_d))

    z_val_f = get_area_mean_z_val(depth_image, x0_f, y0_f)
    z_val_f_d.append(float(z_val_f))
    z_val_f = mean(z_val_f_d)

    z_val_s = get_area_mean_z_val(depth_image, x1_f, y1_f)
    z_val_s_d.append(float(z_val_s))
    z_val_s = mean(z_val_s_d)

    points = [(y0_f, x0_f), (y1_f, x1_f)]
    x_coords, y_coords = zip(*points)
    A = np.vstack([x_coords, np.ones(len(x_coords))]).T
    m, c = lstsq(A, y_coords)[0]
    m_xy_d.append(float(m))
    m_xy = mean(m_xy_d)
    c_xy_d.append(float(c))
    c_xy = mean(c_xy_d)

    a0, a1, a2, a3 = equation_plane()
    x, y, z = line_plane_intersection(y0_f, x0_f, z_val_s, y1_f, x1_f, z_val_f, a0, a1, a2, a3)

    x_d.append(float(x))
    x = round(mean(x_d))
    y_d.append(float(y))
    y = round(mean(y_d))
    z_d.append(float(z))
    z = round(mean(z_d))

    return z_val_f, z_val_s, m_xy, c_xy, (y0_f, x0_f), (y1_f, x1_f), x, y, z

Создаем deque c длинной 5 фреймов и усредняем все подряд =) Дополнительно рассчитываем y = mx+c, Ax+By+Cz+d=0, уравнение для прямой — луч на RGB картинке и уравнение плоскости монитора, оно у нас получается y=0.

Итоги


Ну вот и всё, мы запилили простейший манипулятор, который даже при своем драматически простом исполнении уже сейчас может быть, хоть и с трудом, но использован в реальной жизни!

Благодарности


Спасибо сообществу ods.ai, без него невозможно развиваться!
Open Data Science
Крупнейшее русскоязычное Data Science сообщество
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 69

    +9

    ИМХО без физического устройства будет примерно так же неудобно, как со всеми этими вашими проецируемыми клавиатурами и аэромышами.

      0
      Для случая перетащить что то на несколько пикселов, или кликнуть дважды в одну точку — будет неудобно без физического устройства типа мыши, которая трением убирает дрожание руки. Но если такое со временем будет внедрятся, то сам софт будет подстраиваться под новый способ управления, зоны клика станут большими, дрожание будет отфильтровываться программно.
      Сейчас на Oculus Quest 2 вполне работает управление пальцами без контроллеров, не очень удобно, не во всех приложениях, но работает. Чтобы ютубом управлять достаточно. Там используются обычные камеры. Так что со временем это сможет развиться и перейти и в другие сферы.
        +1

        Я как раз зашел, чтобы написать коммент про управление руками в Oculus Quest (в первой версии тоже отлично работает). Насколько я помню release notes там используется нейросеть для разпознавания пальцев, и работает все через камеру, без использования лидара.


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


        А еще вас может купить Эппл, с их любовью к таким фишкам и учитывая встроенный в новый процессор нейросетевой ускоритель.

          0
          Спасибо, вам) Кажется, что лидары дешевеют и становятся точнее. ДУмаю что эта тенденция сохранится, вспомните автомобиль начала прошлого века или танк первой мировой войны? Или ваш первый смартфон етен или аймейт?))
            0
            А почему собственно нужно указывать именно пальцем руки?
            Почему нельзя вращать/качать головой? Тем более, что взгляд (и нос) устремляется туда, куда нужно сделать перемещение?
            Например, нажимаешь «шифт» активируется функция камеры и смотришь куда надо, глаза и нос указывают в точку на экране. Бросаешь клавишу «шифт» — можно печатать текст.
              0
              Можно: gaming.tobii.com
                0
                Жест указание указательным пальцем, остальный согнуты. Двумя пальцами — свайп. Тремя — скрыть. В остальных случаях не реагировать, а с глазами и носом жестов не получится.
                0
                взять две камеры и отказаться от использования дорогих лидаров?
                  0
                  Незнаю, не пробовал)
                    0
                    Я так понял, у вас лидар используется только для того, чтобы Z координату измерить в точках XY, которые получаются обработкой картинки с камеры. И причём каждый раз идёт сначала определение XY, а потом измерение Z. Потенциал лидара в данном случае не используется от слова совсем. Тут или давать приоритет измерениям лидара, фиксируя XY, чтоб они не дрожали, либо давать всю карту с лидара сети, которая распознаёт, где какая часть руки. Иначе же просто ещё одной камерой вместо лидара можно будет получить даже большую точность, чем сейчас есть.
                      0
                      Спорить не буду, но для этого ван нужно будет набрать хороший датасет. Как я уже писал в статье, текущие датасеты довольно слабые в плане разрешения.
                      0
                      А если на руку/палец прикрутить пассивный элемент, который проще отслеживать, и в этом случае не нужно анализировать положение фаланги. Что-то типа сложного зеркального элемента в виде линии, положение которого камера/лидар, лазер сразу четко определяет в пространстве без сложных распознований?
                      Пассивный — чтобы не нужны были аккумуляторы и следовательно вес. Как пластырь/татуировка.
                    0

                    А было бы точнее проще в реализации и удобнее перчатки с маячками и камера? Руку детектировать сложнее, руки разные бывают

                  0
                  мыши, которая трением убирает дрожание руки.


                  Не столько трением, сколько массой.

                  Если вы видели профессиональные игровые мышки, то обратили внимание что к ним идёт набор грузов. Масса мыши подбирается в зависимости от силы руки.
                    0
                    Тем более, что от трения, как раз, стараются всеми силами избавиться. Коврики там особые, тефлоновые ножки.
                      0
                      мыши, которая трением убирает дрожание руки.

                      Не столько трением, сколько массой.


                      Трение в том числе и от массы же зависит.
                    0

                    Попробовать бы сперва, вдруг наоборот станет лучшим контроллером всех времён? В теории-то все новое должно проваливаться, однако некоторые новинки прочно поселяются в повседневной жизни.

                      0

                      Согласен. Плюс задержка будет, какая бы маленькая она не была. Да и как-то резко переходить от огромной игровой мыши к воздуху, не совсем удобно :)

                        0
                        Со временем лазер станет кучнее, ИИ по сильнее, ну и т.д.
                          0

                          Согласен. Я если честно не представляю, как это 12 кнопок мышки заменить на воздух. Я рассматриваю это в направлении игр, таких, как ВОВ, Айон, бс онлайн...

                        0
                        А не лучше ли допилить управление с LEAP )? Его хотя бы купить реально.
                          +4
                          Проблема всех жестовых систем в том, что нет обратной связи. Нажимая кнопку на мыше или клавиатуре, я поинимаю, что она нажата, а тут — нет.
                            0
                            И как, сильно ощущается нажатие на magic mouse? Может просто дело в привычке и в том что вы никогда не пробовали это делать хотя бы пару недель?
                              +5
                              Я одно время был поклонником сенсорных и бесконтактных интерфейсов и достаточно перепробовал в своё время.
                              И да, magic mouse во-первых кликает при нажатии, во-вторых для действия касанием важна только левая или правая стороны мышки. Вы никогда не будете выцеливать на ней область с палец размером. И это только подтверждает моё утверждение, потому что иначе бы на mm было бы куча сложных жестов, а не выделение только 1 зоны, которая к тому же отключена изначально.
                              И да, обратную связь всё равно пытаются в подобные контроллеры запихнуть, звуком или вибрацией. Потому что без неё — быстрая и эффективная работа в принципе невозможна.
                                +1

                                А если, чисто теоретически, использовать только жесты, где пальцы должны касаться друг друга? Обучаем детектор, чтобы он реагировал только на соответствующие комбинации пальцев, а физическая обратная связь получается "сама собой".


                                Самый примитивный вариант: жест "ок" используется как аналог зажатой левой кнопки. Сцепили пальцы и двигаем руку — то же самое, как если бы тащили что-то курсором. Расцепили — перестали тащить.


                                Не знаю, может, так и используют такие жесты? Или нет?

                                  0
                                  В общем задача распознования жестов решена не плохо. Жесты буду делать чуть позже, как буду свободен.
                                    0
                                    Не у всех людей пальцы согнутся в нужный жест. Хотите для своей фирмы проблемы из-за дискриминации пользователей по возрасту? Или по здоровью?
                                    0

                                    Имелось ввиду скорее всего касание, а не нажатие (можно настроить касание как клик софтово) — вся поверхность мыши (включая место под ладонью) может распознавать 5 тачей одновременно. Т.е по ней можно тапать 2-3 пальцами, драгать в разные стороны разным количеством пальцев — это все распознается как разные жесты. Все то же самое относится и к внешнему тачпаду. Софт для настройки, например, этот http://magicprefs.com (скорее всего не работает на последней macos).

                                    +2
                                    Сидел на magic mouse несколько месяцев. Не смог. Отсутствие тактильной связи при скролле — это вообще беда. Особенно в CAD-системах.

                                    А по теме статьи: для жестовых устройств нужно гораздо больше жестов, чем кажется на первый взгляд. Жест «подвинуть курсор на полэкрана» должен отличаться от «подвинуть на пару пикселей», например. Дочно так же «прокрутить страницу» и «скролл на одну строку» и т.п. Выделение текста мышью или последовательное выделение графических объектов, расположенных в хаотическом порядке — тоже задача для жестовых устройств нетривиальная.
                                      0
                                      Скорее должно быть «не больше жестов», а должны быть жесты органично встраиваемые в программы. Например, для CAD системы «ухватить деталь», «перетащить деталь», «выполнить сечение». И тут уже распознаванием пальца-направления не обойтись — потребуется распознавание положения и движения всей кисти. Возможно нужен будет новый класс для таких жестовых устройств, чтобы система и софт могли работать с различными устройствами такого класса, и не приходилось адаптировать программы под каждое такое устройство.
                                  +1
                                  Идея интересная, но только не вместо, а как дополнение к мыши. Махать постоянно пальцем или рукой по большому экрану будет достаточно тяжело. Плюс мышки в том, что там можно делать заметно меньшее движение из-за большей чувствительности. Плюс, как уже заметили выше, мышь немного сглаживает движения.
                                  К тому же, глядя на изображения вижу потенциальную проблему с безопасностью, т.к. можно считывать набираемые на клавиатуре данные. Зато, можно сразу же делать и замену клавиатуре. Будет 2 в 1. И в качестве переносного девайса — вполне себе хороший вариант.
                                    0
                                    Время покажет, очень сложно перестроить свой мозг на что-то новое. Он цепляется за привычное, хочет жить в комфорте.
                                      0
                                      Вопрос не только в мозге, как мне кажется. Может тупо рука/палец уставать, если ей долго крутить по экрану. Но как дополнение, например для тех же жестов о которых писали выше — вполне.
                                        0
                                        От мышки тож устаёт, я переехал на вертикальную. Стало лучше. Мне ка если юзать всякие жести смахивания, то палец не будет сильно загружен и будет ок. Но все это конечно дело привычки.
                                          0
                                          Простите, а «вертикальная» — это как?
                                          Лично мне классический вариант точно подходит, поскольку бо´льшую часть времени рука просто лежит на мышке и не напрягается. Да и мышку я привык двигать не кистью, а пальцами. При этом варианте лично у меня рука почти не напрягается.
                                          Вот для разных жестов — да, вполне вариант.
                                            0
                                            Logitech MX Vertical, я привыкал дня 3-4. Сейчас очень доволен.
                                              0

                                              Есть аналог от Delux, тоже хорошая штука, пользовался пару лет, пока не перешёл на трекбол.

                                    0
                                    Сложно от мышки отвыкнуть
                                      –1

                                      Сложновато немного написано. Как человек не особо шарящий — я не сразу все понял.
                                      Все равно огромное спасибо за информацию

                                        0
                                        Спасибо за комментарий, я начинающий писатель)
                                        0

                                        DELETED

                                          0
                                          Задумка интересная, но не могу не согласиться с комментарием выше, что рука будет уставать (особенно с непривычки). Надеюсь, в будущем учтут такие минусы и мы вообще сможем управлять компьютером силой мысли :D
                                            0
                                            Не думай о белой обезьяне. Проследите как нибудь в подробностях, что там у вас в мозгах происходит в процессе. Сможете гарантировать отсутствие паразитных мыслей?
                                              +1

                                              Паразитные мысли часто заставляют ваши конечности совершать непроизвольные движения? Мне кажется управление компьютером "силой мысли" надо сравнивать со слепым набором на клавиатуре.

                                                –1
                                                Так как вы собираетесь фильтровать мысли? Или вы из тех, кто с 8 до 17 с перерывом думает исключительно о работе и только о поставленной задаче?
                                                  +1

                                                  Точно так же, как вы фильтруете свои, чтобы набирать правильную последовательность символов на клавиатуре.

                                              0
                                              В качестве замены мышки для рабочего компа — как-то сомнительно. Для телевизоров — да, возможно и удобно (хотя есть приложения для телефонов и 3д мыши всякие..).
                                              +1
                                              Круто! Я искренне тащусь от таких проектов. Единственное «но»: реализация очень интересная, но, ИМХО, чисто как пет-проект, так как слишком уж дорогая, требовательная к ресурсам и громоздкая замена мышке получается, а сейчас рынок требует мобильности.
                                              Я сам таким занимался лет 5 назад, правда без лидара и с высокоскоростными камерами от PS2. В итоге пришел к тому, что носимый акселерометр (в виде перстня) гораздо практичнее.
                                                0
                                                Спасибо, согласен про пет проджект! Но если представить, что в монитор ноутбука вставят лидар. Эпл уже добавил с внешней стороны. Тепреь с внутренней, сам илдар маленький их можно сделать несколько, точность будет большая. Убираем сенсорный экран и трекпад, компинсируем стоимость.
                                                  +2
                                                  Единственное «но»: реализация очень интересная, но, ИМХО, чисто как пет-проект, так как слишком уж дорогая, требовательная к ресурсам и громоздкая замена мышке получается, а сейчас рынок требует мобильности.


                                                  Мышка будет ничуть не дешевле, если вы будете её в единственном экземпляре делать.
                                                  Но производство сотнями миллионов экземпляров — кардинально меняет стоимость мыши.

                                                  Сравнивать серийное производство и штучное экспериментальное производство — смысла нет никакого.
                                                  Разница в цене и в 1000 раз может быть.
                                                  0
                                                  Главная беда современны depth камер — шумный, дико шумный сенсор… убивает на нет все что можно было бы крутого сделать на его базе.

                                                  сначала нужно избавиться от шума

                                                  p.s. если камера не шумит, можно воспользоваться совокупными данными с depth камеры и обычной — приняв за точку отсчета координат данные именно с малошумящей камеры, а лидар использовать как инструмент распознавания объектов.

                                                  p.p.s. нарисуйте на пальцах простой для распознавания контрастный узор, и пользуйтесь двумя обычными камерами, смотрящих на руки.
                                                    0
                                                    нарисуйте на пальцах


                                                    Пора вспомнить что такое «напёрсток».
                                                      0
                                                      Махать рукой в воздухе и наводить палец в нужную точку гораздо тяжелее (трудозатратнее, задействовано много групп мышц), чем передвигать руку на пять сантиметров в стороны, когда она лежит на столе, а положение пальцев не имеет существенной роли. В принципе можно убрать физический объект — мышь, и двигать по столу просто пустую кисть руки, отслеживая её перемещения. Вероятно точность пострадает не сильно, но возникнет проблема момента отпускания мыши и дрожания курсора в момент клика.
                                                        +1
                                                        Я тоже думал про такой вариант. Аэромышки и всякие указки и вот данный вариант имеют на мой взгляд две критические проблемы. Надо махать рукой/пальцем это тяжело. А второе, это когда ты отпускаешь мышку, курсор остается на том месте, где ты оставил мышку. В данном варианте надо по новой прицеливаться.

                                                        А вот если бы просто отслеживаться кисть руки. Допустим указательный палец на коврике. Провел по коврику, передвинул курсор в нужном направлении, оторвал указательный от поверхности, прекратился трекинг. Стукнул указательным пальцем по коврику — клик. Стукнул кулаком по столу, компьютер отключился )) Как то так. В принципе ту же камеру с лидаром можно использовать для отслеживания руки и высоту указательного пальца относительно других. Получается мышка с как минимум четырьмя кнопками или пятью если отслеживать и большой палец. Плюс возможные комбинации и жесты.

                                                        Мне кажется такой вариант будет даже удобнее мышки. Я просто раньше думал попробовать сделать так на основе четырех микрофонов приставленных к поверхности стола, а на указательный палец надевать что то вроде наперстка. Но не был уверен хватит ли чувствительности, что бы определить положение пальца, да и с наперстком на пальце не так уж и удобно ))
                                                          0
                                                          Все таки основная проблема массового использования такого решения, это «лень». Даже просто держа руку на коврике, напрягаешь больше мышц, чем положив ее на мышку. В принципе, одна из причин не популярности VR шлемов в том, что ни кто не хочет ходить по комнате, все хотят играть на диванчике. Но идея полностью уити от физических устройств со стороны пользователя — интересная. Правда, тут можно вспомнить историю кинекта и то как он слился.
                                                            0
                                                            Допустим указательный палец на коврике. Провел по коврику, передвинул курсор в нужном направлении, оторвал указательный от поверхности, прекратился трекинг. Стукнул указательным пальцем по коврику — клик.

                                                            Мне кажется, или вы изобрели тачпад?
                                                              0

                                                              Ну да, похоже, только с тачпадом надо руку поднимать и возить пальцем по нему. А в таком варианте рука лежит на поверхности стола и отслеживается указательный палец если он на столе. Приподнял палец и трекинг прикратился. Думаю не так напряжно для руки будет и не надо мышь держать.


                                                              В последнее время руки стали уставать, пробовал вертикальную мышку, но я ее сбиваю нафиг когда от клавиатуры к ней руку веду. Бросил. А а вот с тренингом руки мне кажется для здоровья лучше.

                                                                0
                                                                Ну да, похоже, только с тачпадом надо руку поднимать и возить пальцем по нему.

                                                                А зачем отрывать? У меня нет под рукой условного макбука, но сомневаюсь, что даже на самом крупном таче придётся отрывать запястье от стола. Если речь про его расположение под клавиатурой, то существуют внешние.
                                                                Или речь про размеры площадки, сравнимые с игровыми поверхностями для мышек (40х50см и больше)? А зачем? Качественный тачпад 10х15 для бытовых задач достаточен. Надо больше — Wacom в помощь. Там и А3 размер есть.
                                                                  0

                                                                  Запястье да, лежит на столе, но пальцы надо держать на весу. Получается кисть руки загнута вверх, что неестественно и первое время даже мышцы предплечья напряжены. Потом привыкаешь конечно. Посмотрите обзоры трекпада на Ютубе, там видно как люди держат руку.


                                                                  В любом случае конечно это очень дорогой огород в сравнению с трэкпадом или тачпадом. Камера стоит 350 баксов, но может придумают со временем что поудобнее.

                                                          0
                                                          Не хочу обесценить труд автора, но пробовали ли вы когда-то вешать занавески/шторы на каринизе? Уже через пару минут «рук на весу» они становятся ватными, и их хочется опустить. Точно также и с этими интерфейсами — это круто и зрелищно, но не практично. Даже XBox/Kinect страдает этой осбенностью.
                                                          В качесте proof-of-concept очень круто. Можно потом применять в более подходящих целях.
                                                            0
                                                            Рука лежит на клаве, крутим пальцем.
                                                              0
                                                              Ну на видео видно что палец выпрямлен, а на загнут как бывает когда работает с тачпадом. Я попробовал манипулировать пальцем таким образом, и у меня сразу начало ныть в запястье. По ощущениям примерно также как будто-то бы рука на весу.
                                                              Это у меня так только ?!
                                                                0
                                                                Мне было достаточно удобно. Время покажет, будет это работать или нет.
                                                            0

                                                            IMHO, лучший манипулятор графической информации это трекбол. Всё, что требует более или менее длительного нахождения даже пальца на весу и не фильтрует дрожание руки, мягко говоря не очень эргономично.

                                                              0
                                                              Лучший для чего? Играть и близко не лучший, пишу как человек использующий два разных трекбола и дома и на работе несколько лет. У верен что для работы во многих приложениях так же он явно будет не удобен как и в некоторых играх.
                                                              Для повседневной работы за компьютером да, намного удобней всего и очень устраивает, причем не важно какой он.
                                                              +1

                                                              Уже восемь лет пользуюсь трекпадами apple, второй версии вообще хороший. По началу указательный палец был сильно напряжен и быстро уставал, но через короткий промежуток времени так привык, что вообще рука/палец не устает ни капли, а пользоваться одно удовольствие. Разницы в точности лично у меня нет, что там, что там отлично. Единственное для чего не подходит — игра в шутеры.

                                                                0
                                                                Единственное для чего не подходит — игра в шутеры.

                                                                Просто у вас не было достаточной мотивации ;)

                                                            Only users with full accounts can post comments. Log in, please.