En primer lugar, permítanme declarar que este proyecto se basa en el [Tutorial de introducción de brazo robótico ROS] de Kazakhstan UP en la estación B , y se reprodujo en la etapa inicial [Toma de visión de brazo robótico de la teoría al combate práctico].
visualización de logros por fases y tecnología de su carrera de posgrado Compartir, todos los datos y el código son de código abierto. Entonces, Pengpeng, lo reproduzco nuevamente. El hardware que uso es diferente. El maestro UP usa UR5 y mi laboratorio usa UR3. Los materiales relevantes UR3CB3.12 se enumeran a continuación: https: //www.universal
-robots . cn/cb3/
[Actualización del sistema UR3 a CB3.12 con URcap1.05]
soporte de hardware
número de serie | nombre | Función |
---|---|---|
1 | brazo robótico UR3 | ejecutor de todas las acciones |
2 | D435i | los ojos del ejecutor |
3 | Entorno de aprendizaje profundo de Ubuntu | cerebro de pensamiento ejecutivo |
4 | Plataforma de agarre de avión | Entorno operativo experimental |
5 | Tablero de calibración de tablero de ajedrez en blanco y negro 6*6 | Calibración del ojo de la cámara fuera de la mano |
6 | Cubo pequeño de impresión 3D de 3x3x3cm | actor de artefactos |
El código es compatible con
el código del tutorial de entrada del brazo robótico ros versión 3.0 enlace:
enlace: https://pan.baidu.com/s/1KFLQXVWShG5KfroCd6eM0A=8888
código de extracción: 8888
[Tutorial de entrada del brazo robótico ROS - cinco pequeños]
Enlace PPT: https :/ /pan.baidu.com/s/18ierKnf8OJPPvGn8uOf1hw=8888
Código de extracción: 8888
1. Información general
[Tutorial principal de Autolabor] Introducción a los robots ROS
Tutorial de inicio rápido de ROS del sistema operativo de robot
2. Introducción a ROS
2.1 Introducción a ROS
Sitio web oficial de ROS: http://wiki.ros.org/
dirección de trabajo automático: http://www.autolabor.com.cn/book/ROSTutorials/
API de Moveit: https://moveit.ros.org/documentation/source-code-api/
melódico: http://docs.ros.org/en/melodic/api/moveit_tutorials/html/index.html
2.2 Paquete de robots ROS
ros-melodic: git clon https://github.com/ros-industrial/universal_robot.git
ros-noetic: https://blog.csdn.net/Dawn_yc/article/details/114791755
3. Modelado de robots URDF
3.1 Introducción a URDF
URDF es el formato de descripción del modelo de robot en ROS, que incluye la descripción de la apariencia del cuerpo rígido del robot, las propiedades físicas, los tipos de juntas, etc.
3.2 Ver modelo
$ check_urdf xxx.urdf Revisa el archivo xxx.urdf y encuentra un error
$ urdf_to_graphiz xxx.urdf
Genera un archivo pdf desde el archivo urdf para visualización
$ roslaunch ur_description view_ur5.launch Muestra el modelo ur5
3.3 Configurar y guardar Rviz
roslaunch ur_description view_ur5_with_gripper.launch Exposición ur5+robotiq85 modelo
roslaunch ur_description view_ur5.launch
rviz
La ruta de guardado de rviz está enuniversal_robot/ur_description/cfg/2222.rviz
<?xml version="1.0"?>
<launch>
<include file="$(find ur_description)/launch/ur5_upload.launch"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
<param name="use_gui" value="true"/>
</node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ur_description)/cfg/2222.rviz" required="true" />
</launch>
4. Introducción a la función principal Moveit! y control Rviz
4.1 Introducción a Moveit!
MoveIt! es un software de conjunto de herramientas relacionado con el brazo robótico, que
integra varias funciones:
Ø Cinemática
Ø Planificación de movimiento
Ø Comprobación de colisiones
Ø Percepción 3D
Ø Manipulación
4.2 Arquitectura del paquete Robot ROS
rosrun moveit_setup_assistant moveit_setup_assistant
Cargue el modelo urdf
para verificar si hay una colisión entre las articulaciones
Seleccione el solucionador,
seleccione la conexión de referencia y finalice el solucionador,
configure la posición de postura relevante,
recuéstese y ponga en cero
la postura 0,-1.5708,0-1.5708,0,0
Configurar la pinza final
Complete la información personal
y finalmente cree el modelo.
Importar modelo directamente
4.3 Configuración de la computadora
Hay una demostración de Rviz correspondiente después de la configuración de moveit
roslaunch ur5_moveit_config demo.launch
Posición de destino aleatoria, haga clic en planificar y ejecutar, puede moverse a la posición correspondiente
Agregar
demostración de pinza de obstáculos
roslaunch ur5_gripper_moveit_config demo.launch
5. Gazebo simula o controla un robot real
Hiper terminal
sudo apt install terminator
5.1 Conexión entre Moveit y el controlador
Cómo utilizar
# gazebo仿真中控制机器人
roslaunch ur_gazebo ur5.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# 控制真实UR5机器人
一键启动:
roslaunch ur_planning start_ur5.launch
分开启动:
roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# rviz 仅作可视化显示
roslaunch ur5_moveit_config demo.launch
rosrun ur_planning moveitServer.py
5.2 Simulación de cenador
5.3 Controlar el robot UR5 real
inicio con un solo botón:
roslaunch ur_planning start_ur5.launch
Comience por separado:
roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
6. Conceptos básicos de Moveit (python)
6.1 Revisión de Moveit!
6.2 Movimiento espacial conjunto
Instalar moveit_commander en Python
sudo apt-get update
sudo apt-get install ros-melodic-moveit-commander
# 关节规划,输入6个关节角度(单位:弧度)
def move_j(self, joint_configuration=None,a=1,v=1):
# 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)
if joint_configuration==None:
joint_configuration = [0, -1.5707, 0, -1.5707, 0, 0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
self.arm.set_joint_value_target(joint_configuration)
rospy.loginfo("move_j:"+str(joint_configuration))
self.arm.go()
rospy.sleep(1)
# 空间规划,输入xyzRPY
def move_p(self, tool_configuration=None,a=1,v=1):
if tool_configuration==None:
tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
target_pose = PoseStamped()
target_pose.header.frame_id = self.reference_frame
target_pose.header.stamp = rospy.Time.now()
target_pose.pose.position.x = tool_configuration[0]
target_pose.pose.position.y = tool_configuration[1]
target_pose.pose.position.z = tool_configuration[2]
q = quaternion_from_euler(tool_configuration[3],tool_configuration[4],tool_configuration[5])
target_pose.pose.orientation.x = q[0]
target_pose.pose.orientation.y = q[1]
target_pose.pose.orientation.z = q[2]
target_pose.pose.orientation.w = q[3]
self.arm.set_start_state_to_current_state()
self.arm.set_pose_target(target_pose, self.end_effector_link)
rospy.loginfo("move_p:" + str(tool_configuration))
traj = self.arm.plan()
self.arm.execute(traj)
rospy.sleep(1)
6.3 Movimiento espacial cartesiano
# 空间直线运动,输入(x,y,z,R,P,Y,x2,y2,z2,R2,...)
# 默认仅执行一个点位,可以选择传入多个点位
def move_l(self, tool_configuration,waypoints_number=1,a=0.5,v=0.5):
if tool_configuration==None:
tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
# 设置路点
waypoints = []
for i in range(waypoints_number):
target_pose = PoseStamped()
target_pose.header.frame_id = self.reference_frame
target_pose.header.stamp = rospy.Time.now()
target_pose.pose.position.x = tool_configuration[6*i+0]
target_pose.pose.position.y = tool_configuration[6*i+1]
target_pose.pose.position.z = tool_configuration[6*i+2]
q = quaternion_from_euler(tool_configuration[6*i+3],tool_configuration[6*i+4],tool_configuration[6*i+5])
target_pose.pose.orientation.x = q[0]
target_pose.pose.orientation.y = q[1]
target_pose.pose.orientation.z = q[2]
target_pose.pose.orientation.w = q[3]
waypoints.append(target_pose.pose)
rospy.loginfo("move_l:" + str(tool_configuration))
self.arm.set_start_state_to_current_state()
fraction = 0.0 # 路径规划覆盖率
maxtries = 100 # 最大尝试规划次数
attempts = 0 # 已经尝试规划次数
# 设置机器臂当前的状态作为运动初始状态
self.arm.set_start_state_to_current_state()
# 尝试规划一条笛卡尔空间下的路径,依次通过所有路点
while fraction < 1.0 and attempts < maxtries:
(plan, fraction) = self.arm.compute_cartesian_path(
waypoints, # waypoint poses,路点列表
0.001, # eef_step,终端步进值
0.00, # jump_threshold,跳跃阈值
True) # avoid_collisions,避障规划
attempts += 1
if fraction == 1.0:
rospy.loginfo("Path computed successfully. Moving the arm.")
self.arm.execute(plan)
rospy.loginfo("Path execution complete.")
else:
rospy.loginfo(
"Path planning failed with only " + str(fraction) +
" success after " + str(maxtries) + " attempts.")
rospy.sleep(1)
6.4 Interactuando con el medio ambiente
# 在机械臂下方添加一个table,使得机械臂只能够在上半空间进行规划和运动
# 避免碰撞到下方的桌子等其他物体
def set_scene(self):
## set table
self.scene = PlanningSceneInterface()
self.scene_pub = rospy.Publisher('planning_scene', PlanningScene, queue_size=5)
self.colors = dict()
rospy.sleep(1)
table_id = 'table'
self.scene.remove_world_object(table_id)
rospy.sleep(1)
table_size = [2, 2, 0.01]
table_pose = PoseStamped()
table_pose.header.frame_id = self.reference_frame
table_pose.pose.position.x = 0.0
table_pose.pose.position.y = 0.0
table_pose.pose.position.z = -table_size[2]/2 -0.02
table_pose.pose.orientation.w = 1.0
self.scene.add_box(table_id, table_pose, table_size)
self.setColor(table_id, 0.5, 0.5, 0.5, 1.0)
self.sendColors()
7. Fundación Moveit (C++) para lograr la planificación de rutas con restricciones
8. Motion Planning - ¿Cómo elegir el algoritmo de planificación en Moveit?
8.1 Por qué es necesaria la planificación de rutas
Ø Evitar obstáculos: evitar colisiones con objetos estáticos cerca del brazo robótico, como mesas; evitar
colisiones con objetos dinámicos, como personas (que se acercan repentinamente)
Ø La tarea tiene requisitos en la trayectoria del movimiento: con restricciones cinemáticas o dinámicas, como soldadura , Tome
un vaso lleno de agua , etc.
n Clasificación de planificación de ruta
Ø Basado en búsqueda, Dijkstra, A*, En cualquier momento A*, ARA*, D*
Ø Basado en muestreo, PRM, RRT, RRT-connect, RRT*, Kinodynamic-
RRT* (conforme a la dinámica), RRT en cualquier momento*, RRT informado*
Ø Algoritmos inteligentes como algoritmo genético, algoritmo de colonia de hormigas
Algoritmo de planificación de rutas basado en muestreo
Ø Conocimientos básicos: introducción completa: la solución se encontrará cuando el tiempo sea infinito;
Ø PRM: 1. Muestreo aleatorio primero n puntos para formar la Figura 2. Búsqueda basada en gráficos
Ø RRT: búsqueda rápida de árboles aleatorios, soluciones no óptimas, consulta cerca puede usar kdtree y otras estructuras de datos para
encontrar rápidamente el nodo más cercano en el tree
Ø RRT-connect: RRT extendido bidireccionalmente, se expande desde el inicio y el objetivo al mismo tiempo, la velocidad de búsqueda es relativamente
rápida, el algoritmo predeterminado de ros-moveit
Ø RRT*: se han realizado dos mejoras, una es cambiar las reglas para conectar nuevos nodos al árbol, y el otro es "podar" la operación del árbol
de búsqueda para acercarla a la ruta óptima real
8.2 Cómo elegir un algoritmo de planificación de rutas
- Rviz
- Moveit_setup_assistant
- en el programa
9. Evitación visual de obstáculos
9.1 Introducción
9.2 Demostración oficial
Ø Solo se necesita una entrada de nube de puntos/mapa de profundidad para generar un mapa ráster;
$ roslaunch moveit_tutorials obstacle_avoidance_demo.launch
Ø Los obstáculos cilíndricos se pueden generar a partir del mapa de cuadrícula
$ roslaunch moveit_tutorials detect_and_add_cylinder_collision_object_demo.launch
(Nota: al ejecutar esta declaración, debe cerrar el comando anterior)
Paquete de funciones:
https://github.com/ros-planning/moveit_tutorials
https://github.com/ros-planning/panda_moveit_config
9.3 Combate real
roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch
Pasos principales
Ø 1. Iniciar el programa camera ros
$ sudo apt-get install ros-melodic-realsense2-camera
$ sudo apt-get install ros-melodic-realsense2-description
$ roslaunch realsense2_camera demo_pointcloud.launch
Ø 2. Modifique el archivo de configuración de moveit
(1) Modifique point_cloud_topic de xxx_moveit_config/config/sensors_kinect_pointcloud.yaml para que sea
el tema publicado por la nube de puntos de su cámara
(2) o modifique image_topic de xxx_moveit_config/config/sensors_kinect_ depthmap.yaml
para que sea el tema publicado por su propia cámara mapa de profundidad
Ø 3 (Opcional) Modifique los parámetros visuales para evitar obstáculos, como la resolución de la cuadrícula octomap_resolución, etc.
Ø 4 (Opcional) Modifique los parámetros de la cámara, como la resolución, la frecuencia de actualización, etc.
Ø 5. Publique el pose de la cámara en relación con las coordenadas base del manipulador
<node pkg="tf2_ros" type="static_transform_publisher"
name="camera_to_robot" args="0.72032458 -0.21936176 0.90925255
0.98422218 0.0969083 -0.04779138 0.14011233 camera_color_optical_frame
world" />
roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch
Referencia https://blog.csdn.net/ssw_1990/article/details/104053041
Referencia https://blog.csdn.net/ssw_1990/article/details/104053041
10. ROS y aprendizaje profundo
10.1 Introducción
ROS-¡Muévete!
ROS-melodic以及之前版本Moveit!默认使用python2.7
ROS-noetic以及ROS2支持python3
Aprendizaje profundo
El aprendizaje profundo utiliza python3, y el aprendizaje profundo generalmente necesita configurar el entorno en un entorno virtual.¿Cómo
integrar el aprendizaje profundo en ROS?
10. 2 Combate real
n Coexistencia de ROS y Anaconda
Ø 1. Instalación de ROS con un clic
$ wget http://fishros.com/install -O fishros && bash fishros
Ø 2. Instalar anaconda
https://blog.csdn.net/KIK9973/article/details/118772450
Baidu busca el tutorial de instalación de anaconda correspondiente a la versión de ubuntu
Ø 3. Crear un entorno virtual en anaconda
conda create -n YOUR_ENV_NAME
pyhton=3.7
Ø 4. Instalar la librería ros en el entorno virtual
$ conda activate
$ pip install rospkg/rospy
Nota: Independientemente de si es un entorno virtual o no, siempre que rospkg esté instalado, podrá encontrar paquetes ros como rospy,
std_msgs, etc., para que se pueda realizar la comunicación de temas y la comunicación de servicios.
Encapsule la función moveit en un servidor (Clase 6 - Comunicación de servicio Moveit Basic-python/ros)
$ rosrun ur_planning moveitServer.py
Ø 6. Escriba un cliente en el guión en el entorno y conéctese con la función moveit a través de la comunicación del servicio
11. Realice una captura visual de 6 DOF basada en ROS-Moveit
11.1 Acaparamiento visual
- Captura de planos
Ø Conjunto de datos Cornell: 1035 imágenes RGBD, 8019 etiquetas
Ø Conjunto de datos Jacquard: 54K imágenes RGBD, 1,1 millones de etiquetas
Ø Algoritmo clásico de captura de planos: GGCNN[1], GRCNN[2],
Swin-Transformer[3] ] - Seis grados de libertad para capturar
el conjunto de datos GraspNet-1Billion
11. Diseño del marco del sistema
n Planificación de movimiento
Ø Función: Llegar a
la posición y actitud especificada por el algoritmo
Ø Planificación de ruta: Planificar una trayectoria sin colisiones desde la posición actual
hasta la posición esperada n Calibración mano-ojo Ø Función: Obtener la relación entre el sistema de coordenadas del robot y el sistema de coordenadas de la cámara Ø Efecto: Actualmente disponible Lograr error dentro de ± 5 mm
11. 3 Experimento de rastreo
n agarre [6] experimento de agarre de un solo objeto
Lista de elementos agarrados:
11 objetos en total: 1. Manzana 2. Plátano 3. Linterna 4. Béisbol 5. Cepillo para zapatos
6. Caja de bádminton 7. Radio 8. Limpiador de chaqueta de plumas
9. Pequeño Limpiador de zapatos blanco 10. Disco U 11. Mando a distancia
11.3 Experimento de rastreo
n Agarre[6] escena compleja experimento de agarre continuo
Ø Conclusión: en comparación con otros algoritmos, los resultados de predicción de la postura de agarre de agarre[6] son más precisos;
el agarre también se puede detectar para la mayoría de los objetos pequeños y objetos con el mismo color que el fondo Actitud , la robustez es más fuerte.
Ø Problemas existentes:
l Los objetos que son demasiado "planos" y de poca altura dificultan la detección de la postura de agarre
l Durante el proceso de agarre, pueden ocurrir colisiones con otros objetos