Роботизированная рука ROS
Роботизированная рука ROS

Установка MoveIt

Поскольку я использую Ubuntu 20.04, будет установлена ​​ноэтическая версия пакета программного обеспечения.

Язык кода:javascript
копировать
sudo apt install ros-noetic-moveit

Если это Ubuntu 18.04, запустите

Язык кода:javascript
копировать
sudo apt install ros-melodic-moveit

Установка здесь занимает некоторое время.

После завершения установки введите

Язык кода:javascript
копировать
moveit_version

Есть вывод, указывающий, что установка прошла успешно. Мой вывод здесь.

Язык кода:javascript
копировать
1.1.13

установитьccd

отhttps://github.com/danfis/libccdСкачать исходный код,После распаковки src в основной папке документов «Вход»,компилировать

Язык кода:javascript
копировать
cd src

Измените Makefile, содержание модификации следующее.

Язык кода:javascript
копировать
CFLAGS += -I. -fvisibility=hidden -fPIC

Продолжить выполнение

Язык кода:javascript
копировать
make
sudo make install

Установить библиотеку fcl

отhttps://github.com/flexible-collision-library/fclСкачать исходный код,После декомпрессии Входитьхозяиндокументзажимкомпилировать Установить

Язык кода:javascript
копировать
mkdir build
cd build
cmake ..
make
sudo make install

Создайте модель роботизированной руки

Принципы моделирования URDF

Роботы в основном делятся на системы управления, системы привода, исполнительные механизмы и сенсорные системы.

  1. Система управления: эквивалентна человеческому мозгу, выполняет задачи и обработку информации, а также выдает управляющие командные сигналы.
  2. Система привода: эквивалентна человеческим мышцам и меридианам, она отвечает за управление приводом и преобразование команд, выдаваемых системой управления, в сигналы, необходимые приводу.
  3. Привод: механическое устройство, эквивалентное человеческим рукам и ногам, которое работает напрямую.
  4. Сенсорная система: связана с органами чувств и нервами человека.,Полный сигнал входа и обратная связь,Включает внутреннюю сенсорную систему (восприятие внутреннего состояния робота).,Например, датчик положения,одометр) и внешнюю сенсорную систему (воспринимающую внешнюю среду,например, лидар).

Упомянутое здесь моделирование относится к моделированию привода (механического устройства).

URDF: файл модели робота, описанный в формате XML. URDF нельзя использовать отдельно, его необходимо комбинировать с Rviz или Gazebo. URDF — это просто файл, который необходимо преобразовать в графическую модель робота в Rviz или Gazebo.

<robot>это метка верхнего уровня,нравиться

Язык кода:javascript
копировать
<robot name="pipi">
    <link>......</link>
    <link>......</link>
    
    <join>......</join>
    <join>......</join>
</robot>

Роботизированная рука на рисунке выше разделена на большую руку, маленькую руку и суставы посередине. Будь то большая рука или предплечье, мы называем их звеньями жесткого тела (звеньями), а суставы посередине — суставами. Включить в файл модели

  1. Ссылки: Системы координат и геометрические связи.
  2. Соединения: отношения связи между ссылками.

URDF может не только моделировать роботизированные руки, но и внешние сцены. Например, таблица на рисунке выше на самом деле представляет собой твердую часть тела, поэтому она также является ссылкой.

  • <link>
  1. описыватьробот Внешний вид и физические свойства детали твердого тела;
  2. описывать Размер шатуна (размер),цвет,форма,инерционная матрица матрица),параметры столкновений (столкновение свойства)ждать;
  3. Каждая ссылка станет системой координат.
Язык кода:javascript
копировать
<link name="link_4">
    <visual>
        <geometry>
             <mesh filename="link_4.stl" />
        </geometry>
    </visual>
    <collision>
        <geometry>
            <cylinder length="0.5" radius="0.1" />
        </geometry>
        <origin xyz="0 0 -0.05" rpy="0 0 0" />
    </collision>
</link>

Здесь визуальное описывает внешний вид, то есть то, что видимо;

