Newer
Older
turtlebot3_noetic / src / turtlebot3_autorace_2020 / turtlebot3_autorace_core / nodes / core_mode_decider
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import numpy as np
from enum import Enum
from std_msgs.msg import UInt8
class CoreModeDecider():
 def __init__(self):
  self.sub_traffic_sign = rospy.Subscriber('/detect/traffic_sign', UInt8, self.cbInvokedByTrafficSign, queue_size=1)
  self.sub_returned_mode = rospy.Subscriber('/core/returned_mode', UInt8, self.cbReturnedMode, queue_size=1)
  self.pub_decided_mode = rospy.Publisher('/core/decided_mode', UInt8, queue_size=1)
  self.InvokedObject = Enum('InvokedObject', 'traffic_sign traffic_light')
  self.TrafficSign = Enum('TrafficSign', 'divide stop parking tunnel')
  self.CurrentMode = Enum('CurrentMode', 'idle lane_following traffic_light parking_lot level_crossing tunnel intersection construction')
  self.fnInitMode()
 def cbInvokedByTrafficSign(self, traffic_sign_type_msg):
  self.fnDecideMode(self.InvokedObject.traffic_sign.value, traffic_sign_type_msg)
  rospy.loginfo("Traffic sign detected")
 def cbReturnedMode(self, mode):
  rospy.loginfo("Init Mode")
  self.fnInitMode()
 def fnInitMode(self):
  self.current_mode = self.CurrentMode.lane_following.value
  self.fnPublishMode()
 def fnDecideMode(self, invoked_object, msg_data):        # starts only when the traffic sign / traffic light is detected & current_mode is lane_following
  if self.current_mode == self.CurrentMode.lane_following.value:
   if invoked_object == self.InvokedObject.traffic_sign.value:   # Any Sign detected
    if msg_data.data == self.TrafficSign.stop.value:   # Stop Sign detected
     self.current_mode = self.CurrentMode.level_crossing.value
    elif msg_data.data == self.TrafficSign.parking.value:    # Parking Sign detected
     self.current_mode = self.CurrentMode.parking_lot.value
    elif msg_data.data == self.TrafficSign.tunnel.value:  # Tunnel Sign detected
     self.current_mode = self.CurrentMode.tunnel.value
   else:
    pass
   self.fnPublishMode()
  else:
   pass
 def fnPublishMode(self):
  decided_mode = UInt8()
  decided_mode.data = self.current_mode
  self.pub_decided_mode.publish(decided_mode)
 def main(self):
  rospy.spin()
if __name__ == '__main__':
 rospy.init_node('core_mode_decider')
 node = CoreModeDecider()
 node.main()