Последняя часть, в которой, наконец, запустим управление импортированным роботом в RViz с помощью PS3 контроллера. Подготовительные шаги для этого можно посмотреть в предыдущих частях: подключение PS3 контроллера, ч.1, ч.2.
Пару слов о специфике работы с роботом через RViz и топик /joint_states - координаты звеньев пересчитываются по каждому новому сообщению. Это означает, что если робот должен оставаться на месте, то необходимо постоянно отправлять в топик его текущие координаты. А для того, чтобы он двигался - координаты в сообщении должны, соответственно, изменяться.
При этом, сообщения от контроллера в топике /joy обновляются, только если происходит какое-либо действие: нажимается / отпускается кнопка, изменяется положение осей. Если управлять роботом с помощью осей, то это приводит к тому, что смещение оси в крайнее положение (координата 1 или -1) не приводит к реакции робота: он двигается только пока ось идет до своего края, когда она его достигает, сообщения в топике /joy перестают приходить.
Чтобы это исправить необходимо сделать узел, постоянно передающий текущие координаты от контроллера: если они обновляются, то он должен их просто прокидывать, если они не обновляются - то повторять последние. Для этого потребуется новый вид сообщений, в которым эти координаты будут передаваться.
Для данного примера я использую пакет urdf_test. Файл joy_data.msg с описанием сообщения будет находится в папке urdf_test/msg:
Header header
float32 j1
float32 j2
float32 j3
В нем передаются только три координаты осей, которые будут использоваться для управления поворотом звеньев.
Как обеспечить передачу сообщений описывать не буду - в ROS есть подробное руководство, а в конце поста будет ссылка на исходный код пакета urdf_test.
Если все сделано правильно, то команда
$ rosmsg show joy_data
должна выдать информацию о сообщении:
[urdf_test/joy_data]:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32 j1
float32 j2
float32 j3
Следующий шаг - узел, принимающий данные от контроллера и отправляющий сообщения joy_data - Joy_talker.py, он будет находится в папке urdf_test/python:
Узел принимает в цикле сообщения от контроллера в топике /joy для осей 1, 3, 4 и через глобальные переменные joint_1 ... 3 передает их в топик /joy_axes_coords сообщениями joy_data.
Чтобы узел заработал, его необходимо прописать в файле CMakeLists.txt:
и выполнить команду
$ catkin_make
в рабочем пространстве, в котором находится пакет.
Теперь необходимо перенастроить узел PS3_test.py, чтобы он принимал сообщения joy_data:
Последнее, что остается сделать, внести изменения в файл запуска ps3_test.launch:
Теперь можно его запускать и наслаждаться результатом:
$ roslaunch urdf_test ps3_test.launch
Rqt_graph показывает цепочку узлов от команд контроллера /joy до Rviz:
Полный пакет urdf_test можно скачать с моего GitHub.
Let`s go design!
Комментарии
Отправить комментарий