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 |
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()