Session 3
Warm-up Excercise
Reference solution
import rclpy
from rclpy.node import Node
from std_msgs.msg import ColorRGBA
class LedController(Node):
def __init__(self):
super().__init__("led_controller")
# /<namespace>/led/front_right/set std_msgs/msg/ColorRGBA
# Idea 1
# self.front_right_publisher = self.create_publisher(ColorRGBA, "led/front_right/set", 10)
# self.front_left_publisher = self.create_publisher(ColorRGBA, "led/front_left/set", 10)
# self.rear_right_publisher = self.create_publisher(ColorRGBA, "led/rear_right/set", 10)
# self.rear_left_publisher = self.create_publisher(ColorRGBA, "led/rear_left/set", 10)
# self.top_publisher = self.create_publisher(ColorRGBA, "led/top/set", 10)
# Idea 2
list_of_topics = [
"front_right",
"front_left",
"rear_right",
"rear_left",
"top"
]
self.entities = []
self.my_msg = ColorRGBA()
self.my_msg.r = 100.0
self.toggle = 0
for topic in list_of_topics:
self.entities.append(self.create_publisher(ColorRGBA, f"led/{topic}/set", 10))
self.create_timer(1, self.set_leds)
def set_leds(self):
print("Hello from callback")
if self.toggle == 0:
self.my_msg.r = 100.0
self.my_msg.a = 100.0
self.toggle = 1
elif self.toggle == 1:
self.my_msg.r = 100.0
self.my_msg.a = 0.0
self.toggle = 0
for entity in self.entities:
entity.publish(self.my_msg)
def main(args=None):
rclpy.init(args=args)
node = LedController()
rclpy.spin(node)
rclpy.try_shutdown()
if __name__ == "__main__":
main()
Services
Task - Turtle Controller
Create a ROS 2 node using python that publishes velocity commands to turtlesim and exposes two services to control motion.
Requeriments:
- Node name:
turtle_controller- Publisher:
- topics:
/turtle1/cmd_vel - type:
geometry_msgs/msg/Twist - rate: 10 Hz
- topics:
- Services:
/start: When called enable motion.- type:
std_srvs/srv/Trigger
- type:
/stop: When called disable motion.- type:
std_srvs/srv/Trigger
- type:
- Publisher: