Ultimamente, tenho lido muito sobre a Subsumption Architecture e existem algumas maneiras diferentes pelas quais as pessoas parecem advogar.
Por exemplo, algumas pessoas usam uma variável "flag" global para que uma tarefa assuma o controle. Outros usam endTimeSlice()
e permitem que o árbitro realmente escolha. E acho que isso está correto.
Eu tenho essa pequena seção do código do RobotC na qual estou trabalhando para uma linha após o robô, mas não tenho certeza se estou fazendo certo, pois atualmente o método track sempre substitui o método find. O fluxo correto deve ser aquele que localizar deve guiar o robô até a linha usando um caminho em espiral para encontrar a linha. Uma vez que a linha é encontrada, a trilha deve assumir.
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);
}
}
Acabei de usar alguns comentários aqui em vez do código real para mantê-lo breve. As minhas declarações if não são boas o suficiente como condições, porque quando o robô está fora de linha, track()
assume o controle. Isso se deve à declaração else na trilha? Se sim, como track()
executar curvas quando perde a linha sem retomar a forragem no início do programa?
fonte
StartTask
, são a prioridade da tarefa? 9 será a maior prioridade? Nesse caso, não deveriafind
ter mais prioridade do quetrack
? De fato, a condição defind
e aelse
condição detrack
são as mesmas. Então, como humano, se o valor do sensor for maior que o limite, o que você faria? Vá em espiral ou gire para ajustar a linha?Respostas:
Com a Subsumption Architecture, você deve projetar cuidadosamente seus comportamentos de forma que, se atribuir
T
prioridade à tarefan
,T
deve ser o que o robô deve fazer se todas as tarefas com prioridade mais alta do quen
ignoradas.Vamos ordenar suas tarefas de exemplo e depois descobrir uma maneira de implementá-las. Suas tarefas são
evade
,find
etrack
.Em geral, você deseja que o robô rastreie uma linha. No entanto, se não conseguir detectar a linha, tente encontrá-la. Acima de tudo, deve evitar obstáculos. Isso nos dá a seguinte ordem:
evade
find
track
O motivo
find
tem uma prioridade mais alta do quetrack
é que, como mencionei acima, você fariatrack
apenas seevade
efind
for desnecessário. Se você colocarfind
abaixotrack
, isso significa que você começará a rastrear se não houver obstáculos, mesmo se você não estiver na linha.Agora vamos dar uma olhada na sua implementação:
Lembre-se de que demos
find
uma prioridade mais alta. Portanto, se o robô não puder detectar olightSensor
, ele entrará em espiral tentando encontrar a linha.track
Quando isso acontece, entra em ação. Como você pode ver, aelse
condição detrack
nunca acontece.Enquanto isso funciona, o robô se move muito desajeitadamente. Na verdade, não há muito que você possa fazer, dada a atual versão do seu robô.
Embora eu já tenha respondido sua pergunta, mas aqui está uma simples melhoria no seu rastreamento de linha:
Em vez de um sensor de luz, use dois;
ls_left
els_right
. Usando (pelo menos) dois sensores, você pode entender se está totalmente fora da pista ou prestes a sair da pista. No segundo caso, você pode facilmente mudar para a direção correta e voltar à pista.Sua
find
tarefa é semelhante:Ou seja, você entra em espiral apenas se não sentir nada
Sua
track
tarefa agora se torna mais eficiente:Obviamente, com uma matriz de sensores de luz, você pode julgar melhor o quanto está saindo da pista (por exemplo, com qual ângulo) e decidir melhor como voltar à pista (por exemplo, com qual velocidade angular).
fonte
resposta curta; não, você realmente precisa fazer as coisas de maneira um pouco diferente.
resposta longa e incompleta; Deixe-me fornecer um código psuedo apropriado para robotC, que coloca você em um caminho melhor. Primeiro, não use tarefas - NÃO é para isso que servem as tarefas robotC. Eles podem ser feitos para funcionar, talvez, talvez não (e você precisa de algumas alterações para tentar).
há algumas coisas aqui; prioridade se torna irrelevante. Por mais agradável que pareça ter tarefas no robotC com prioridades, elas não são uma boa opção para implementação de subsunção na minha experiência. Por razões como, as prioridades nem sempre são respeitadas, as tarefas não podem ser interrompidas (às vezes); portanto, quando ocorrer um evento de prioridade mais alta, ele não reagirá como o esperado, o robotC só recentemente se tornou reentrante, portanto, coisas como acessar um sensor de mais de uma tarefa pode ser arriscada (problemas de tempo de I2C) e, em alguns casos, não é (sensores pesquisados automaticamente).
Você pode adicionar sua própria implementação de prioridade ao loop acima à medida que as coisas funcionam, mas isso realmente não é necessário para iniciar.
O seu comentário "// box the obstruction" descreve um comportamento balístico. Isso é um pouco complicado de implementar usando o multitarefa. O loop simples que usei torna muito mais fácil e melhor para iniciantes / aprendizado.
A outra coisa com que vou deixar você é que a subsunção, apesar de organizada e apropriada para muitas coisas, não é uma boa maneira de implementar o que é melhor feito tradicionalmente. De fato, a parte 'evade' pode ser um bom candidato à subsunção, mas honestamente sua outra tarefa deve ser chamada 'GoOnAboutYourBusiness'. Digo isso porque você provavelmente não deseja mudar de pesquisar para seguir com subsunção. Lidar com aqueles com loops de programação tradicionais. Com um único sensor, - a luz é mais escura ou mais clara do que era no último loop? se ficar mais escuro (assumindo a linha preta), continue girando na mesma direção; se ficar mais claro, vire para o outro lado; se permaneceu o mesmo, siga em frente. Você provavelmente precisará adicionar um PID e usar uma curva de direção em vez de virar à esquerda e à direita para ficar mais suave.
E sim, vários sensores ajudam. http://www.mindsensors.com/ - sim, atualmente sou eu no filme (11/10/2012)
Atualização: código real
Vou tentar isso daqui a pouco, mas ele compila e ilustra o que escrevi acima:
fonte