Рандомизация фраз на Roborock S50/S55

Roborock S5 – серия недорогих роботов-пылесосов с лидаром, входящая в категорию товаров для “умного дома” от Xiaomi. Дистанционное управление со смартфона и root-доступ ко встроенной операционке на базе Linux прилагаются.

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

Попробуем сделать так, чтобы вместо этого робот отвечал случайной репликой из соответствующей категории фраз. Для этих целей будет использоваться самописная пользовательская файловая система fuse, сделанная на базе bbfs. Смысл состоит в том, чтобы при обращении к какому-либо файлу со звуком – например, sound.wav – модифицированная ФС проверяла наличие рядом файлов с именами sound_1.wav, sound_2.wav и т.д. и случайно выбирала один из них. Все прочие же действия bbfs просто пробрасывает в нижележащую файловую систему без изменений.

Инструкция далее предполагает минимальное умение пользоваться linux-терминалом через putty и (win)scp, а так же уже рутированное ПО на роботе.

  1. Сначала установим нужную локализацию, на базе которой будет строиться наша – например, при помощи WIN-MIROBO. В результате на роботе по пути /mnt/data/rockrobo/sounds появится каталог с набором звуковых wav-файлов.
  2. Делаем копию этого каталога в соседний, например: /mnt/data/rockrobo/sounds_multi, не забываем сделать chown на ruby (или другого пользователя, не root) как каталога sounds, так и sounds_multi (для удобной заливки новых wav-файлов через winscp).
  3. Установим поддержку файловых систем fuse, используя стандартные пакеты к Ubuntu 14.04 для armhf: понадобятся libfuse2_2.9.2-4ubuntu4.14.04.1_armhf.deb и fuse_2.9.2-4ubuntu4.14.04.1_armhf.deb с launchpad.net. Для установки забрасываем файлы в робота и используем dpkg -i имя_файла.
  4. Забрасываем в робота собранный бинарник файловой системы bbfs и кладем его, к примеру, в /usr/local/bin, делаем его запускаемым (chmod +x)
  5. В файле /etc/fuse.conf раскомментируем опцию user_allow_other, т.к. в противном случае из-под root-а не будут видны файлы в смонтированных пользователем каталогах, делаем этот файл читаемым для всех (chmod +r).

Теперь мы готовы запустить bbfs. Для этого заходим из-под ruby (или другого пользователя, главное – не root) и набираем следующую команду: bbfs -o nonempty,allow_root /mnt/data/rockrobo/sounds_multi /mnt/data/rockrobo/sounds. После этого в каталоге sounds будут показаны все файлы из sounds_multi, но при выборе основного файла sounds/sound.wav в действительности будет запрошен случайным образом либо sounds_multi/sound_N.wav, либо исходный sounds_multi/sound.wav.

Отметим, что N ∈ [1;20] – и только в порядке возрастания (т.о. если файла sound_1.wav нет, то sound_2.wav даже проверяться не будет).

Для размонтирования обратно используем команду fusermount -u /mnt/data/rockrobo/sounds, и в /mnt/data/rockrobo/sounds возвращается его исходное содержимое.

Если вручную все завелось корректно, то для автоматического старта при запуске робота можно добавить в /etc/rc.local следующую строку: su ruby -c "bbfs -o nonempty,allow_root /mnt/data/rockrobo/sounds_multi /mnt/data/rockrobo/sounds". Не забываем указывать правильного пользователя после su и не теряем кавычки.

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

This entry was posted in Софт and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>