геометрия задает форму шатуна

  1. Тег 1: коробка (коробчатая), атрибуты: размер=длина (x) ширина (y) высота (z)
  2. Тег 2: цилиндр, атрибуты: радиус = длина радиуса = высота.
  3. Тег 3: сфера, атрибут: радиус=радиус
  4. Тег 4: сетка (добавляем кожу на шатун), атрибуты: filename=Путь к ресурсу(Формат:package://<packagename>/<path>/документ)

столкновение представляет атрибут столкновения шатуна

Начало координат устанавливает дугу смещения и наклона.

  1. Свойство 1: xyz=x смещение y смещение z смещение
  2. Атрибут 2: rpy=x крен y шаг z рыскание (единица измерения – радианы)

металлик Установить свойства материала (цвет)

  1. Атрибут: имя
  2. Этикетка: color
    1. свойство: rgba=красный, зеленый и синий значения веса и прозрачности (Каждое значение веса и значение прозрачности [0,1])
  • <joint>

Существует 6 типов описания взаимосвязи между двумя звеньями. В основном используется тип вращения. Он также может описывать положение и пределы скорости соединений, а также динамику и другие атрибуты.

тип сустава

описывать

continuous

Поворотные соединения, которые могут вращаться без проводов вокруг одной оси

revolute

Вращающееся соединение аналогично непрерывному, но имеет ограничение по углу поворота.

prismatic

Скользящее соединение, соединение, перемещающееся вдоль оси, с ограничениями положения.

planar

Плоские суставы допускают перемещение или вращение в направлениях, ортогональных плоскости.

floating

Плавающие соединения допускают поступательные и вращательные движения.

fixed

Неподвижные суставы, специальные суставы, не допускающие движения.

Язык кода:javascript
копировать
<joint name="joint_2" type="revolute">
    <parent link="link_1" />
    <child link="link_2" />
    <origin xyz="0.2 0.2 0" rpy="0 0 0" />
    <axis xyz="0 0 1" />
    <limit lower="-3.14" upper="3.14" velocity="1.0" />
</joint>
  1. родитель (обязательно), родитель Название ссылки является обязательным атрибутом,ссылка: Имя родительской ссылки.,даэтотlinkсуществоватьроботдерево структурысерединаимя。
  2. ребенок (обязательно), ребенок Название ссылки является обязательным атрибутом,ссылка: название подссылки,даэтотlinkсуществоватьроботдерево структурысерединаимя。
  3. origin,свойство: xyz=смещение по каждой оси rpy=смещение радиан по каждой оси.
  4. axis,свойство: xyz используется для установки оси сустава для перемещения.

модель xacro

Улучшения модели URDF с упором на определение классов.

  • Использование 1: определение макроса
Язык кода:javascript
копировать
<xacro:macro name="ur5_robot" params="prefix joint_limited" ...>
......
</xacro:macro>

Здесь мы определяем класс, а затем вызываем его в других файлах.

  • Использование второе: документ содержит
Язык кода:javascript
копировать
<xacro:include filename="$(find ur_desciption)/urdf/ur5.urdf.xacro" />
<xacro:ur5_robot prefix="" joint_limited="false" />

Здесь вызывается используемый класс ur5_robot.

  • Использование 3: Свойства и математические операции.
Язык кода:javascript
копировать
<xacro:property name="d1" value="0.089159" />
<xacro:property name="shoulder_height" value="${d1}" />
<joint name="${prefix}shoulder_pan_joint" type="revolute">
    ...
    <origin xyz="0.0 0.0 ${shoulder_height}" rpy="0.0 0.0 0.0" />
</joint>

Здесь будет удобнее заранее определить некоторые параметры, а затем использовать их в ссылке или суставе.

HelloWorld

Войти в рабочую область

Язык кода:javascript
копировать
cd Documents/catkin_ws/src

Создать новый пакет

Язык кода:javascript
копировать
catkin_create_pkg learning_urdf urdf xacro

Создайте четыре каталога в этом пакете функций.

Язык кода:javascript
копировать
cd learning_urdf
mkdir urdf
mkdir meshes
mkdir config
mkdir launch

Давайте создадим коробочного робота

Язык кода:javascript
копировать
cd urdf
vim box.urdf

Содержание следующее

Язык кода:javascript
копировать
<robot name="mybox">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
        </visual>
    </link>
</robot>

Войдите в папку запуска и создайте файл работающего сценария.

Язык кода:javascript
копировать
cd ../launch
vim box.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <param name="robot_description" textfile="$(find learning_urdf)/urdf/box.urdf" />
    <node pkg="rviz" type="rviz" name="rviz" />
</launch>

Запустите этот скрипт

Язык кода:javascript
копировать
roslaunch learning_urdf box.launch

После завершения операции запустите Rviz, нажмите кнопку «Добавить» и добавьте RobotModel.

Затем измените фиксированный кадр на base_link. В этот момент мы видим маленького красного квадратного робота.

Сохранить конфигурацию rviz

Войдите в папку конфигурации

Язык кода:javascript
копировать
cd Documents/catkin_ws/src/learning_urdf/config

Добавить файл конфигурации

Язык кода:javascript
копировать
touch default.rviz

Выберите меню Рвиз

Выберите только что созданный файл default.rviz в каталоге и замените

Замените содержимое файла box.launch в каталоге запуска следующим

Язык кода:javascript
копировать
<launch>
    <param name="robot_description" textfile="$(find learning_urdf)/urdf/box.urdf" />
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_urdf)/config/default.rviz" />
</launch>

-d вот путь к файлу конфигурации

Закройте Rviz и перезапустите файл box.launch.

Язык кода:javascript
копировать
roslaunch learning_urdf box.launch

На этом этапе Rviz откроется и появится маленький красный квадратный робот. Нет необходимости выбирать RobotModel.

Четырехколесный цилиндрический робот

Мы создаем новый файл urdf в каталоге urdf предыдущего пакета функций.

Язык кода:javascript
копировать
vim car.urdf

Содержание следующее

