예제 #1
0
def api_manual_drive():
    """API that publishes control messages to control the angle and throttle in
       manual drive mode.

    Returns:
        dict: Execution status if the API call was successful.
    """
    webserver_node = webserver_publisher_node.get_webserver_node()
    angle = request.json.get("angle")
    throttle = request.json.get("throttle")
    max_speed = request.json.get("max_speed")

    if angle is None:
        return api_fail("angle is required")
    if throttle is None:
        return api_fail("throttle is required")
    if max_speed is None:
        return api_fail("max_speed is required")

    if angle < -1.0 or angle > 1.0:
        return api_fail("angle out of range")
    if throttle < -1.0 or throttle > 1.0:
        return api_fail("throttle out of range")

    webserver_node.get_logger().info(f"Angle: {angle}  Throttle: {throttle}")

    # Create the servo message.
    msg = ServoCtrlMsg()
    # bound the throttle value based on the categories defined
    msg.angle = -1.0 * get_categorized_manual_angle(angle)
    categorized_throttle = get_categorized_manual_throttle(throttle)
    msg.throttle = -1.0 * get_rescaled_manual_speed(categorized_throttle,
                                                    max_speed)
    webserver_node.pub_manual_drive.publish(msg)
    return jsonify({"success": True})
def api_adjust_calibrating_wheels(cali_type):
    """API to call the service to publishes a message withPWM measurement to adjust
       wheels while calibrating.

    Args:
        cali_type (int): Calibration type identifying steering/throttle calibration.

    Returns:
        dict: Execution status if the API call was successful.
    """
    webserver_node = webserver_publisher_node.get_webserver_node()
    form_data = request.json
    if cali_type == "angle":
        angle = float(
            int(form_data["pwm"]) * PWM_ANGLE_CONVERSION + PWM_OFFSET)
        throttle = -1.0
    else:
        angle = -1.0
        throttle = float(
            int(form_data["pwm"]) * PWM_THROTTLE_CONVERSION + PWM_OFFSET)
    webserver_node.get_logger().info(f"Angle: {angle}  Throttle: {throttle}")
    msg = ServoCtrlMsg()
    msg.angle = angle
    msg.throttle = throttle
    webserver_node.pub_calibration_drive.publish(msg)
    return jsonify({"success": True})
    def inference_cb(self, inference_msg):
        """Call back for whenever inference data is received.

        Args:
            inference_msg (InferResultsArray): Message containing all relevant inference data.
        """
        servo = ServoCtrlMsg()
        self.process_inference_data(inference_msg, servo)
        self.auto_drive_publisher.publish(servo)
    def __init__(self, qos_profile):
        """Create a DeepracerOffroadNavigationNode.
        """
        super().__init__('deepracer_offroad_navigation_node')
        self.get_logger().info("deepracer_offroad_navigation_node started.")
        self.current_waypoint = 0

        # Double buffer to hold the input deltas in x and y from qr_detection_node.
        self.delta_buffer = utils.DoubleBuffer(clear_data_on_get=True)

        # Create subscription to detection deltas from qr_detection_node.
        self.detection_delta_subscriber = \
            self.create_subscription(DetectionDeltaMsg,
                                     constants.QR_DETECTION_DELTA_TOPIC,
                                     self.detection_delta_cb,
                                     qos_profile)

        # Creating publisher to publish action (angle and throttle).
        self.action_publisher = self.create_publisher(ServoCtrlMsg,
                                                      constants.ACTION_PUBLISH_TOPIC,
                                                      qos_profile)

        # Service to dynamically set MAX_SPEED_PCT.
        self.set_max_speed_service = self.create_service(SetMaxSpeedSrv,
                                                         constants.SET_MAX_SPEED_SERVICE_NAME,
                                                         self.set_max_speed_cb)

        # Initializing the msg to be published.
        msg = ServoCtrlMsg()
        msg.angle, msg.throttle = constants.ActionValues.DEFAULT, constants.ActionValues.DEFAULT

        self.lock = threading.Lock()
        # Default maximum speed percentage (updated as per request using service call).
        self.max_speed_pct = constants.MAX_SPEED_PCT

        # Create a background servo publish thread.
        self.stop_thread = False
        self.thread_initialized = False
        self.thread = threading.Thread(target=self.action_publish, args=(msg,))
        self.thread.start()
        self.thread_initialized = True
        self.get_logger().info(f"Waiting for input delta: {constants.QR_DETECTION_DELTA_TOPIC}")
예제 #5
0
    def __init__(self, qos_profile):
        """Create a RCNavigationNode.
        """
        super().__init__('rc_navigation_node')
        self.get_logger().info("rc_navigation_node started.")

        # Double buffer to hold the mouse flag from Mouse Detection.
        self.mouse_buffer = utils.DoubleBuffer(clear_data_on_get=True)

        # Create subscription to detection mouse from mouse_detection_node.
        self.mouse_detection_subscriber = \
            self.create_subscription(MouseDetectionMsg,
                                     constants.MOUSE_DETECTION_TOPIC,
                                     self.mouse_detection_cb,
                                     qos_profile)

        # Creating publisher to publish action (angle and throttle).
        self.action_publisher = self.create_publisher(
            ServoCtrlMsg, constants.ACTION_PUBLISH_TOPIC, qos_profile)

        # Initializing the msg to be published.
        msg = ServoCtrlMsg()
        msg.angle, msg.throttle = constants.ActionValues.DEFAULT, constants.ActionValues.DEFAULT

        self.lock = threading.Lock()
        # Default maximum speed percentage (updated as per request using service call).
        self.max_speed_pct = constants.MAX_SPEED_PCT

        # Create a background servo publish thread.
        self.stop_thread = False
        self.thread_initialized = False
        self.thread = threading.Thread(target=self.action_publish,
                                       args=(msg, ))
        self.thread.start()
        self.thread_initialized = True
        self.get_logger().info(
            f"Waiting for input mouse flag: {constants.MOUSE_DETECTION_TOPIC}")