Проект связан с 3D визуализатором RViz, одна из проблем которого заключается в том, что буфер для преобразования координат хранит информацию 10 последних минут, в чем не всегда есть необходимость и что в некоторых случаях приводит к значительному потреблению памяти. Цель - предоставить пользователю возможность самому выбирать нужный ему размер буфера.
В репозиторий помещены следующие измененные файлы:
- src/rviz/src/rviz/visualizer_app.cpp
- src/rviz/src/rviz/frame_manager.h
- src/rviz/src/rviz/frame_manager.cpp
- src/rviz/src/rviz/visualization_frame.h
- src/rviz/src/rviz/visualization_frame.cpp
- src/rviz/src/rviz/visualization_manager.h
- src/rviz/src/rviz/visualization_manager.cpp
В visualizer_app.cpp была добавлена обработка нового ключа: -t, за которым в командной строке должен следовать желаемый размер буфера в секундах. Значение переменной с данным параметром передается между фунциями и методами в вышеперечисленных файлах и доходит до конструктора FrameManager, где и происходит инициализация размера. Если ключ не указан, то значением по умолчанию будет 1 минута. Детальные изменения можно посмотреть в pull request: DmKazakov/rviz#1.
Для начала нужно заменить исходные файлы на файлы из репозитория и скомпилировать. Убедимся в изменении размера буфера, пронаблюдав за потреблением памяти. Для примера будем использовать turtleslim. Сначала установка:
sudo apt-get install ros-lunar-ros-tutorials ros-lunar-geometry-tutorials ros-lunar-rviz ros-lunar-rosbash ros-lunar-rqt-tf-tree
В первом терминале выполняем команду:
roslaunch turtle_tf turtle_tf_demo.launch
Во втором запускаем rviz с буфером в 1 минуту:
rosrun rviz rviz -t 60 -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
Посмотрим на потребление памяти в системном мониторе. Стабилизация происходит на 31.6 МБ.
Теперь запустим rviz c буфером в 10 минут:
rosrun rviz rviz -t 600 -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
Размер буфера был увеличен и потребление памяти оказывается 41.5 МБ.
Предыдущий пункт можно автоматизировать с помощью скрипта. Перед запуском необходимо так же утановить демо.
Запуск:
./test.sh first_buffer_size second_buffer_size
first_buffer, second_buffer - размеры буфферов в секундах
Скрипт запустит rviz с указанными размерами буфферов, даст им время заполниться и проверит, что если first_buffer_size и second_buffer_size отличаются в X раз, то потребления памяти буфферами соотвествующих процессов отличаются не более чем в X+eps раз не менее чем в X-eps раз.
К сожалению, при маленьких размерх буффера на потребление памяти в первую очередь влияют други факторы, так что тестирование корректно лишь при достаточно больших значениях (приблизительно более 2 минут).