Autor: Jesús Tamarit Domínguez Tutor: Federico Cuesta Rojo

Post on 24-Jul-2022

2 views 0 download

Transcript of Autor: Jesús Tamarit Domínguez Tutor: Federico Cuesta Rojo

Equation Chapter 1 Section 1

Autor: Jesús Tamarit Domínguez

Tutor: Federico Cuesta Rojo

Resumen

Abstract

Índice

Resumen 8

Índice 9

Índice de Figuras 10

1 Introducción 1

1.1 El Robot Andruino 2

1.2 Objetivos y Estructura de la memoria 3

2 Ros 5

2.1. Instalación de ROS 5

2.2 Estructura del espacio de trabajo en ROS 6

2.3 Estructura interna de ROS 9

2.4 Descripción SDF 10

2.4.1 Link 10

2.4.2 Joint 13

2.4.3 Plugins 15

2.4.4 Inercias 16

2.5 Otros comandos de ROS 18

2.5.1 Rostopic 18

2.5.2 Rosnode 18

2.5.3 rqt-graph 19

2.5.4 TF 20

2.5.5 RViz 21

3 Descripción y modelado del robot 23

3.1 OpenScad 23

3.2 Comandos Principales de OpenScad 24

3.3 Modelado de las piezas del robot Andruino 26

3.3.1 Base 27

3.3.2 Rueda Derecha 29

3.3.3 Rueda Izquierda 29

3.3.4 Rueda de Castor 30

3.3.5 Andruino y Sensores 30

3.3.6 Teléfono 31

3.3.7 Colisiones 32

4 Implementación del robot Andruino en ROS 35

4.1 Plugins utilizados en el robot 35

4.1.1 Plugin de la cámara 35

4.1.2 Plugin de los sensores de ultrasonidos 36

4.1.3 Plugin del sensor IMU 37

4.1.4 Plugin del movimiento 38

4.2 Estructura de los paquetes de código 40

4.2.1 Paquetes creados para el proyecto 40

4.2.2 Paquetes disponibles previamente 40

4.2.3 Metapaquetes disponibles previamente 41

4.3 Modelo en SDF 42

4.4 Control del Movimiento del robot 43

4.4.1 Seguimiento de Línea 45

4.4.2 Evitación de Obstáculos 47

5 Simulación del robot Andruino en Gazebo 49

5.1 El Simulador Gazebo 49

5.2 Simulación del robot Andruino 52

5.3 Simulación de varios robots a la vez 54

6 Desarrollos futuros y Conclusiones 57

Referencias 59

Glosario 60

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu

$(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-

latest.list'

& sudo apt-key adv --keyserver hkp://ha.pool.sks-

keyservers.net:80 --recv-key

421C365BD9FF1F717815A3895523BAEEB01FA116

$ sudo apt-get update

$ sudo apt-get install ros-melodic-desktop-full

$ source /opt/ros/melodic/setup.bash

$ mkdir -p ~/catkin_ws/src

$ cd ~/catkin_ws/

$ catkin_make

$ source devel/setup.bash

$ catkin_create_pkg nombre_paquete dependencias

& sudo apt-get install build-essential libtinyxml-dev libboost-

all-dev cmake mercurial pkg-config

& sudo apt-get install libsdformat2-dev

<link name='base'>

<pose>0 0 0.5 0 0 0</pose>

<visual name='visual_base'>

<geometry>

<mesh>

<uri>model://andruino_description/meshes/base.stl</uri>

<scale>0.01 0.01 0.01</scale>

</mesh>

</geometry>

<material>

<ambient>0.8 0 0 1.0</ambient>

<diffuse>0.8 0 0 1.0</diffuse>

</material>

</visual>

<collision name='collision_base'>

<geometry>

<mesh>

<uri>model://andruino_description/meshes/collision_base.stl

</uri>

<scale>0.01 0.01 0.01</scale>

</mesh>

</geometry>

</collision>

<surface>

<friction>

<ode>

<mu>0</mu>

<mu2>0</mu2>

<slip1>1.0</slip1>

<slip2>1.0</slip2>

</ode>

</friction>

</surface>

<inertial>

<mass>0.3</mass>

<inertia>

<ixx>2.423</ixx>

<ixy>0</ixy>

<ixz>0.255</ixz>

<iyy>3.557</iyy>

<iyz>0</iyz>

<izz>3.410</izz>

</inertia>

</inertial>

<sensor type="ray" name="hc_sr04_1">

<pose>0.4575 0.40 0.78 0 0.175 0.7854</pose>

<visualize>true</visualize>

<update_rate>30</update_rate>

<ray>

<scan>

<horizontal>

<samples>32</samples>

<resolution>1</resolution>

<min_angle>-0.3926991</min_angle>

<max_angle>0.3926991</max_angle>

</horizontal>

</scan>

<range>

<min>0.02</min>

<max>3</max>

<resolution>0.02</resolution>

</range>

<noise>

<mean>0.0</mean>

<stddev>0.02</stddev>

</noise>

</ray>

<plugin name="hc_sr04_1_plugin"

filename="libgazebo_ros_range.so">

<gaussianNoise>0.005</gaussianNoise>

<always_on>true</always_on>

<updateRate>30</updateRate>

<topicName>hc_sr04_1</topicName>

<frameName>hc_sr04_1</frameName>

<frameId>hc_sr04_1</frameId>

<fov>32</fov>

<radiation>ultrasound</radiation>

</plugin>

</sensor>

<joint type="revolute" name="rueda_izquierda_joint">

<pose>-0.56 -0.54 0.15 0 0 0</pose>

<axis>

<xyz>0 1 0</xyz>

<dynamics>

<damping>0.1</damping>

<friction>0.1</friction>

</dynamics>

</axis>

<parent>base</parent>

<child>rueda_izquierda</child>

<?xml version="1.0"?>

<model>

<name>Andruino</name>

<version>1.0</version>

<sdf version='1.4'>andruino.sdf</sdf>

<author>

<name>Jesus Tamarit Dominguez</name>

<email>jesustamarit@hotmail.com</email>

</author>

<description>

Robot Andruino usado para el TFG

</description>

</model>

<plugin name="camera_controller"

filename="libgazebo_ros_openni_kinect.so">

<pose>0.01 0 0 0 0 0</pose>

<alwaysOn>true</alwaysOn>

<updateRate>30.0</updateRate>

<cameraName>camera</cameraName>

<frameName>camera_link</frameName>

<imageTopicName>image</imageTopicName>

<depthImageTopicName>depth/image</depthImageTopicName>

<pointCloudTopicName>depth/points</pointCloudTopicName>

<cameraInfoTopicName>camera_info</cameraInfoTopicName>

<depthImageCameraInfoTopicName>depth/camera_info</depthImageCame

raInfoTopicName>

<pointCloudCutoff>0.4</pointCloudCutoff>

<hackBaseline>0.07</hackBaseline>

<distortionK1>0.0</distortionK1>

<distortionK2>0.0</distortionK2>

<distortionK3>0.0</distortionK3>

<distortionT1>0.0</distortionT1>

<distortionT2>0.0</distortionT2>

<CxPrime>0.0</CxPrime>

<Cx>0.0</Cx>

<Cy>0.0</Cy>

<focalLength>0.0</focalLength>

$ meshlab

& rostopic list

$ rosnode info rosout

$ rosrun rqt-graph rqt-graph

$ rosrun rqt_image_view rqt_image_view /camera/image

$ rosrun rqt-tf-tree rqt-tf-tree

$rosrun rviz rviz

$ roslaunch gazebo2rviz gazebo2rviz.launch

Nombre_variable = cantidad;

&fn = 100;

35

<plugin name="camera_controller"

filename="libgazebo_ros_openni_kinect.so">

<pose>0.01 0 0 0 0 0</pose>

<alwaysOn>true</alwaysOn>

<updateRate>30.0</updateRate>

<cameraName>camera</cameraName>

<frameName>camera_link</frameName>

<imageTopicName>image</imageTopicName>

<depthImageTopicName>depth/image</depthImageTopicName>

<pointCloudTopicName>depth/points</pointCloudTopicName>

<cameraInfoTopicName>camera_info</cameraInfoTopicName>

<depthImageCameraInfoTopicName>depth/camera_info

</depthImageCameraInfoTopicName>

<pointCloudCutoff>0.4</pointCloudCutoff>

<hackBaseline>0.07</hackBaseline>

<distortionK1>0.0</distortionK1>

<distortionK2>0.0</distortionK2>

<distortionK3>0.0</distortionK3>

<distortionT1>0.0</distortionT1>

<distortionT2>0.0</distortionT2>

<CxPrime>0.0</CxPrime>

<Cx>0.0</Cx>

<Cy>0.0</Cy>

<focalLength>0.0</focalLength>

</plugin>

<plugin name="hc_sr04_2_plugin"

filename="libgazebo_ros_range.so">

<gaussianNoise>0.005</gaussianNoise>

<always_on>true</always_on>

<updateRate>30</updateRate>

<topicName>hc_sr04_2</topicName>

<frameName>hc_sr04_2</frameName>

<frameId>hc_sr04_2</frameId>

<fov>32</fov>

<radiation>ultrasound</radiation>

</plugin>

<plugin name="gazebo_ros_imu_controller"

filename="libhector_gazebo_ros_imu.so">

<turnGravityOff>false</turnGravityOff>

<alwaysOn>true</alwaysOn>

<bodyName>IMU_link</bodyName>

<frameName>IMU_link</frameName>

<frameId>IMU_link</frameId>

<topicName>imu</topicName>

<serviceName>imu_service</serviceName>

<gaussianNoise>0.0</gaussianNoise>

<rpyOffsets>0 0 0</rpyOffsets>

<updateRate>30.0</updateRate>

</plugin>

<plugin name="differential_drive_controller"

filename="libgazebo_ros_diff_drive.so">

<alwaysOn>true</alwaysOn>

<updateRate>25.0</updateRate>

<leftJoint>rueda_izquierda_joint</leftJoint>

<rightJoint>rueda_derecha_joint</rightJoint>

<wheelSeparation>1.5</wheelSeparation>

<wheelDiameter>0.63</wheelDiameter>

<torque>5</torque>

<commandTopic>cmd_vel</commandTopic>

<odometryTopic>odom</odometryTopic>

<odometryFrame>odom</odometryFrame>

<robotBaseFrame>base_link</robotBaseFrame>

<rosDebugLevel>na</rosDebugLevel>

<publishWheelTF>false</publishWheelTF>

<publishOdomTF>true</publishOdomTF>

<publishWheelJointState>false</publishWheelJointState>

<wheelAcceleration>0</wheelAcceleration>

<wheelTorque>5</wheelTorque>

<odometrySource>1</odometrySource>

<publishTf>1</publishTf>

</plugin>

$ gz sdf -k andruino_description/sdf/andruino.sdf

$ rosrun pysdf sdf2urdf.py andruino.sdf andruino.urdf

$ urdf_to_graphiz andruino.urdf

𝐶𝑋 =𝑀10

𝑀00𝐶𝑌 =

𝑀01

𝑀00

𝐸𝑟𝑟𝑋 = 𝐶𝑋 −𝑊𝑖𝑑𝑡ℎ

2

𝑐𝑚𝑑. 𝑎𝑛𝑔𝑢𝑙𝑎𝑟. 𝑧 =𝐸𝑟𝑟𝑋1000

𝐸𝑟𝑟𝑌 = 𝐶𝑌 − 𝐶𝑌𝐶𝑜𝑚𝑝𝑙𝑒𝑡𝑜

𝑐𝑚𝑑. 𝑙𝑖𝑛𝑒𝑎𝑟. 𝑥 = 0.2 + 3 ∗𝐸𝑟𝑟𝑌1000

𝑐𝑚𝑑. 𝑎𝑛𝑔𝑢𝑙𝑎𝑟. 𝑧 = −0.1 ∗𝑑𝑖𝑠𝑡_𝑠𝑒𝑛𝑠𝑜𝑟_𝑑𝑒𝑟𝑒𝑐ℎ𝑎 − 𝑐𝑜𝑙𝑙𝑖𝑠𝑖𝑜𝑛𝑀𝑎𝑥

𝑐𝑜𝑙𝑙𝑖𝑠𝑖𝑜𝑛 − 𝑐𝑜𝑙𝑙𝑖𝑠𝑖𝑜𝑛𝑀𝑎𝑥

$ sudo sh -c 'echo "deb

http://packages.osrfoundation.org/gazebo/ubuntu-stable

`lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-

stable.list'

$ wget http://packages.osrfoundation.org/gazebo.key -O - | sudo

apt-key add –

$ sudo apt-get update

$ sudo apt-get install gazebo9

$ sudo apt-get install libgazebo9-dev

$ gazebo

$ roslaunch andruino_gazebo andruino_world_simple.launch

$ sudo nano ~/.ignition/fuel/config.yaml

$ source /devel/setup.bash

$ export GAZEBO_MODEL_PATH=${GAZEBO_MODEL_PATH}:

/home/kramertool/catkin_ws/src/

$ roslaunch andruino_gazebo andruino_world_circuito_deco.launch

$ roslaunch gazebo_multi_robot andruino.launch

$ rosrun gazebo_follower Follower_obstaculos andruino1

$ roslaunch gazebo_multi_robot robots.launch

$ rosrun gazebo_follower Follower_obstaculos nombre_robot

$ catkin_make