Загрузка данных


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Clover Gazebo.

Z fix: navigate_target stacks z each step.
Solution: frame_id='map' with ABSOLUTE x,y,z every time.
  navigate(x=3, y=1, z=1.0, frame_id='map')  -> always 1 m, never stacks.

Origin map = marker 42 at takeoff.
"""

import rospy
from clover import srv
from clover.srv import SetLEDEffect
from std_srvs.srv import Trigger

Z = 1.0
SPD = 0.45

rospy.init_node('clover_autonomous_mission')
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
land = rospy.ServiceProxy('land', Trigger)
set_effect = rospy.ServiceProxy('led/set_effect', SetLEDEffect)


def led(r, g, b):
    try:
        set_effect(effect='fill', r=r, g=g, b=b)
    except rospy.ServiceException:
        pass
    rospy.sleep(0.8)


def go(x, y, t=5.5):
    navigate(x=x, y=y, z=Z, speed=SPD, frame_id='map')
    rospy.sleep(t)


def marker_xy(mid):
    row = mid // 7
    col = mid % 7
    return col * 1.0, (6 - row) * 1.0


def mid(a, b):
    xa, ya = marker_xy(a)
    xb, yb = marker_xy(b)
    return (xa + xb) / 2.0, (ya + yb) / 2.0


try:
    led(255, 255, 255)
    navigate(x=0, y=0, z=Z, speed=0.4, frame_id='body', auto_arm=True)
    rospy.sleep(8.0)

    x, y = marker_xy(44)
    go(x, y, 5.0)

    led(255, 0, 255)
    x, y = marker_xy(38)
    go(x, y, 6.0)
    rospy.sleep(2.0)

    led(255, 165, 0)
    x, y = mid(26, 33)
    go(x, y, 6.0)

    led(0, 255, 255)
    x, y = mid(19, 20)
    go(x, y, 6.0)

    led(128, 0, 255)
    x, y = marker_xy(12)
    go(x, y, 7.0)

    x, y = marker_xy(11)
    go(x, y, 5.0)

    led(255, 0, 0)
    x, y = marker_xy(17)
    go(x, y, 6.0)

    x, y = marker_xy(9)
    go(x, y, 5.0)

    led(255, 255, 0)
    x, y = marker_xy(8)
    go(x, y, 5.0)

    led(0, 255, 0)
    x, y = mid(14, 21)
    go(x, y, 6.0)

    led(0, 0, 139)
    x, y = mid(22, 23)
    go(x, y, 6.0)

    led(255, 0, 255)
    x, y = marker_xy(38)
    go(x, y, 7.0)

    x, y = marker_xy(42)
    go(x, y, 7.0)

    land()
    rospy.sleep(3.0)
    led(0, 0, 0)

except rospy.ROSInterruptException:
    pass
except KeyboardInterrupt:
    try:
        land()
        led(0, 0, 0)
    except rospy.ServiceException:
        pass