• Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Первое скинь ссылку на курс просто интересно.

    По теме:

    Полетный контроллер по сути тупой автомат имеющий на входе
    * GPS
    * датчик положения
    * возможно датчик скорости

    Пишется он на С причем это хардкорный С без этих ваших memoryallocation
    Как правило используется либо самописная система либо RTOS с адаптацией под задачи

    Итак что имеем верхнее ограничение сервомашинки 20 Мс - 500 раз в секунду ( на самом деле от 20 до 200)
    GPS - 10 -20 раз в секунду
    В этих пределах и молотит полетный контроллер, он намеренно сделан сильно тупым что бы отрабатывать очень быстро. Все остальные системы это приятные дополнения.
    Поиграться и не только можно скачав https://pixhawk.org/

    Отдельный вопрос это главные контроллеры. Тут языки высокого уровня, часто с использованием CUDA
    Ответ написан
    2 комментария
  • Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    yanchick
    @yanchick
    Программист и учёный из сурового города
    Дополню коллег выше. Еще неплохо бы изучить теорию бесплатформенных навигационных систем. Это основной датчик для БПЛА(хотя наверняка на тяжелых могут стоять и платформенные НС). Это затрагивает, хоть и чуток, теория гироскопов и акселерометров.
    Ответ написан
    Комментировать
  • Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    0. Направление не новое и хорошо изученное.

    1. Зависит от того, какое именно ПО.
    Что-то пишется на Си, что-то на языках высокого уровня, а что-то реализуется на уровне железа (плис/fpga/asic)
    Для моделирования каких-то процессов может использоваться уже упомянутый матлаб, например.

    2. Изучать нужно теорию управления и физику, тк по сути всё управление моторами базируется на ней - а это по сути основная и единственная задача, как удержать дрон в воздухе, не сталкиваться с препятствиями при движении, а в случае отсутствия движения - оставаться на месте.
    По разработке - собственно Си для микроконтроллеров и verilog для железа. По хорошему ещё электронщиком нужно быть.
    Не сильно от обычной embedded разработки отличается, выходит.

    А на высоком уровне - там уже на конкретную задачу нужно смотреть. Где-то может даже ML и компьютерное зрение понадобится.
    Получается тоже не так уж много отличий от обычной разработки.
    Ответ написан
    Комментировать
  • Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    @AlexSku
    не буду отвечать из-за модератора
    Пример для моторов квадрокоптера на Матлабе.
    Ответ написан
    Комментировать
  • Как удалить первый элемент однонаправленного списка в с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    С односвязными списками сложно - надо знать предыдущий элемент, чтобы у него поменять ссылку на следующий через удаляемый элемент. Можно или поддерживать 2 указателя на 2 соседних элемента, или смореть на следующий элемент через next, пока у вас есть указатель на предыдущий к нему.

    Еще отдельная проблема с удалением первого элемента, потому что там менятся должна не ссылка next у предыдущего элемента, а ссылка на начало списка. Эту проблему можно решить по разному. Например, можно вместо указателя head держать один элемент списка без значения. Тогда указатель на начало списка будет менятся также как и любой другой. Фактически, в любом списке всегда будет один фиктивный элемент. Этот способ также предподчителен для работы с двусвязными списками. Тогда список как бы замыкается в кольцо и не надо разбирать отдельно ни случай первого, ни случай последнего элемента. Мне больше нравится другой метод - можно помнить не предыдущий элемент, а указатель-на-указатель, который надо будет поменять.

    node** prev_link = &head;
    node* cur = head;
    for  (node* cur = head; cur != nullptr; cur = cur->next) {
      if (cur->val == to_del) {
        *prev_link = cur->next;
        delete cur;
        break;
      }
      prev_link = &cur->next;
    }
    Ответ написан
    1 комментарий
  • Задача на строки в Си: как конкатенировать строки без библиотечных функций(старый вопрос удален)?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Как можно было сделать то же самое, но при помощи традиционной обработки массива?

    Там самая что ни на есть традиционнейшая обработка массивов - традиционней просто некуда. Запись вида a[b] imho - может быть показатель того, что автор еще не до конца понимает, как С работает с памятью.

    Вообще массив - это математическая абстракция. Сама по себе запись a[1] = 2 никакого особо смысла не имеет. А вот с точки зрения С - массив вещь вполне конкретная и указывает на конкретную ячейку памяти, с которой он начинается.

    И вот тут начинаетс самое интересное. Поскольку "массив" у нас - область памяти, то мы можем обьявить его любым типом. Приведем к типу структуры - будет массив структур, приведем к char - будет строка :)
    Ответ написан
    Комментировать
  • Задача на строки в Си: как конкатенировать строки без библиотечных функций(старый вопрос удален)?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    В общем решение задачи:
    Берете через strlen определяете сдлины строк A и B
    Выделяете массив длинной strlen(A) + strlen(B) + 1
    делаете mempcy строки A в новый массив с начала, затем memcpy строки B в новый со смешением на длинну строки A, добавляете в конец массива '\0'.

    К слову, в коде мне нельзя использовать никакие библиотечные функции, кроме strlen().


    И даже memcpy?
    Если прям нельзя библиотечные функции юзать - сделайте свой memcpy - это реально очень просто.
    Вообще тогда непонятно чего бы и strlen не запретить - его тоже реализовать не шибко сложно.
    Ответ написан
    Комментировать
  • Задача на строки в Си: как конкатенировать строки без библиотечных функций(старый вопрос удален)?

    @res2001
    Developer, ex-admin
    Как можно было сделать то же самое, но при помощи традиционной обработки массива?

    А что такого по вашей ссылке не традиционного в смысле обработки массива? Там вполне традиционные операции.
    Видимо вы привыкли, что обращение к элементам массива это arr[i]. Но это лишь один из вариантов.
    Вариант примененный в коде по ссылке - инкремент указателей - просто смещает указатель на следующий элемент массива. По идее это должно работать немного быстрее, чем arr[i].
    Кстати, принцип работы итераторов в C++ std как раз тот же самый, что использован тут. Так что можете считать, что dest и src это итераторы по строке :-)

    Если очень хочется, то можете переписать код с применением индексации. Ничего сложного в таком преобразовании кода нет.

    По ссылке, реализован аналог strcat, но эта функция (так же как и функция по ссылке) может приводить к выходам за пределы массива, т.к. тут вообще ни как не контролируется размеры массивов. Было бы интересно реализовать аналоги strncat или strncat_s.
    Ответ написан
    Комментировать
  • Как посчитать количество определенных символов в строке на Rust?

    ozkriff
    @ozkriff
    Rust э̶н̶т̶у̶з̶и̶а̶с̶т сектант, хобби игродел
    В постановке задачи есть важный нюанс: что считать символом?

    Если считать обычный встроенный char, то просто получаем .chars() итератор из строки, фильтруем и считаем:
    "12121".chars().filter(|&c| c == '2').count()

    Но надо понимать, что на строках с графемными кластерами (а именно их обычные пользователи обычно считают символами) такой код будет криво работать. Если это нам важно, то идем за lib.rs/unicode_segmentation и пользуемся его graphemes методом:
    "éaébé".graphemes(true).filter(|&g| g == "é").count()


    Песочница.
    Ответ написан
    1 комментарий