Язык кода:javascript
копировать
<robot name="mycar">
    <!-- настраивать base_footprint  -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <!-- Создайте сферу радиусом 0,001. -->
                <sphere radius="0.001" />
            </geometry>
        </visual>
    </link>

    <!-- Добавить шасси -->
    <link name="base_link">
        <visual>
            <geometry>
                <!-- Создайте цилиндр радиусом 0,1 и высотой 0,08.  -->
                <cylinder radius="0.1" length="0.08" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <!-- Цвет желтый, а прозрачные веса красного, зеленого и синего равны 0,8, 0,3, 0,1 и 0,5 соответственно.  -->
            <material name="yellow">
                <color rgba="0.8 0.3 0.1 0.5" />
            </material>
        </visual>
    </link>
    <!-- Создайте фиксированное соединение, соединяющее base_link2base_footprint и base_link, смещение по оси Z0.055  -->
    <joint name="base_link2base_footprint" type="fixed">
        <parent link="base_footprint" />
        <child link="base_link"/>
        <origin xyz="0 0 0.055" />
    </joint>

    <!-- Добавляем ведущие колеса -->
    <link name="left_wheel">
        <visual>
            <geometry>
                <cylinder radius="0.0325" length="0.015" />
            </geometry>
            <origin xyz="0 0 0" rpy="1.5705 0 0" />
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0" />
            </material>
        </visual>

    </link>
    <!-- Создание вращающегося сустава -->
    <joint name="left_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="left_wheel" />
        <origin xyz="0 0.1 -0.0225" />
        <axis xyz="0 1 0" />
    </joint>


    <link name="right_wheel">
        <visual>
            <geometry>
                <cylinder radius="0.0325" length="0.015" />
            </geometry>
            <origin xyz="0 0 0" rpy="1.5705 0 0" />
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0" />
            </material>
        </visual>

    </link>

    <joint name="right_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="right_wheel" />
        <origin xyz="0 -0.1 -0.0225" />
        <axis xyz="0 1 0" />
    </joint>

    <!-- Добавить универсальные колеса (опорные колеса) -->
    <link name="front_wheel">
        <visual>
            <geometry>
                <!-- Создать сферу -->
                <sphere radius="0.0075" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0" />
            </material>
        </visual>
    </link>

    <joint name="front_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="front_wheel" />
        <origin xyz="0.0925 0 -0.0475" />
        <axis xyz="1 1 1" />
    </joint>

    <link name="back_wheel">
        <visual>
            <geometry>
                <sphere radius="0.0075" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0" />
            </material>
        </visual>
    </link>

    <joint name="back_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="back_wheel" />
        <origin xyz="-0.0925 0 -0.0475" />
        <axis xyz="1 1 1" />
    </joint>
</robot>

Для этого urdf-файла мы можем проверить

Язык кода:javascript
копировать
check_urdf car.urdf

возвращаться

Язык кода:javascript
копировать
robot name is: mycar
---------- Successfully Parsed XML ---------------
root Link: base_footprint has 1 child(ren)
    child(1):  base_link
        child(1):  back_wheel
        child(2):  front_wheel
        child(3):  left_wheel
        child(4):  right_wheel

Если исключение не выбрасывается, оно оказывается успешным.

Войдите в папку запуска и создайте файл запуска.

Язык кода:javascript
копировать
vim car.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <!-- Воля urdf документконтентнастройка в сервер параметров -->
    <param name="robot_description" textfile="$(find learning_urdf)/urdf/car.urdf" />

    <!-- запускать rivz -->
    <node pkg="rviz" type="rviz" name="rviz_test" args="-d $(find learning_urdf)/config/default.rviz" />

    <!-- статус запускаробота и узел публикации совместного статуса -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- запустить Графическое управление узлами движения суставов -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>

Установите два компонента Python

Язык кода:javascript
копировать
conda activate py39
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PySide2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Установите компонент ROS

Язык кода:javascript
копировать
sudo apt-get install ros-noetic-joint-state-publisher-gui

выполнить команду

Язык кода:javascript
копировать
roslaunch learning_urdf car.launch

использоватьXacroоптимизация Четырехколесный цилиндрический робот

Введите предыдущий пакет функций

Язык кода:javascript
копировать
cd Documents/catkin_ws/src/learning_urdf

Создайте новую папку xacro.

Язык кода:javascript
копировать
mkdir xacro
cd xacro

Создать файл xacro

Язык кода:javascript
копировать
vim car.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!--
    использовать xacro оптимизация URDF Вариант шасси автомобиля реализует:

    Идеи реализации:
    1.Волянекоторые константы、Переменная инкапсулируется как xacro:property
      Например: ПИ значение, радиус шасси автомобиля, дорожный просвет, радиус колеса, ширина ....
    2.использовать Макрос 封装ведущее колесоа также Опорное колесовыполнить,Вызов связанного Макрос генерировать ведущее колесои Опорное колесо

