Поскольку я использую Ubuntu 20.04, будет установлена ноэтическая версия пакета программного обеспечения.
sudo apt install ros-noetic-moveit
Если это Ubuntu 18.04, запустите
sudo apt install ros-melodic-moveit
Установка здесь занимает некоторое время.
После завершения установки введите
moveit_version
Есть вывод, указывающий, что установка прошла успешно. Мой вывод здесь.
1.1.13
установитьccd
отhttps://github.com/danfis/libccdСкачать исходный код,После распаковки src в основной папке документов «Вход»,компилировать
cd src
Измените Makefile, содержание модификации следующее.
CFLAGS += -I. -fvisibility=hidden -fPIC
Продолжить выполнение
make
sudo make install
Установить библиотеку fcl
отhttps://github.com/flexible-collision-library/fclСкачать исходный код,После декомпрессии Входитьхозяиндокументзажимкомпилировать Установить
mkdir build
cd build
cmake ..
make
sudo make install
Принципы моделирования URDF
Роботы в основном делятся на системы управления, системы привода, исполнительные механизмы и сенсорные системы.
Упомянутое здесь моделирование относится к моделированию привода (механического устройства).
URDF: файл модели робота, описанный в формате XML. URDF нельзя использовать отдельно, его необходимо комбинировать с Rviz или Gazebo. URDF — это просто файл, который необходимо преобразовать в графическую модель робота в Rviz или Gazebo.
<robot>это метка верхнего уровня,нравиться
<robot name="pipi">
<link>......</link>
<link>......</link>
<join>......</join>
<join>......</join>
</robot>
Роботизированная рука на рисунке выше разделена на большую руку, маленькую руку и суставы посередине. Будь то большая рука или предплечье, мы называем их звеньями жесткого тела (звеньями), а суставы посередине — суставами. Включить в файл модели
URDF может не только моделировать роботизированные руки, но и внешние сцены. Например, таблица на рисунке выше на самом деле представляет собой твердую часть тела, поэтому она также является ссылкой.
<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>
Здесь визуальное описывает внешний вид, то есть то, что видимо;
геометрия задает форму шатуна
столкновение представляет атрибут столкновения шатуна
Начало координат устанавливает дугу смещения и наклона.
металлик Установить свойства материала (цвет)
Существует 6 типов описания взаимосвязи между двумя звеньями. В основном используется тип вращения. Он также может описывать положение и пределы скорости соединений, а также динамику и другие атрибуты.
тип сустава | описывать |
---|---|
continuous | Поворотные соединения, которые могут вращаться без проводов вокруг одной оси |
revolute | Вращающееся соединение аналогично непрерывному, но имеет ограничение по углу поворота. |
prismatic | Скользящее соединение, соединение, перемещающееся вдоль оси, с ограничениями положения. |
planar | Плоские суставы допускают перемещение или вращение в направлениях, ортогональных плоскости. |
floating | Плавающие соединения допускают поступательные и вращательные движения. |
fixed | Неподвижные суставы, специальные суставы, не допускающие движения. |
<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>
модель xacro
Улучшения модели URDF с упором на определение классов.
<xacro:macro name="ur5_robot" params="prefix joint_limited" ...>
......
</xacro:macro>
Здесь мы определяем класс, а затем вызываем его в других файлах.
<xacro:include filename="$(find ur_desciption)/urdf/ur5.urdf.xacro" />
<xacro:ur5_robot prefix="" joint_limited="false" />
Здесь вызывается используемый класс ur5_robot.
<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
Войти в рабочую область
cd Documents/catkin_ws/src
Создать новый пакет
catkin_create_pkg learning_urdf urdf xacro
Создайте четыре каталога в этом пакете функций.
cd learning_urdf
mkdir urdf
mkdir meshes
mkdir config
mkdir launch
Давайте создадим коробочного робота
cd urdf
vim box.urdf
Содержание следующее
<robot name="mybox">
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.2 0.1" />
</geometry>
</visual>
</link>
</robot>
Войдите в папку запуска и создайте файл работающего сценария.
cd ../launch
vim box.launch
Содержание следующее
<launch>
<param name="robot_description" textfile="$(find learning_urdf)/urdf/box.urdf" />
<node pkg="rviz" type="rviz" name="rviz" />
</launch>
Запустите этот скрипт
roslaunch learning_urdf box.launch
После завершения операции запустите Rviz, нажмите кнопку «Добавить» и добавьте RobotModel.
Затем измените фиксированный кадр на base_link. В этот момент мы видим маленького красного квадратного робота.
Сохранить конфигурацию rviz
Войдите в папку конфигурации
cd Documents/catkin_ws/src/learning_urdf/config
Добавить файл конфигурации
touch default.rviz
Выберите меню Рвиз
Выберите только что созданный файл default.rviz в каталоге и замените
Замените содержимое файла box.launch в каталоге запуска следующим
<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.
roslaunch learning_urdf box.launch
На этом этапе Rviz откроется и появится маленький красный квадратный робот. Нет необходимости выбирать RobotModel.
Четырехколесный цилиндрический робот
Мы создаем новый файл urdf в каталоге urdf предыдущего пакета функций.
vim car.urdf
Содержание следующее
<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-файла мы можем проверить
check_urdf car.urdf
возвращаться
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
Если исключение не выбрасывается, оно оказывается успешным.
Войдите в папку запуска и создайте файл запуска.
vim car.launch
Содержание следующее
<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
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
sudo apt-get install ros-noetic-joint-state-publisher-gui
выполнить команду
roslaunch learning_urdf car.launch
использоватьXacroоптимизация Четырехколесный цилиндрический робот
Введите предыдущий пакет функций
cd Documents/catkin_ws/src/learning_urdf
Создайте новую папку xacro.
mkdir xacro
cd xacro
Создать файл xacro
vim car.urdf.xacro
Содержание следующее
<!--
использовать 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 для проверки.
rosrun xacro xacro car.urdf.xacro > car.urdf
Затем используйте check_urdf для проверки
check_urdf car.urdf
Войдите в папку запуска и создайте файл запуска.
vim car.xacro.launch
Содержание следующее
<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>
выполнить команду
conda activate py39
roslaunch learning_urdf car.xacro.launch
Эффект здесь тот же, что и раньше.
Давать Четырехколесный цилиндрический робот Добавьте радар и Камера
Введите папку xacro пакета функций.
cd Documents/catkin_ws/src/learning_urdf/xacro
Создайте файлы xacro для компонентов радара и камеры соответственно.
vim camera.urdf.xacro
Содержание следующее
<!-- Связанные с камерой 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>
vim laser.urdf.xacro
Содержание следующее
<!--
Добавить радар в машину Шасси
-->
<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
vim make.urdf.xacro
Содержание следующее
<!-- Комбинированный автомобиль Шассии Камераирадар -->
<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>
Войдите в папку запуска и создайте файл запуска.
vim make.urdf.launch
Содержание следующее
<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>
выполнить команду
conda activate py39
roslaunch learning_urdf make.urdf.launch
Управляйте роботом
sudo apt-get install ros-noetic-arbotix
Если это Ubuntu 18.04, то
sudo apt-get install ros-melodic-arbotix
Введите папку конфигурации пакета функций.
cd Documents/catkin_ws/src/learning_urdf/config
Создайте новый файл конфигурации Arbotix.
vim control.yaml
Содержание следующее
# Документ представляет собой конфигурацию контроллера, робот Модель может иметь несколько контроллеров, например: Шасси、Роботизированная рука、Гриппер (робот)....
# Следовательно, корень 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.
vim make.urdf.launch
Содержание следующее
<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
conda activate py39
pip install serial -i https://pypi.tuna.tsinghua.edu.cn/simple
выполнить команду
roslaunch learning_urdf make.urdf.launch
Настроить рвиз
Здесь нам нужно только установить фиксированный кадр на odom.
Просмотрите список тем и откройте новое окно терминала.
rostopic list
возвращаться
/clicked_point
/cmd_vel
/diagnostics
/initialpose
/joint_states
/move_base_simple/goal
/odom
/rosout
/rosout_agg
/tf
/tf_static
Здесь/cmd_vel — тема, которую мы хотим использовать.
входить
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
Войти в рабочую область
cd Documents/catkin_ws/src
Создать новый пакет
catkin_create_pkg learning_gazebo urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins
Создайте четыре каталога в этом пакете функций.
cd learning_gazebo
mkdir urdf
mkdir meshes
mkdir config
mkdir launch
Давайте создадим коробочного робота
cd urdf
vim box.urdf
Содержание следующее
<!--
Создайте робот Модель (достаточно прямоугольной формы) и отобразите ее в 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:
Войдите в папку запуска и создайте файл сценария запуска.
vim box.launch
Содержание следующее
<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>
Запустите этот скрипт
conda activate py39
roslaunch learning_gazebo box.launch
Четырехколесный цилиндрический робот(Gazeboверсия)
Введите каталог urdf пакета.
cd Documents/catkin_ws/src/learning_gazebo/urdf
Добавлен новый файл xacro, инкапсулирующий алгоритм матрицы инерции.
vim head.xacro
Содержание следующее
<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 шасси.
vim car.urdf.xacro
Содержание следующее
<!--
использовать 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 камеры
vim camera.urdf.xacro
Содержание следующее
<!-- Связанные с камерой 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
vim laser.urdf.xacro
Содержание следующее
<!--
Добавить радар в машину Шасси
-->
<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
vim make.urdf.xacro
Содержание следующее
<!-- Комбинированный автомобиль Шассии Камера -->
<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>
Войдите в папку запуска и создайте файл запуска.
vim make.urdf.launch
Содержание следующее
<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>
Запустите этот скрипт
conda activate py39
roslaunch learning_gazebo make.urdf.launch
Введение в MoveIt
Роботизированная рука Извлечение делится на——Зрение、Планирование и контроль, три части。существовать Зрениесерединавходитьиз为相机数据,Данные могут быть цветным изображением (RGB) или изображением глубины.,Создание облаков точек из изображений,再去做Жест захватаиз预测。这里извходить Можетдаоблако точекили ВОЗдаRGB深степень图,根据算法из不同而不同。姿态预测из结果就да Изображение вышесередина右上из部分,包含物体本身和Жест захвата。Жест захватада相对于相机из,Рука робота должна достичь соответствующего положения.,Это необходимо сделать посредством калибровки вручную и глазом. Он передаст координаты системы координат позы в роботизированную руку.,проходить控制позволять Роботизированная рука到达этоткоординировать位置进行真实из抓取。
Если сразу перейти от обзора к управлению, возникнут некоторые проблемы, такие как влияние других объектов и столкновений. Поэтому нам необходимо ввести в ROS визуальную часть для планирования и спланировать путь без столкновений. Обнаружение столкновений используется для определения того, произойдет ли столкновение на пути.
Ключевые особенности MoveIt включают в себя:
Наиболее важными из них являются первые 3 пункта.
В ROS самым важным узлом является Move. Group,它извходить Можетда人也МожетдаAI,проходитьRvizсерединаиз插件进行控制;也Можетпроходить程序作为входить;另外它Может订阅相机изоблако точекили ВОЗда深степень图,Волячто переводится вROSсерединаиз Формат,от而对物体进行避障。это будетиспользоватьнекоторые библиотеки с открытым исходным кодом(最хозяин要из为OMPLБиблиотека)стыковка,Осуществить планирование пути. Затем для обнаружения столкновений вызывается библиотека с открытым исходным кодом для обнаружения столкновений (FCL). После получения пути необходимо заняться планированием траектории.,Например, несколько точек на пути,После получения этих точек нам также нужно добавить время, скорость и ускорение для достижения каждой точки.,都需要规划出Приходить。Окончательнода发送指令Давать Роботизированная рука,позволять Роботизированная рукавыполнить эту траекторию。
Картинка выше - перемещение Интерфейс группы с пользователями и роботами. Сначала он получит некоторые параметры от сервера параметров ROS. Интерфейс взаимодействия с пользователями включает C++, Python и Rviz. Эти интерфейсы в основном предоставляют некоторые услуги, позволяющие перемещать Узлы группы могут использовать эти услуги. В интерфейсной части с роботом основная задача — дать роботу запланированный путь и позволить роботу его выполнить. Робот может определять угол θ каждого сустава с помощью датчиков, а затем передавать его в движение. групповой узел,от而确定роботкогда前из状态。假设我们из Роботизированная рукада6关节из,Так6个关节из角степень确定了就Может确定整个Роботизированная рукаиз姿态。有了этот姿态就Может把每个关节из位姿发布出Приходить。Затемда相机извходить,Облако точек или карта глубины отправляется для перемещения группового узла.
Выполнить в другом окне командной строки
roscore
rosrun moveit_setup_assistant moveit_setup_assistant
Появится окно с двумя кнопками – Создать. New MoveIt Configuration Package(Создать новый пакет)、Edit Existing MoveIt Configuration Пакет (редактировать существующий пакет).