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