-->
<!-- Корневой тег, должен быть объявлен xmlns:xacro -->
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- Инкапсулировать переменные и константы -->
    <xacro:property name="PI" value="3.141"/>
    <!-- Макрос:черныйнастраивать -->
    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0" />
    </material>
    <!-- Свойства шасси -->
    <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint радиус  -->
    <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link радиус -->
    <xacro:property name="base_link_length" value="0.08" /> <!-- base_link длинный -->
    <xacro:property name="earth_space" value="0.015" /> <!-- Дорожный просвет -->

    <!-- Шасси -->
    <link name="base_footprint">
      <visual>
        <geometry>
	  <!-- Создайте сферу радиусом 0,001.м -->
          <sphere radius="${base_footprint_radius}" />
        </geometry>
      </visual>
    </link>
    <!-- Добавить шасси -->
    <link name="base_link">
      <visual>
        <geometry>
	  <!-- Создайте цилиндр радиусом 0,1 и высотой 0,08.  -->
          <cylinder radius="${base_link_radius}" length="${base_link_length}" />
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <!-- Цвет желтый, а прозрачные веса красного, зеленого и синего равны 0,8, 0,3, 0,1 и 0,5 соответственно.  -->
        <material name="yellow">
          <color rgba="0.5 0.3 0.0 0.5" />
        </material>
      </visual>
    </link>
    <!-- Создайте фиксированное соединение, соединяющее base_link2base_footprint и base_link, смещение по оси Z0.055  -->
    <joint name="base_link2base_footprint" type="fixed">
      <parent link="base_footprint" />
      <child link="base_link" />
      <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
    </joint>

    <!-- ведущее колесо -->
    <!-- ведущее колесосвойство -->
    <xacro:property name="wheel_radius" value="0.0325" /><!-- радиус -->
    <xacro:property name="wheel_length" value="0.015" /><!-- ширина -->
    <!-- ведущее колесо Макросвыполнить -->
    <xacro:macro name="add_wheels" params="name flag">
      <link name="${name}_wheel">
        <visual>
          <geometry>
            <cylinder radius="${wheel_radius}" length="${wheel_length}" />
          </geometry>
          <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
          <material name="black" />
        </visual>
      </link>

      <joint name="${name}_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="${name}_wheel" />
        <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
        <axis xyz="0 1 0" />
      </joint>
    </xacro:macro>
    <xacro:add_wheels name="left" flag="1" />
    <xacro:add_wheels name="right" flag="-1" />
    <!-- Опорное колесо -->
    <!-- Опорное колесосвойство -->
    <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- Опорное колесорадиус -->

    <!-- Опорное колесо Макрос -->
    <xacro:macro name="add_support_wheel" params="name flag" >
      <link name="${name}_wheel">
        <visual>
            <geometry>
                <sphere radius="${support_wheel_radius}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black" />
        </visual>
      </link>

      <joint name="${name}_wheel2base_link" type="continuous">
          <parent link="base_link" />
          <child link="${name}_wheel" />
          <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
          <axis xyz="1 1 1" />
      </joint>
    </xacro:macro>

    <xacro:add_support_wheel name="front" flag="1" />
    <xacro:add_support_wheel name="back" flag="-1" />

</robot>

Здесь нам тоже нужно проверить файл, но вместо проверки файла xacro мы конвертируем файл xacro в файл urdf для проверки.

Язык кода:javascript
копировать
rosrun xacro xacro car.urdf.xacro > car.urdf

Затем используйте check_urdf для проверки

Язык кода:javascript
копировать
check_urdf car.urdf

Войдите в папку запуска и создайте файл запуска.

Язык кода:javascript
копировать
vim car.xacro.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find learning_urdf)/xacro/car.urdf.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_urdf)/config/default.rviz" />
    <!-- Добавить узел публикации совместного статуса -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
    <!-- Добавить узел публикации статуса робота -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />

</launch>

выполнить команду

Язык кода:javascript
копировать
conda activate py39
roslaunch learning_urdf car.xacro.launch

Эффект здесь тот же, что и раньше.

Давать Четырехколесный цилиндрический робот Добавьте радар и Камера

Введите папку xacro пакета функций.

Язык кода:javascript
копировать
cd Documents/catkin_ws/src/learning_urdf/xacro

Создайте файлы xacro для компонентов радара и камеры соответственно.

Язык кода:javascript
копировать
vim camera.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!-- Связанные с камерой xacro документ -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Камерасвойство -->
    <xacro:property name="camera_length" value="0.01" /> <!-- Камерадлинныйстепень(x) -->
    <xacro:property name="camera_width" value="0.025" /> <!-- Камераширина(y) -->
    <xacro:property name="camera_height" value="0.025" /> <!-- Камера高степень(z) -->
    <xacro:property name="camera_x" value="0.08" /> <!-- Камера Установитьизxкоординировать -->
    <xacro:property name="camera_y" value="0.0" /> <!-- Камера Установитьизyкоординировать -->
    <xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- Камера Установитьизzкоординировать:Шасси高степень / 2 + Камера高степень / 2  -->

    <!-- Камерные соединения и звенья -->
    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_height}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="camera2base_link" type="fixed">
        <parent link="base_link" />
        <child link="camera" />
        <origin xyz="${camera_x} ${camera_y} ${camera_z}" />
    </joint>
</robot>
Язык кода:javascript
копировать
vim laser.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!--
    Добавить радар в машину Шасси
-->
<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro">

    <!-- Кронштейн радара -->
    <xacro:property name="support_length" value="0.15" /> <!-- Кронштейндлинныйстепень -->
    <xacro:property name="support_radius" value="0.01" /> <!-- Кронштейн радиуса -->
    <xacro:property name="support_x" value="0.0" /> <!-- Координата X скобки Установить -->
    <xacro:property name="support_y" value="0.0" /> <!-- Координата y скобки Установить -->
    <xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> <!-- Кронштейн Установитьизzкоординировать:Шасси高степень / 2 + Высота кронштейна / 2  -->

    <link name="support">
        <visual>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="red">
                <color rgba="0.8 0.2 0.0 0.8" />
            </material>
        </visual>
    </link>

    <joint name="support2base_link" type="fixed">
        <parent link="base_link" />
        <child link="support" />
        <origin xyz="${support_x} ${support_y} ${support_z}" />
    </joint>


    <!-- Свойства радара -->
    <xacro:property name="laser_length" value="0.05" /> <!-- радардлинныйстепень -->
    <xacro:property name="laser_radius" value="0.03" /> <!-- Радарный радиус -->
    <xacro:property name="laser_x" value="0.0" /> <!-- координата x радара установить -->
    <xacro:property name="laser_y" value="0.0" /> <!-- координата радара установить -->
    <xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> <!-- радар Установитьизzкоординировать:Высота кронштейна / 2 + высота радара / 2  -->

    <!-- Радарные соединения и ссылки -->
    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="laser2support" type="fixed">
        <parent link="support" />
        <child link="laser" />
        <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
    </joint>
