The system of automatic unloading and loading of the drone (Part 1 – briefly)

The system of automatic unloading and loading of the drone (Part 1 – briefly)

The problem of unloading and loading cargo onto a drone without human intervention is the main problem of automating the delivery of cargo using drones. A key stage of delivery that requires human presence is the process of physically loading and unloading cargo onto the drone. But we have a solution!

There are many developments on this account, but they work either in conditions of ideal positioning (up to 2 cm), or cannot be stored for a long time in bad weather (for example, cardboard boxes).

One of the solutions to this problem could be the development of an automated system for loading and unloading cargo onto a drone. Such a system can be based on the use of our solution to this problem.

Construction

To begin with, we need to understand what we need (task):

  1. The drone must be able to “miss” up to 10 cm. (no one canceled the gusts of wind)

  2. The structure of the landing should not be flooded (Above ground/asphalt level)

  3. Fastening of the cargo must be reliable (we don’t want our parcel to fall on someone’s head)

At the beginning of the journey, we decided on the shape of the body and landing place, the shape of a truncated cone was chosen (Fig. 2), the task of this shape is that when the drone is deflected at a distance D (Fig. 2), the cargo module attached to the drone will “roll” to the center of the landing place.

Fig. 2 Landing place (blue color), Cargo module (green color)

In our implementation it looks like this:

Exterior view of the seat and cargo module attached to the wall near the customer’s window.

Accordingly, the cargo container acquired the following appearance:

Fig. 4 Cargo compartment

Fig. 5 The method of opening the cargo compartment

“Killed two birds with one stone” (task 1 and 2), we will go to the castle (no, it is still classified, unfortunately, we are still waiting for the final registration of the patent).

Programming

Now on to the drone used in this project, which is the Pioneer max from Geoscan. It took a lot of time to bring it to life. To begin with, we connected the servo drive (immediately pay attention that some pins are used by default and their use will not give a normal result (shakes, false alarms)). I will write more about this “dance with tambourines” in the future, but for now let’s get back to programming. Moreover, we implemented a fully autonomous flight!

Below are the programs for the operation of the servo drive, all the codes were compiled based on the documentation (Programming in Lua – Documentation Pioneer December update 2022 (geoscan.aero)), but the information there is not all working, so we attached our codes:

-----------------------------------Lua код--------------------------------------------
local uart = Uart.new(4, 57600) -- объявляем uart для общения с pyhon кодом
local servo_stat="o"    -- статус сервопривода(например 'o'(открыто),'c'(закрыто))
local rc = Sensors.rc     -- подключаем пульт

local inp = ''            -- переменная для хранения информации для отправки на Python
local rec=""            -- переменная для хранения ответа(для будущего применения)

local function rotate_servo_open() -- функция открытия сервопривода
    servo_stat="o"
end


local function rotate_servo_close() -- функция закрытия сервопривода
    servo_stat="c"
end


local function main()               -- цикл
    rc_chans = table.pack(rc())     -- получаем иинформацию с пульта
    if rc_chans[8] < -0.8 then      --открытие (канал посмотри на пульте)
        rotate_servo_open()
    elseif rc_chans[8] > 0.8 then   --закрытие (канал посмотри на пульте)
        rotate_servo_close()
    end
    inp = servo_stat..'\n' -- пусть разделитель '\n'
    uart:write(inp, #inp)  -- отправляем на Python
    rec = uart:read(20)    -- в скобка пишем сколько принимаем байт
end

t = Timer.new(0.08, main) --устанавливаем частоту цикла 
---!ВРЕМЯ СИНХРОНИЗАЦИИ ДОЛЖНО БЫТЬ ОДИНАКОВО НА LUA и PYTHON!

t:start() -- начинаем цикл

----------!!!КОВЫЧКИ ОДИНАРНЫЕ ОБЯЗАТЕЛЬНО, ИНАЧЕ РАБОТАТЬ НЕ БУДЕТ !!!---------------
####################################Python код########################################

import serial             # библиотека для общения
from time import sleep    # библиотека для синхронизации
import RPi.GPIO as GPIO   # библиотека для общения

ser = serial.Serial("/dev/ttyS0", 57600, timeout=5) # открываем порт, бездумно не меняй
GPIO.setmode(GPIO.BCM)    # объявляем для общения
GPIO.setup(25, GPIO.OUT)  # объявляем для общения
sg = GPIO.PWM(25, 50)     # объявляем сервопривод
sg.start(8.06)            # объявляем задаём начальный угол

servo_opened = True       # по умолчанию замок открыт


def uart_read():          # функция чтения с Lua
    data = ser.readline().decode().replace('\n', "") # читаем, разделяем, убираем мусор

    if ser.in_waiting > 20:      # чтобы не зависало, бездумно не меняй
        ser.reset_input_buffer() # чтобы не зависало, бездумно не меняй

    print('Read data: ') # вывод в терминал
    print(data)          # вывод в терминал

    return data

def uart_write(answer): # функция ответа для Lua
    ser.write(answer.encode()) # кодируем, пишем 
    print('UART writed') # вывод в терминал


def servo_control(event): # функция управления сервоприводом
    global servo_opened   # подключаем глобальные переменные
    global sg             # подключаем глобальные переменные

    if event == "c" and servo_opened: # закрываем серво если получили 'c'
        sg.ChangeDutyCycle(2.5)
        servo_opened = False
        print('closed')

    elif event == "o" and not (servo_opened): # открываем серво если получили 'o'
        sg.ChangeDutyCycle(8.06)
        servo_opened = True
        print('opened') # вывод в терминал


def auto_p_control(data):
    servo_event = data[0]

    servo_control(servo_event) # вызов функции для поворота сервопривода

    print("ANS : " + str(ans)) # вывод в терминал
    uart_write(ans)  # отправка данных на Lua
    sleep(0.08)  # синхронизация

while True: # бесконечный цикл
    uart_data = uart_read() # вызываем функцию чтения

    if uart_data != ['']:  #если прочитанные данные не пустые
        auto_p_control(uart_data) # вызываем функцию ответа

Let’s move on to the result for further consideration.

Related posts