Skip to main content

Lição 2: Construir e Testar o Projeto

Continuação da Construção do Projeto 

  • Agora, a condição da instrução if else necessita de ser definida. Para utilizar o Sensor de Distância para detetar castelos, pode ser utilizado o comando found_object . Adicione o comando found_object à condição. O seu projeto deve agora ter este aspeto:

    def main():
    	# O sensor de distância detecta um castelo?
    	
    	if front_distance.found_object():
    		# Castelo de colisão detectado por um
    		passe do sensor de distância
    		
    	else:
    		# Vire para encontrar um castelo usando o
    		passe do sensor de distância
  • Se o Sensor de Distância encontrar um objeto, o Robô de RV deve avançar para derrubar o castelo. Adicione um comando drive na ramificação 'if' da instrução if else e defina o parâmetro para impulsionar o robô VR. (Este comando deve substituir o 'passe'). 

    def main():
    	# O sensor de distância detecta um castelo?
    	
    	if front_distance.found_object():
    		# Castelo de colisão detectado por um sensor de distância
    		drivetrain.drive(FORWARD)
    		
    	else:
    		# Vire para encontrar um castelo usando o
    		passe do sensor de distância
  • Quando o comando found_object reportar False, o ramo 'else' será executado, pelo que o Robot VR precisará de se virar para encontrar um castelo no Playground. Adicione um comando turn dentro da ramificação 'else' e defina os parâmetros para virar o robô VR para a direita. 

    def main():
    	# O sensor de distância detecta um castelo?
    	
    	if front_distance.found_object():
    		# Castelo de colisão detectado por um sensor de
    		distância 		drivetrain.drive (FORWARD)
    		
    	else:
    		# Vire para encontrar um castelo usando o sensor de distância
    		drivetrain.turn(RIGHT)

Para sua informação

O ramo 'else' da instrução if else funciona apenas num projeto como parte de uma instrução if else . Embora possa ter uma instrução if independente, não existe uma instrução 'else' no VEXcode VR Python. A ramificação 'else' é executada quando a condição da ramificação 'if' não é atendida. Sem uma condição definida (a ramificação 'if'), a ramificação 'else' nunca seria executada. Três trechos de código demonstrando instruções condicionais em Python, cada um apresentando uma instrução if com uma condição seguida pela palavra-chave pass. Os dois primeiros trechos têm marcas de verificação verdes acima deles, indicando o uso correto. O primeiro snippet inclui apenas uma instrução if, enquanto o segundo inclui uma instrução if e uma else com a palavra-chave pass em cada uma. O terceiro trecho, marcado com uma cruz vermelha, consiste apenas em uma instrução else com pass, indicando uso incorreto, pois uma instrução else deve seguir uma instrução if.

Adicionar um Loop e Testar o Projeto

  • Antes do projeto ser testado, mais um comando precisa ser adicionado. As instruções if else verificarão a condição apenas uma vez antes de passar para o próximo comando fora da instrução. Na Unidade 7, foi adicionado um loop infinito enquanto ao projeto para instruir o robô VR a verificar repetidamente a condição do sensor de olho para baixo. Para garantir que a condição do sensor de distância está a ser verificada repetidamente, arraste ou digite um ciclo infinito while e, em seguida, copie a instrução if else dentro do ciclo infinito enquanto. O seu projeto deve agora ter este aspeto:
    • Lembre-se de estar atento à indentação ao copiar e colar comandos em um loop, para que o projeto funcione como pretendido quando for executado. 

      def main():
      
      	while True:
      		# O sensor de distância detecta um castelo?
      	
      		if front_distance.found_object():
      			# Castelo de colisão detectado por um sensor de
      			distância 			drivetrain.drive (FORWARD)
      		
      		else:
      			# Vire para encontrar um castelo usando o sensor de
      			distância 			drivetrain.turn (RIGHT)
      		
      		wait(5, MSEC)
  • Abra a janela do playground se ainda não estiver aberta. Certifique-se de que o Dynamic Castle Crasher Playground abre e execute o projeto. Uma vista de cima para baixo do Parque Infantil Dynamic Castle Crasher mostrando que apenas alguns dos castelos foram derrubados. O Robô VR está no canto superior direito do playground após o seu movimento ao redor do playground.
  • Depois que o Robô de RV derrubar pelo menos dois castelos, recarregue o Playground e execute o projeto em outro layout do Dynamic Castle Crasher Playground. Uma vista de cima para baixo do Dynamic Castle Crasher com a interface do playground. O botão de reinicialização no canto inferior esquerdo da interface do playground é destacado com uma caixa vermelha.
  • Em cada execução do projeto, o Robô de RV girará até que um castelo seja detectado pelo Sensor de Distância e, em seguida, dirigirá em direção a esse edifício para derrubá-lo.Uma vista angular do playground Dynamic Castle Crasher mostrando o robô VR empurrando um pedaço de um castelo sobre a linha de fronteira vermelha e para fora da borda do playground.
  • Durante a execução do projeto, o Robô de RV pode empurrar uma peça do castelo até a borda e cair do Playground. Isto acontece porque o comando found_object ainda está a informar que existe um objeto à frente do robô VR. Quando este comando relata Verdadeiro, o Robô VR avança, levando o Robô VR a cair do Playground.

Fluxo do projeto com uma instrução If Else

A instrução if else é utilizada para que o robô VR possa tomar uma decisão. Se a condição booleana for True, os comandos dentro da ramificação 'if' serão executados. Se a condição booleana for False, os comandos dentro da ramificação 'else' serão executados.