</robot>

Добавьте собранный файл xacro

Язык кода:javascript
копировать
vim make.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!-- Комбинированный автомобиль Шассии Камераирадар -->
<robot name="make" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="car.urdf.xacro" />
    <xacro:include filename="camera.urdf.xacro" />
    <xacro:include filename="laser.urdf.xacro" />
</robot>

Войдите в папку запуска и создайте файл запуска.

Язык кода:javascript
копировать
vim make.urdf.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find learning_urdf)/xacro/make.urdf.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_urdf)/config/default.rviz" />
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />

</launch>

выполнить команду

Язык кода:javascript
копировать
conda activate py39
roslaunch learning_urdf make.urdf.launch

Управляйте роботом

  • Установить Арботикс
Язык кода:javascript
копировать
sudo apt-get install ros-noetic-arbotix

Если это Ubuntu 18.04, то

Язык кода:javascript
копировать
sudo apt-get install ros-melodic-arbotix

Введите папку конфигурации пакета функций.

Язык кода:javascript
копировать
cd Documents/catkin_ws/src/learning_urdf/config

Создайте новый файл конфигурации Arbotix.

Язык кода:javascript
копировать
vim control.yaml

Содержание следующее

Язык кода:javascript
копировать
# Документ представляет собой конфигурацию контроллера, робот Модель может иметь несколько контроллеров, например: Шасси、Роботизированная рука、Гриппер (робот)....
# Следовательно, корень name да controller
controllers: {
   # Единый контроллер настройки
   base_controller: {
       #тип: Дифференциальный регулятор скорости
       type: diff_controller,
       #Справочные координаты
       base_frame_id: base_footprint, 
       #Пространство между двумя колесами
       base_width: 0.2,
       #Контрольная частота
       ticks_meter: 2000, 
       Параметры управления #PID, позволяющие роботу быстро достичь ожидаемой скорости.
       Kp: 12, 
       Kd: 12, 
       Ki: 0, 
       Ko: 50, 
       #Предел ускорения
       accel_limit: 1.0 
    }
}

由于我们之前изроботдадва нижних колеса,Если вы хотите, чтобы робот двигался по прямой, вы должны поддерживать одинаковую скорость обоих колес, если хотите, чтобы робот поворачивал;,Просто позволь этомусерединаиз一个轮子转速增大,一个轮子из转速减慢。потому чтодапроходитьскорость Приходить Управляйте роботомиз,Так это называется Дифференциальный регулятор скорости。Arbotixхочуробот运动起Приходить得发布消息,существовать Требуется при публикации сообщенийроботизкоординировать系,而这里用издаbase_footprintизкоординировать系。Расстояние между колесами может быть гарантированоробот按照某个固定из角скоростьповернуть。ArbotixсуществоватьROSсерединана самом деледаузел управления,Требуется взаимодействие с роботом через сообщения.,Просто контролируйте частотуда1秒钟发送из消息из Второсортный数,Здесь это 2000 раз. Параметры ПИД-регулирования дазаказ Управляйте роботом达到最终из稳定скорость,Например 120км/ч.,Здесь будет алгоритм,Опустить пока。Предел ускорения составляетдапределроботиз加скоростьиз。подробнее оArbotixиз配置内容Может参考http://wiki.ros.org/arbotix_python/diff_controller

Войдите в папку запуска и измените make.urdf.launch.

Язык кода:javascript
копировать
vim make.urdf.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find learning_urdf)/xacro/make.urdf.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find learning_urdf)/config/default.rviz" />
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />
    <!-- Интеграция узлов управления движением arbotix и параметров нагрузки -->
    <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
     <rosparam file="$(find learning_urdf)/config/control.yaml" command="load" />
     <param name="sim" value="true" />
    </node>

</launch>

Установите компонент Python

Язык кода:javascript
копировать
conda activate py39
pip install serial -i https://pypi.tuna.tsinghua.edu.cn/simple

выполнить команду

Язык кода:javascript
копировать
roslaunch learning_urdf make.urdf.launch

Настроить рвиз

Здесь нам нужно только установить фиксированный кадр на odom.

Просмотрите список тем и откройте новое окно терминала.

Язык кода:javascript
копировать
rostopic list

возвращаться

Язык кода:javascript
копировать
/clicked_point
/cmd_vel
/diagnostics
/initialpose
/joint_states
/move_base_simple/goal
/odom
/rosout
/rosout_agg
/tf
/tf_static

Здесь/cmd_vel — тема, которую мы хотим использовать.

входить

Язык кода:javascript
копировать
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

В этот момент вы можете видеть, как робот совершает круговое движение.

URDF интегрирует Gazebo

Войти в рабочую область

Язык кода:javascript
копировать
cd Documents/catkin_ws/src

Создать новый пакет

Язык кода:javascript
копировать
catkin_create_pkg learning_gazebo urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins

Создайте четыре каталога в этом пакете функций.

