4.5.2 Моделирование камеры
Файл Kinect URDF/Xacro называется kinect_box.urdf.xacro в каталоге rbx2_description/urdf/box_robot и первая часть файла выглядит так:
<property name="kinect_body_x" value="0.07271" />
<property name="kinect_body_y" value="0.27794" />
<property name="kinect_body_z" value="0.033" />
<property name="kinect_base_x" value="0.072" />
<property name="kinect_base_y" value="0.085" />
<property name="kinect_base_z" value="0.021" />
<property name="kinect_base_post_height" value="0.016" />
<property name="kinect_base_post_radius" value="0.005" />
<property name="PI" value="3.1415" />
<!-- Define a box-shaped camera link for the Kinect -->
<macro name="camera" params="parent name color *origin">
<joint name="${parent}_${name}_joint" type="fixed">
<xacro:insert_block name="origin" />
<parent link="${parent}_link"/>
<child link="${name}_base_link"/>
</joint>
<link name="${name}_base_link">
<visual>
<origin xyz="0 0.0 0.0" rpy="0 0 0" />
<geometry>
<box size="${kinect_base_x} ${kinect_base_y} ${kinect_base_z}"/>
</geometry>
<material name="${color}" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${kinect_base_x} ${kinect_base_y} ${kinect_base_z}"/>
</geometry>
</collision>
</link>
Сначала мы храним размеры Kinect в нескольких свойствах, разделяющих три части: основание, опорный столб и корпус камеры.
Далее мы определяем коробчатое соединение для базы камеры и соединение, соединяющее ее с родительской ссылкой (это будет туловище, как мы увидим в следующем разделе). Обратите внимание, как мы используем переменную ${name} вместо фиксированной строки <camera> для префикса имени ссылки и сустава. Это позволяет нам при желании присоединить более одной камеры и дать каждой камере свое имя, которое затем будет распространяться через ее набор ссылок и суставов.
<joint name="camera_base_post_joint" type="fixed">
<origin xyz="0 0 ${(kinect_base_z + kinect_base_post_height)/2}" rpy="0
0 0" />
<parent link="${name}_base_link" />
<child link="${name}_base_post_link" />
</joint>
<link name="${name}_base_post_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="${kinect_base_post_radius}" length="$
{kinect_base_post_height}"/>
</geometry>
<material name="${color}" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="${kinect_base_post_radius}" length="$
{kinect_base_post_height}"/>
</geometry>
</collision>
</link>
<joint name="${name}_base_joint" type="fixed">
<origin xyz="0 0 ${(kinect_base_post_height + kinect_body_z)/2}" rpy="0
0 0" />
<parent link="${name}_base_post_link" />
<child link="${name}_link" />
</joint>
<link name="${name}_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${kinect_body_x} ${kinect_body_y} ${kinect_body_z}"/>
</geometry>
<material name="${color}" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="${kinect_body_x} ${kinect_body_y} ${kinect_body_z}"/>
</geometry>
</collision>
</link>
Здесь процесс строительства продолжается, так как мы прикрепляем цилиндрический столб к основанию камеры внизу и корпус камеры в верхней части.
Остальная часть файла URDF/Xacro определяет связь между различными оптическими и глубинными кадрами камеры. Смещения были скопированы из "официального" файла URDF Kinect, найденного в пакете Turtlebot_description. Например, соотношение между корпусом камеры (camera_link frame) и кадром глубины задается блоком:
<joint name="${name}_depth_joint" type="fixed">
<origin xyz="0 0.0125 0" rpy="0 0 0" />
<parent link="${name}_link" />
<child link="${name}_depth_frame" />
</joint>
Здесь мы видим, что рамка глубины смещена сбоку от центра корпуса камеры на 1.25 см. Это отношение, как и другие, указанные в файле камеры, позволяют издателю robot_state_publisher включать в tf-дерево различные эталонные рамки камер. Это, в свою очередь, соединяет кадры камеры с остальной частью робота, что позволяет роботу просматривать объект в глубинной рамке, но знать, где он находится относительно базы робота (например). Все сложные преобразования кадра выполняются для вас ROS благодаря библиотеке tf.
Last updated
Was this helpful?