Por exemplo, nesta iteração do Dynamic Castle Crasher Playground, quando o projeto é iniciado, o Sensor de Distância deteta objeto – a condição do comando found_object reporta True. Agora a branch 'if' do projeto será executada e o VR Robot avançará. O VR Robot irá saltar o ramo 'else' do projeto.À esquerda está o snippet de código atual do projeto. À direita está a vista de cima para baixo do playground Dynamic Castle Crasher com a interface do playground visível. A medição do Sensor de Distância na interface do playground lê 568 mm e é destacada com uma caixa vermelha. Isso mostra que o castelo no meio do playground está a 568 milímetros do VR Robot.

  • Observe que os dados do sensor de distância também são relatados no painel. Quando um objeto é detectado, o valor da distância será exibido.

No entanto, nesta iteração do Dynamic Castle Crasher Playground, quando o projeto é iniciado, o Sensor de Distância NÃO deteta um objeto – a condição do comando found_object reporta False. Agora o Robô VR irá saltar a ramificação 'if' do projeto, e a ramificação 'else' do projeto será executada, pelo que o Robô VR irá virar à direita.À esquerda está o snippet de código atual do projeto. À direita está a vista de cima para baixo do playground Dynamic Castle Crasher com a interface do playground visível. A medição do Sensor de Distância na interface do playground lê 1354 mm e é destacada com uma caixa vermelha. Isso mostra que o castelo no topo do playground está a 1354 milímetros do VR Robot.

  • Observe que o valor do Sensor de Distância no Painel é relatado como  > 3000 mm. O Sensor de Distância pode detectar objetos dentro de uma faixa de 3000 milímetros (mm), portanto, quando um objeto não é detectado, o valor é relatado como maior que (>) 3000 mm. 

Porque a instrução if else  é dentro de um ciclo infinito while , o projeto regressa ao topo do infinito while ciclo para verificar a condição da instrução if else repetidamente. Este ciclo continuará para sempre, instruindo o robô VR para verificar continuamente a condição if else centenas de vezes por segundo.This is the project's code snippet surrounded by an orange arrow that begins and ends on the while True: statement at the top of the code snippet. There is a note on the arrow that says Loops continuously, showing that anything nested in the while True loop will repeat forever.

  • Note que os comandos drive e turn dentro de if else Statement são comandos sem espera. Os comandos sem espera não interrompem o fluxo de um projeto enquanto estão a ser executados.  Um comportamento sem espera que é executado numa instrução if else (como 'avançar se o objeto for detetado') continuará enquanto a condição for verificada e só mudará quando a condição mudar.

Para sua informação

É utilizada uma instrução if else para garantir que apenas uma ramificação do projeto é executada quando a condição é verificada. Apenas uma instância ou condição pode ser verdadeira a qualquer momento. Isso torna o projeto mais eficiente.

O código do projeto Python com setas apontando para as instruções if e else. A parte superior das setas lê Verifica a condição do Sensor de Distância para mostrar o distance.found_object se a instrução verificar a condição. Se o objeto for detectado, o comando sob a instrução if será executado, mas se não houver nenhum objeto detectado, o comando sob a instrução else será executado.

Compare o projeto atual com o projeto criado na Unidade 7.  O projeto da Unidade 7 utiliza quatro instruções if .

O código do projeto da Unidade 7 com uma grande seta laranja ao redor de todo o código, começando e terminando na instrução while True. Uma nota na seta laranja diz que as instruções If contidas no loop infinito while são verificadas repetidamente. As setas verdes dentro da instrução while True mostram o fluxo do projeto, começando com instruções if individuais sobre se uma determinada cor é vista e o comportamento que deve ser feito de acordo, seja para fazer um comportamento ou passar para a próxima instrução if até o final, onde tudo volta mais uma vez.

Quando se executa um projeto com várias instruções if , pode ser possível que várias condições reportem Verdadeiro (ou Falso) à medida que o projeto executa os comandos no infinito while voltas . Conflitos como este podem fazer com que o projeto deixe de funcionar ou fique mais lento. 

Por outras palavras, múltiplas instruções if num projeto é como viajar por uma estrada com múltiplas rampas de saída. Dependendo de para onde está a tentar ir, virar-se-ia em lugares diferentes. Por exemplo,  se fosse para a escola, virava à esquerda; se fosse para a loja, virava à direita. Mas e se você não fosse à escola ou à loja? Ambas as condições relatariam Falso, e você permaneceria no caminho reto. Ou se fosse à escola e à loja? Ambas as condições relatariam Verdadeiro, mas você não pode virar em dois locais ao mesmo tempo. Um diagrama que mostra uma intersecção cinza em forma de T com três setas direcionais - uma apontando para a esquerda, uma apontando para cima e uma apontando para a direita. No centro do cruzamento está um robô de RV. À direita do diagrama estão duas declarações condicionais em formato de código: se for para a escola: Vire à esquerda e se for para a loja: Vire à direita. As instruções if são escritas em texto preto e azul, com if em azul e as instruções direcionais em azul.

 

Para continuar a analogia, uma afirmação if else é como viajar para uma bifurcação na estrada – obriga-o a tomar uma decisão. Se estiver indo para a escola, vire à esquerda; caso contrário, vire à direita. Não importa para onde vai, vira à esquerda ou à direita. Usar uma instrução if else evitaria bugs como os anteriores, porque o obrigaria a tomar uma decisão, porque apenas uma condição pode ser Verdadeira num determinado momento.A diagram showing a gray Y-shaped intersection with two directional paths - one leading left and one leading right. In the center of the intersection is the VR Robot. Above the diagram is code showing conditional statements in code format: if going to school: Turn left and else: Turn right. The if and else statements are written in black and blue text, with if and else in blue and the directional instructions in lighter blue.  

Perguntas

Selecione uma ligação abaixo para aceder ao questionário da aula.

Google Doc / .docx / .pdf