Язык кода:javascript
копировать
cd learning_gazebo
mkdir urdf
mkdir meshes
mkdir config
mkdir launch

Давайте создадим коробочного робота

Язык кода:javascript
копировать
cd urdf
vim box.urdf

Содержание следующее

Язык кода:javascript
копировать
<!-- 
    Создайте робот Модель (достаточно прямоугольной формы) и отобразите ее в Gazebo середина 
-->

<robot name="mybox">
    <link name="base_link">
        <visual>
            <geometry>
                <!-- Создайте коробчатый объект -->
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <!-- Цвет объекта в коробке — желтый. -->
            <material name="yellow">
                <color rgba="0.5 0.3 0.0 1" />
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
        <inertial>
            <origin xyz="0 0 0" />
            <mass value="6" />
            <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
        </inertial>
    </link>
    <gazebo reference="base_link">
        <material>Gazebo/Black</material>
    </gazebo>

</robot>

Обратите внимание, что когда URDF необходимо интегрировать с Gazebo, есть очевидные отличия от Rviz:

  1. Необходимо использовать тег столкновения, поскольку, поскольку это среда моделирования, необходимо использовать обнаружение столкновений, а столкновение обеспечивает основу для обнаружения столкновений.
  2. Необходимо использовать inertial Этикетка,Эта метка отмечает матрицу инерции определенной части твердого тела перед созданием робота.,Используется для некоторых расчетов моделирования, связанных с механикой.
  3. Настройки цвета также необходимо еще раз отметить меткой беседки, поскольку предыдущие настройки цвета включали прозрачность для удобства отладки, а в среде моделирования такой опции нет.

Войдите в папку запуска и создайте файл сценария запуска.

Язык кода:javascript
копировать
vim box.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>

    <!-- Воля Urdf Содержимое документа загружается на сервер параметров. -->
    <param name="robot_description" textfile="$(find learning_gazebo)/urdf/box.urdf" />

    <!-- запускать gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- существовать gazebo серединапоказыватьробот Модель -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mybox -param robot_description"  />
</launch>

Запустите этот скрипт

Язык кода:javascript
копировать
conda activate py39
roslaunch learning_gazebo box.launch

Четырехколесный цилиндрический робот(Gazeboверсия)

Введите каталог urdf пакета.

Язык кода:javascript
копировать
cd Documents/catkin_ws/src/learning_gazebo/urdf

Добавлен новый файл xacro, инкапсулирующий алгоритм матрицы инерции.

Язык кода:javascript
копировать
vim head.xacro

Содержание следующее

Язык кода:javascript
копировать
<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

Содержание этого документа высокопрофессионально, поэтому вы можете пока его игнорировать.

Создайте файл xacro шасси.

Язык кода:javascript
копировать
vim car.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!--
    использовать xacro оптимизация URDF Вариант шасси автомобиля реализует:

    Идеи реализации:
    1.Волянекоторые константы、Переменная инкапсулируется как xacro:property
      Например: ПИ значение, радиус шасси автомобиля, дорожный просвет, радиус колеса, ширина ....
    2.использовать Макрос 封装ведущее колесоа также Опорное колесовыполнить,Вызов связанного Макрос генерировать ведущее колесои Опорное колесо

