В последнее время я много читал о Subsuration Architecture, и есть несколько разных способов, которыми люди, похоже, выступают.
Например, некоторые люди используют глобальную переменную «flag», чтобы взять задачу под контроль. Другие используют endTimeSlice()
и позволяют арбитру действительно выбирать. И я думаю, что это правильно.
У меня есть небольшой раздел кода RobotC, над которым я работаю для робота, следующего за линией, но я не уверен, что все делаю правильно, так как в настоящее время метод track всегда принимает метод find. Правильный поток должен быть таким: поиск должен направлять робота к линии, используя спиральную траекторию, чтобы найти линию. Как только линия найдена, трек должен вступить во владение.
task evade(){
if(SensorValue(forwardSonarSensor) > threshold){
//box the obstruction
}
}
task find(){
if(SensorValue(lightSensor) > threshold){
//spiral the robot
}
}
task track(){
if(SensorValue(lightSensor) < threshold){
//go straight
}else{
//execute turns to follow the line
}
}
task main(){
while(true){
StartTask(evade,9);
StartTask(track,8);
StartTask(find,7);
wait1Msec(250);
}
}
Я просто использовал некоторые комментарии здесь, а не фактический код, чтобы держать его кратким. Являются ли мои заявления if недостаточно хорошими в качестве условий, потому что, когда робот выключен, он track()
вступает во владение. Это связано с оператором else внутри трека? Если так, как track()
выполнять повороты, когда он теряет линию, не переходя от корма в начале программы?
источник
StartTask
, являются ли они приоритетом задачи? 9 будет наивысшим приоритетом? В таком случае не должноfind
быть больше приоритета, чемtrack
? На самом деле, состояниеfind
иelse
состояниеtrack
одинаковы. Итак, как человек, если бы значение датчика превышало пороговое значение, что бы вы сделали? Идти по спирали или повернуть, чтобы отрегулировать линию?Ответы:
С Subsume Architecture вы должны тщательно проектировать свое поведение таким образом, чтобы, если вы назначаете
T
приоритет задачиn
, то этоT
было то, что должен делать робот, если все задачи с более высоким приоритетомn
игнорируются.Давайте закажем ваши примеры задач, а затем выясним, как их реализовать. Ваши задачи
evade
,find
иtrack
.В общем, вы бы хотели, чтобы робот отслеживал линию. Однако, если он не может обнаружить линию, он должен попытаться найти ее. Прежде всего, он должен избегать препятствий. Это дает нам следующий порядок:
evade
find
track
Причина
find
имеет более высокий приоритет, чемtrack
, как я уже говорил выше, вы быtrack
только, еслиevade
иfind
не нужны. Если вы поставитеfind
нижеtrack
, это означает, что вы начнете отслеживать, если нет никаких препятствий, даже если вы не на линии.Теперь давайте посмотрим на вашу реализацию:
Помните, что мы дали
find
более высокий приоритет. Поэтому, если робот не может почувствоватьlightSensor
, он пойдет по спирали, пытаясь найти линию. Как только это произойдет,track
начнется. Как вы можете видеть,else
состояниеtrack
никогда не происходит.Пока это работает, робот будет двигаться очень неловко. На самом деле вы ничего не можете с этим поделать, учитывая текущую сборку вашего робота.
Хотя я уже ответил на ваш вопрос, но вот простое улучшение отслеживания вашей линии:
Вместо одного датчика освещенности используйте два;
ls_left
иls_right
. Используя (по крайней мере) два датчика, вы можете понять, находитесь ли вы полностью вне дорожки или собираетесь покинуть дорожку. Во втором случае вы можете легко повернуть в нужном направлении и вернуться на правильный путь.Ваша
find
задача похожа:То есть вы идете по спирали, только если вообще ничего не чувствуете
Ваша
track
задача теперь становится более эффективной:Очевидно, что с матрицей датчиков освещенности вы можете лучше судить о том, насколько плохо вы выходите из колеи (то есть с каким углом), и лучше решить, как вернуться на трассу (то есть с какой угловой скоростью).
источник
краткий ответ; нет, тебе действительно нужно делать что-то немного по-другому.
длинный неполный ответ; Позвольте мне дать вам некоторый код psuedo, подходящий для robotC, который поможет вам выбрать лучший путь. Во-первых, не используйте задачи - это НЕ то, для чего предназначены задачи robotC. Их можно заставить работать, а может, и нет (и вам нужно немало изменений, чтобы даже попробовать).
здесь есть пара вещей; приоритет становится неактуальным. Как бы хорошо ни казалось, что у robotC есть задачи с приоритетами, они, по моему опыту, не являются хорошим выбором для реализации подгруппы. По таким причинам, как приоритеты не всегда соблюдаются, задачи не могут быть прерваны (иногда), поэтому, когда происходит событие с более высоким приоритетом, оно не будет реагировать так, как вы ожидаете, robotC только недавно стал повторно входящим, поэтому такие вещи, как доступ к датчику от более чем одной задачи может быть рискованно (проблемы синхронизации I2C), а в некоторых случаях это не так (датчики автоматически опрашиваются).
Вы можете добавить свою собственную реализацию приоритетов в вышеупомянутый цикл, как только все заработает, но это действительно не нужно для запуска.
Ваш комментарий "// помечаю препятствие" описывает баллистическое поведение. Это немного сложно реализовать с помощью многозадачности. Простой цикл, который я использовал, делает его намного проще и лучше для начинающих / обучения.
Еще одна вещь, с которой я вас оставлю, - это то, что потребление, будучи аккуратным и подходящим для многих вещей, не является хорошим способом реализовать то, что лучше сделать традиционно. В самом деле, часть «уклониться» может быть хорошим кандидатом для включения в категорию, но, честно говоря, ваша другая задача должна называться «GoOnAboutYourBusiness». Я говорю это потому, что вы, вероятно, не хотите переходить от поиска к следующему с подпоправкой. Обработайте их с помощью традиционных циклов программирования. С одним датчиком, - воспринимается ли свет темнее или светлее, чем это было в прошлом цикле? если он стал темнее (предполагается черная линия), продолжайте поворачивать в том же направлении, если он стал светлее, поверните в другую сторону, если он остался прежним, идите прямо. Вам, вероятно, нужно добавить PID и использовать кривую поворота вместо того, чтобы просто поворачивать влево и вправо, чтобы быть более плавным.
И да, несколько датчиков помогают. http://www.mindsensors.com/ - да, это я в фильме в настоящее время (10/10/2012)
Обновление: актуальный код
Я попробую это через некоторое время, но это компилирует и иллюстрирует то, что я написал выше:
источник