4.7.2 Моделирование поворотно-наклонной головки
Общая модель этого робота находится в файле box_robot_with_pan_tilt_head.xacro в каталоге rbx2_description/urdf/box_robot. Этот файл почти такой же, как и файл box_robot_with_kinect.xacro, который мы рассматривали ранее, хотя на этот раз мы включили файл box_pan_tilt_head.urdf.xacro вместо файла kinect.urdf.xacro. Сам файл box_pan_tilt_head.urdf.xacro включает в себя kinect.urdf.xacro, а также ссылки и совместные определения сервоприводов и скобок. Таким образом, мы можем прикрепить камеру к кронштейну для наклона головы. Файл box_pan_tilt_head.urdf.xacro также включает в себя другой файл под названием dynamixel_box_hardware.xacro. Этот файл определяет ряд свойств для хранения размеров сервоприводов и различных типов кронштейнов Dynamixel. Он также определяет коллекцию макросов, которые моделируют сервоприводы и скобки с помощью простых коробок. (Ниже мы будем использовать сетки для Pi Robot).
Мы не будем просматривать файлы серво URDF/Xacro построчно, как мы это делали с другими компонентами, так как это займет слишком много места. Основная идея заключается в том, что мы определяем связь для каждого сервопривода и кронштейна, а также стыки между ними. Однако, давайте, по крайней мере, посмотрим на пару блоков XML, которые иллюстрируют, как моделировать revolute jointints. Ссылаясь на файл box_pan_tilt_head.urdf.xacro, следующие строки определяют шарнир head_pan и соединение в терминах AX12 сервопривода и F3 кронштейна:
<dynamixel_AX12_fixed parent="head_base" name="head_pan_servo">
<origin xyz="-0.012 0 ${-AX12_WIDTH/2}" rpy="${M_PI/2} 0 ${-M_PI/2}"/>
</dynamixel_AX12_fixed>
<bioloid_F3_head_revolute parent="head_pan_servo" name="head_pan_bracket"
joint_name="head_pan" ulimit="2.53" llimit="-2.53" vlimit="1.571" color="$
{color}">
<origin xyz="0 ${AX12_WIDTH/2 + 0.005} 0.012" rpy="${-PI/2} ${PI/2} $
{PI}" />
<axis xyz="0 0 -1" />
</bioloid_F3_head_revolute>
Макрос под названием dynamixel_AX12_fixed находится в файле dynamixel_box_hardware.xacro и выглядит следующим образом:
<macro name="dynamixel_AX12_fixed" params="parent name *origin">
<joint name="${name}_joint" type="fixed">
<xacro:insert_block name="origin" />
<parent link="${parent}_link"/>
<child link="${name}_link" />
</joint>
<link name="${name}_link">
<inertial>
<mass value="0.00001" />
<origin xyz="0 0 0" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0"
iyy="1.0" iyz="0.0"
izz="1.0" /> </inertial>
<visual>
<origin xyz="0 0 0 " rpy="0 0 0" />
<geometry>
<box size="${AX12_HEIGHT} ${AX12_WIDTH} ${AX12_DEPTH}"/>
</geometry>
<material name="Black"/>
</visual>
<collision>
<origin xyz="0 0 -0.01241" rpy="0 0 0" />
<geometry>
<box size="${AX12_HEIGHT} ${AX12_WIDTH} ${AX12_DEPTH}"/>
</geometry>
</collision>
</link>
</macro>
Этот макрос достаточно прямолинейный, он определяет ссылку как box с теми же размерами сервопривода AX-12 и определяет фиксированный стык между собой и родителем, которым в данном случае является head_base_link.
Второй приведенный выше макрос, bioloid_F3_head_revolute, выполняет работу по фактическому панорамированию головы. Этот макрос также определен в файле dynamixel_box_head_hardware.xacro и выглядит следующим образом:
<macro name="bioloid_F3_head_revolute" params="parent name joint_name llimit
ulimit color *origin *axis">
<joint name="${joint_name}_joint" type="revolute">
<insert block name="origin"/>
<insert block name="axis"/>
<parent link="${parent}_link"/>
<limit lower="${llimit}" upper="${ulimit}" velocity="${vlimit}"
effort="1.0" />
<child link="${name}_link" />
</joint>
<link name="${name}_link">
<inertial>
<mass value="0.00001" />
<origin xyz="0 0 0" />
<inertia ixx="1.0" ixy="0.0"
ixz="0.0" iyy="1.0" iyz="0.0"
izz="1.0" /> </inertial>
<visual>
<origin xyz="0 0 0 " rpy="0 0 0" /> <geometry>
<box size="${F3_DEPTH} ${F3_WIDTH} ${F3_HEIGHT}"/> </geometry>
<material name="${color}"/>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${F3_DEPTH} ${F3_WIDTH} ${F3_HEIGHT}"/> </geometry>
</collision>
</link>
</macro>
Обратите внимание, что в этом случае тип соединения (выделенный жирным шрифтом выше) является реверсивным, а не фиксированным. Абсолютный шарнир принимает параметры нижней и верхней границы вращения, указанные в радиусах. Они задаются для конкретного шарнира путем передачи значений ${llimit} и ${ulimit} в коде выше. Сервопривод AX-12 имеет рабочий диапазон 300 градусов, то есть 150 градусов по обе стороны от центра. Значение 2.53 радиана, которое передается для нижней и верхней границ в приведенном выше определении bioloid_F3_head_revolute, составляет около 145 градусов - всего чуть меньше, чем полный диапазон, поэтому мы не заставляем сервопривод работать в собственных пределах.
Стык также принимает параметры скорости и усилия, которые являются ограничениями его динамики, которые должны соблюдаться реальным серворегулятором. Ограничение скорости в 1.571 радиан в секунду эквивалентно примерно 90 градусам в секунду, что является умеренно быстрым, особенно если сервопривод панорамирует камеру. Несмотря на то, что для отображения синтаксиса мы установили значение 1.0, ни пакет dynamixel_motor, ни arbotix не используют это значение.
Еще одним ключевым свойством revolute joint является этот тег <axis>, также выделенный жирным шрифтом выше. Компоненты xyz тега осей обычно равны 0 или 1 и определяют ось вращения шарнира. Эти параметры передаются в качестве аргумента блока, называемого осью, аналогично тому, как мы передаем исходные параметры. В случае шарнира головки мы передаем значения "0 0 -1", которые определяют вращение в отрицательном направлении z. В следующем разделе мы покажем, как определяются эти компоненты оси.
Last updated
Was this helpful?