-->
<!-- Корневой тег, должен быть объявлен xmlns:xacro -->
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- Инкапсулировать переменные и константы -->
    <!-- PI ценитьнастраивать精степень需要高一些,В противном случае при расчете последующей величины поворота колеса,Возможен наклон колес, незаметный невооруженным глазом.,от而导致Модель Джиттер -->
    <xacro:property name="PI" value="3.1415926"/>
    <!-- Макрос:черныйнастраивать -->
    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0" />
    </material>
    <!-- Свойства шасси -->
    <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint радиус  -->
    <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link радиус -->
    <xacro:property name="base_link_length" value="0.08" /> <!-- base_link длинный -->
    <xacro:property name="earth_space" value="0.015" /> <!-- Дорожный просвет -->
    <xacro:property name="base_link_m" value="0.5" /> <!-- качество  -->

    <!-- Шасси -->
    <link name="base_footprint">
      <visual>
        <geometry>
          <sphere radius="${base_footprint_radius}" />
        </geometry>
      </visual>
    </link>

    <link name="base_link">
      <visual>
        <geometry>
          <cylinder radius="${base_link_radius}" length="${base_link_length}" />
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <material name="yellow">
          <color rgba="0.5 0.3 0.0 0.5" />
        </material>
      </visual>
      <collision>
        <geometry>
          <cylinder radius="${base_link_radius}" length="${base_link_length}" />
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
      </collision>
      <xacro:cylinder_inertial_matrix m="${base_link_m}" r="${base_link_radius}" h="${base_link_length}" />

    </link>


    <joint name="base_link2base_footprint" type="fixed">
      <parent link="base_footprint" />
      <child link="base_link" />
      <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
    </joint>
    <gazebo reference="base_link">
        <material>Gazebo/Yellow</material>
    </gazebo>

    <!-- ведущее колесо -->
    <!-- ведущее колесосвойство -->
    <xacro:property name="wheel_radius" value="0.0325" /><!-- радиус -->
    <xacro:property name="wheel_length" value="0.015" /><!-- ширина -->
    <xacro:property name="wheel_m" value="0.05" /> <!-- качество  -->

    <!-- ведущее колесо Макросвыполнить -->
    <xacro:macro name="add_wheels" params="name flag">
      <link name="${name}_wheel">
        <visual>
          <geometry>
            <cylinder radius="${wheel_radius}" length="${wheel_length}" />
          </geometry>
          <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
          <material name="black" />
        </visual>
        <collision>
          <geometry>
            <cylinder radius="${wheel_radius}" length="${wheel_length}" />
          </geometry>
          <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
        </collision>
        <xacro:cylinder_inertial_matrix m="${wheel_m}" r="${wheel_radius}" h="${wheel_length}" />

      </link>

      <joint name="${name}_wheel2base_link" type="continuous">
        <parent link="base_link" />
        <child link="${name}_wheel" />
        <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
        <axis xyz="0 1 0" />
      </joint>

      <gazebo reference="${name}_wheel">
        <material>Gazebo/Red</material>
      </gazebo>

    </xacro:macro>
    <xacro:add_wheels name="left" flag="1" />
    <xacro:add_wheels name="right" flag="-1" />
    <!-- Опорное колесо -->
    <!-- Опорное колесосвойство -->
    <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- Опорное колесорадиус -->
    <xacro:property name="support_wheel_m" value="0.03" /> <!-- качество  -->

    <!-- Опорное колесо Макрос -->
    <xacro:macro name="add_support_wheel" params="name flag" >
      <link name="${name}_wheel">
        <visual>
            <geometry>
                <sphere radius="${support_wheel_radius}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="black" />
        </visual>
        <collision>
            <geometry>
                <sphere radius="${support_wheel_radius}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
        </collision>
        <xacro:sphere_inertial_matrix m="${support_wheel_m}" r="${support_wheel_radius}" />
      </link>

      <joint name="${name}_wheel2base_link" type="continuous">
          <parent link="base_link" />
          <child link="${name}_wheel" />
          <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
          <axis xyz="1 1 1" />
      </joint>
      <gazebo reference="${name}_wheel">
        <material>Gazebo/Red</material>
      </gazebo>
    </xacro:macro>

    <xacro:add_support_wheel name="front" flag="1" />
    <xacro:add_support_wheel name="back" flag="-1" />


</robot>

Вам нужно только обратить внимание на упомянутые выше меры предосторожности в отношении содержания версии Rivz. Общее содержание такое же.

Создать файл xacro камеры

Язык кода:javascript
копировать
vim camera.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!-- Связанные с камерой xacro документ -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Камерасвойство -->
    <xacro:property name="camera_length" value="0.01" /> <!-- Камерадлинныйстепень(x) -->
    <xacro:property name="camera_width" value="0.025" /> <!-- Камераширина(y) -->
    <xacro:property name="camera_height" value="0.025" /> <!-- Камера高степень(z) -->
    <xacro:property name="camera_x" value="0.08" /> <!-- Камера Установитьизxкоординировать -->
    <xacro:property name="camera_y" value="0.0" /> <!-- Камера Установитьизyкоординировать -->
    <xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- Камера Установитьизzкоординировать:Шасси高степень / 2 + Камера高степень / 2  -->

    <xacro:property name="camera_m" value="0.01" /> <!-- Камеракачество -->

    <!-- Камерные соединения и звенья -->
    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_height}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
        <collision>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_height}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
        <xacro:Box_inertial_matrix m="${camera_m}" l="${camera_length}" w="${camera_width}" h="${camera_height}" />
    </link>

    <joint name="camera2base_link" type="fixed">
        <parent link="base_link" />
        <child link="camera" />
        <origin xyz="${camera_x} ${camera_y} ${camera_z}" />
    </joint>
    <gazebo reference="camera">
        <material>Gazebo/Blue</material>
    </gazebo>
</robot>

Создать файл радара xacro

Язык кода:javascript
копировать
vim laser.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!--
    Добавить радар в машину Шасси
-->
<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro">

    <!-- Кронштейн радара -->
    <xacro:property name="support_length" value="0.15" /> <!-- Кронштейндлинныйстепень -->
    <xacro:property name="support_radius" value="0.01" /> <!-- Кронштейн радиуса -->
    <xacro:property name="support_x" value="0.0" /> <!-- Координата X скобки Установить -->
    <xacro:property name="support_y" value="0.0" /> <!-- Координата y скобки Установить -->
    <xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> <!-- Кронштейн Установитьизzкоординировать:Шасси高степень / 2 + Высота кронштейна / 2  -->

    <xacro:property name="support_m" value="0.02" /> <!-- Кронштейнкачество -->

    <link name="support">
        <visual>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="red">
                <color rgba="0.8 0.2 0.0 0.8" />
            </material>
        </visual>

        <collision>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>

        <xacro:cylinder_inertial_matrix m="${support_m}" r="${support_radius}" h="${support_length}" />

    </link>

    <joint name="support2base_link" type="fixed">
        <parent link="base_link" />
        <child link="support" />
        <origin xyz="${support_x} ${support_y} ${support_z}" />
    </joint>

    <gazebo reference="support">
        <material>Gazebo/White</material>
    </gazebo>

    <!-- Свойства радара -->
    <xacro:property name="laser_length" value="0.05" /> <!-- радардлинныйстепень -->
    <xacro:property name="laser_radius" value="0.03" /> <!-- Радарный радиус -->
    <xacro:property name="laser_x" value="0.0" /> <!-- координата x радара установить -->
    <xacro:property name="laser_y" value="0.0" /> <!-- координата радара установить -->
    <xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> <!-- радар Установитьизzкоординировать:Высота кронштейна / 2 + высота радара / 2  -->

    <xacro:property name="laser_m" value="0.1" /> <!-- радаркачество -->

    <!-- Радарные соединения и ссылки -->
    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
        <xacro:cylinder_inertial_matrix m="${laser_m}" r="${laser_radius}" h="${laser_length}" />
    </link>

    <joint name="laser2support" type="fixed">
        <parent link="support" />
        <child link="laser" />
        <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
    </joint>
    <gazebo reference="laser">
        <material>Gazebo/Black</material>
    </gazebo>
