Acta de reunión

Ubicación Bloque 19, 19-213
Fecha 2022-09-20
Hora 10:00 a.m
Asistentes Davinson Castaño, Joan Beltran, Joan Francisco Alvarado, Juan Pedro Cano, Maria Camila Maldonado, Maria Paula Balaguera, Miguel Castaño, Stefania Valencia

Puntos de la agenda

  1. Davinson presentó la aplicación Terminator
  2. Davinson presentó los codeshare donde estaremos trabajando para compartir los códigos de clase y realizar las actas
  3. Davinson presentó la librería random
  4. Davinson modificó el código para que la tortuga se moviera en 2 dimensiones
  5. Davinson creó el código cambiar el color de dibujo de la tortuga usando el servicio SetPen

Acciones a seguir

  • Los estudiantes harán uso de lo servicios adicionales de turtlesim para mover la tortuga dentro de un circulo. Usando turtlesim/srv/Kill, turtlesim/srv/SetPen, turtlesim/srv/Spawn, turtlesim/srv/TeleportAbsolute, turtlesim/srv/TeleportRelative
  • Usar turtlesim/srv/TeleportAbsolute para mover la tortuga fuera del centro.
  • Usar turtlesim/srv/Kill para desaparecer la tortuga turtle1 y usar turtlesim/srv/Spawn para crear otra tortuga "uno" fuera del centro.
  • Hacer rebotar la tortuga dentro de un circulo con centro (5.5,5.5) y radio 5, de forma ortogonal (como lo hicimos durante la sesión).
  • Hacer rebotar la tortuga dentro de un circulo con centro (5.5,5.5) y radio 5, de forma que parezca un rayo laser.

Adicionalmente

Se usaron los siguientes comandos en el terminal

cd ares_ws/
source install/setup.bash 

ros2 run sep13 rebote_x 
ros2 run turtlesim turtlesim_node --ros-args -p background_r:=0 -p background_g:=0  -p background_b:=0

ros2 interface --help
ros2 topic --help

ros2 topic info /turtle1/cmd_vel

ros2 interface show geometry_msgs/msg/Twist

colcon build && source install/setup.bash 

ros2 run sep13 rebote_xy
ros2 run sep13 rebote_color

ros2 node --help
ros2 node info /turtlesim 

ros2 interface --help
ros2 interface show turtlesim/srv/SetPen 
ros2 interface show turtlesim/srv/TeleportAbsolute 
ros2 interface show turtlesim/srv/TeleportRelative 

Se construyó el siguiente ejecutable en python para rebotar en XY y cambiar el color de lapiz de la tortuga en cada golpe.

import random
import rclpy
from rclpy.node import Node

from turtlesim.msg import Pose
from geometry_msgs.msg import Twist
from turtlesim.srv import SetPen

class Nodo(Node):

    def __init__(self):
        super().__init__('rebote')
        self.get_logger().info('Iniciamos Rebote X')

        # SERVICE CLIENT

        self.cli = self.create_client(SetPen, 'turtle1/set_pen')
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('Servicio no disponible, esperando ...')
        self.req = SetPen.Request()

        # TOPIC PUBLISHERS

        self.publisher_ = self.create_publisher(Twist, 'turtle1/cmd_vel', 1)

        # TOPIC SUBSCRIBERS

        self.pose_sub = self.create_subscription(Pose,'turtle1/pose',self.pose_callback,10)
        self.pose_sub  # prevent unused variable warning

        self.velx = 1+4*random.random()
        self.vely = 1+4*random.random()

        self.send_request(0,0,0)

    # SUBSCRIBER CALLBACK

    def pose_callback(self, msg):
        posx = msg.x
        golpeo = False
        if posx > 10: 
            golpeo = True
            self.get_logger().info('Golpeamos x=10')
            self.velx = - abs(self.velx)
        elif posx < 1:
            golpeo = True
            self.get_logger().info('Golpeamos x=1')
            self.velx = abs(self.velx)
        posy = msg.y
        if posy > 10: 
            golpeo = True
            self.get_logger().info('Golpeamos y=10')
            self.vely = - abs(self.vely)
        elif posy < 1:
            golpeo = True
            self.get_logger().info('Golpeamos y=1')
            self.vely = abs(self.vely)

        newmsg = Twist()
        newmsg.linear.x = self.velx
        newmsg.linear.y = self.vely

        self.publisher_.publish(newmsg)

        if golpeo:
            r = int(255*random.random())
            g = int(255*random.random())
            b = int(255*random.random())
            self.send_request(r,g,b)

    def send_request(self, r, g, b):
        self.req.r = r
        self.req.g = g
        self.req.b = b
        self.req.width = 1
        self.future = self.cli.call_async(self.req)
        # rclpy.spin_until_future_complete(self, self.future)
        # return self.future.result()

####################################################################
# No es necesario modificar lo que se presenta a continuación:
####################################################################

def main(args=None):        # Función main
    rclpy.init(args=args)   # Iniciamos la comunicacion con ROS2
    node = Nodo()       # Creamos el objeto nodo
    rclpy.spin(node)      # Ejectutamos el nodo en un loop
    node.destroy_node()     # Cuando salimos del nodo lo destruimos
    rclpy.shutdown()      # Cerrramos la comunicacion con ROS2

if __name__ == '__main__':    # Si ejecutamos el archivo de python
    main()            # Ejecutamos la funcion main()