</robot>

Добавьте собранный файл xacro

Язык кода:javascript
копировать
vim make.urdf.xacro

Содержание следующее

Язык кода:javascript
копировать
<!-- Комбинированный автомобиль Шассии Камера -->
<robot name="make" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="head.xacro" />
    <xacro:include filename="car.urdf.xacro" />
    <xacro:include filename="camera.urdf.xacro" />
    <xacro:include filename="laser.urdf.xacro" />
</robot>

Войдите в папку запуска и создайте файл запуска.

Язык кода:javascript
копировать
vim make.urdf.launch

Содержание следующее

Язык кода:javascript
копировать
<launch>
    <!-- Воля Urdf Содержимое документа загружается на сервер параметров. -->
    <param name="robot_description" command="$(find xacro)/xacro $(find learning_gazebo)/urdf/make.urdf.xacro" />
    <!-- запускать gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- существовать gazebo серединапоказыватьробот Модель -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model make -param robot_description"  />
</launch>

Запустите этот скрипт

Язык кода:javascript
копировать
conda activate py39
roslaunch learning_gazebo make.urdf.launch

Основные функции MoveIt и элементы управления Rivz

Введение в MoveIt

Роботизированная рука Извлечение делится на——Зрение、Планирование и контроль, три части。существовать Зрениесерединавходитьиз为相机数据,Данные могут быть цветным изображением (RGB) или изображением глубины.,Создание облаков точек из изображений,再去做Жест захватаиз预测。这里извходить Можетдаоблако точекили ВОЗдаRGB深степень图,根据算法из不同而不同。姿态预测из结果就да Изображение вышесередина右上из部分,包含物体本身和Жест захвата。Жест захватада相对于相机из,Рука робота должна достичь соответствующего положения.,Это необходимо сделать посредством калибровки вручную и глазом. Он передаст координаты системы координат позы в роботизированную руку.,проходить控制позволять Роботизированная рука到达этоткоординировать位置进行真实из抓取。

Если сразу перейти от обзора к управлению, возникнут некоторые проблемы, такие как влияние других объектов и столкновений. Поэтому нам необходимо ввести в ROS визуальную часть для планирования и спланировать путь без столкновений. Обнаружение столкновений используется для определения того, произойдет ли столкновение на пути.

Ключевые особенности MoveIt включают в себя:

  1. Кинематика
  2. Планирование движения
  3. Проверка столкновений
  4. 3D восприятие(Пекрепция)
  5. Манипуляция

Наиболее важными из них являются первые 3 пункта.

В ROS самым важным узлом является Move. Group,它извходить Можетда人也МожетдаAI,проходитьRvizсерединаиз插件进行控制;也Можетпроходить程序作为входить;另外它Может订阅相机изоблако точекили ВОЗда深степень图,Волячто переводится вROSсерединаиз Формат,от而对物体进行避障。это будетиспользоватьнекоторые библиотеки с открытым исходным кодом(最хозяин要из为OMPLБиблиотека)стыковка,Осуществить планирование пути. Затем для обнаружения столкновений вызывается библиотека с открытым исходным кодом для обнаружения столкновений (FCL). После получения пути необходимо заняться планированием траектории.,Например, несколько точек на пути,После получения этих точек нам также нужно добавить время, скорость и ускорение для достижения каждой точки.,都需要规划出Приходить。Окончательнода发送指令Давать Роботизированная рука,позволять Роботизированная рукавыполнить эту траекторию。

Картинка выше - перемещение Интерфейс группы с пользователями и роботами. Сначала он получит некоторые параметры от сервера параметров ROS. Интерфейс взаимодействия с пользователями включает C++, Python и Rviz. Эти интерфейсы в основном предоставляют некоторые услуги, позволяющие перемещать Узлы группы могут использовать эти услуги. В интерфейсной части с роботом основная задача — дать роботу запланированный путь и позволить роботу его выполнить. Робот может определять угол θ каждого сустава с помощью датчиков, а затем передавать его в движение. групповой узел,от而确定роботкогда前из状态。假设我们из Роботизированная рукада6关节из,Так6个关节из角степень确定了就Может确定整个Роботизированная рукаиз姿态。有了этот姿态就Может把每个关节из位姿发布出Приходить。Затемда相机извходить,Облако точек или карта глубины отправляется для перемещения группового узла.

Выполнить в другом окне командной строки

Язык кода:javascript
копировать
roscore
rosrun moveit_setup_assistant moveit_setup_assistant

Появится окно с двумя кнопками – Создать. New MoveIt Configuration Package(Создать новый пакет)、Edit Existing MoveIt Configuration Пакет (редактировать существующий пакет).

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose