enunciado.tex 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. % --------------------------------------------------------------
  2. % This is all preamble stuff that you don't have to worry about.
  3. % Head down to where it says "Start here"
  4. % --------------------------------------------------------------
  5. \documentclass[11pt, a4paper]{scrartcl}
  6. \usepackage{tabularx}
  7. %encoding
  8. %--------------------------------------
  9. \usepackage[utf8]{inputenc}
  10. \usepackage[T1]{fontenc}
  11. %--------------------------------------
  12. %Portuguese-specific commands
  13. %--------------------------------------
  14. \usepackage[portuguese]{babel}
  15. %--------------------------------------
  16. %Hyphenation rules
  17. %--------------------------------------
  18. \usepackage{hyphenat}
  19. \usepackage{graphicx}
  20. %--------------------------------------
  21. %\newcommand*{\ENTREGA{}}
  22. \begin{document}
  23. \title{RASCUNHO Projeto 6}%replace X with the appropriate number
  24. \author{MAC0318 Introdução à Programação de Robôs Móveis}
  25. \vspace*{-3cm}
  26. {\let\newpage\relax\maketitle}
  27. \section{Objetivo}
  28. Nesse exercício de programação vocês deverão montar um robô que brinque de pega-pega.
  29. O objetivo é que o seu robô seja o menos pego, ou seja, que o número total de vezes que ele
  30. foi pego seja o menor entre todos.
  31. \section{Regras}
  32. Haverá um campo com diversos robôs (no mínimo dois). Em qualquer momento de jogo haverá apenas um pegador.
  33. Ao iniciar o seu programa você será informado das dimensões do campo e das linhas que descrevem seus obstáculos. Você não deve invadir essas linhas e nem sair fora do campo. Caso uma dessas linhas senha ultrapassada, você deve ficar parado 5 segundos como penalidade.
  34. Sempre que alguém for pego, deve ficar parado 5 segundos (tempo existentes para que os outros fujam). Se o seu robô esperar esses 5 segundos, você será penalizado.
  35. No campo de pega-pega não haverá paredes. Cabe a você manter o seu robô dentro do mesmo.
  36. \section{Funcionamento}
  37. Todos robôs terão um identificador visual que contêm um id único. Esse marcador deve estar posicionado de modo que ele fique paralelo ao chão. Não pode estar amassado ou dobrado.
  38. Haverá uma câmera conectada a um computador. Esse computador irá coordenar o jogo. Ele observará se todas as regras estão sendo obedecidas e informará aos participantes a posição de todos os robôs presentes no campo.
  39. Cada participante deve se conectar a esse servidor e controlar o seu robô. Vocês podem utilizar um computador convencional e controlar o robô via bluetooth ou podem utilizar uma Raspberry Pi conectada diretamente ao robô. No diretório \verb|player-lejos| você poderá ver um exemplo completo de como utilizar o bluetooth com o Lejos.
  40. \section{Penalidades}
  41. As penalidades acumuladas durante o jogo serão a seguintes, quem acumular menos ganha a competição:
  42. \begin{center}
  43. \begin{table}[h]
  44. \begin{tabularx}{\textwidth}{|c|X|}
  45. \hline
  46. Penalidade & Descrição \\ \hline
  47. 2 & Sair do campo seu robô será recolocado manualmente por uma pessoa na posição mais perto da que ele saiu dentro do campo. \\ \hline
  48. 1 & Ser pego \\\hline
  49. 5 & Não esperar os 5 segundos depois de ser pego \\\hline
  50. 5 & Não esperar os 5 segundos depois de passar por cima de um obstáculo. Após passar por cima de um obstáculo e esperar 5 segundos, ele terá 2 segundos para sair do mesmo. \\
  51. \hline
  52. \end{tabularx}
  53. \end{table}
  54. \end{center}
  55. \section{Complicações}
  56. Felizmente, o a recepção dos dados da câmera e a identificação dos marcadores demandam um pouco de tempo. Esse atraso pode ser percebido executando o exemplo do \verb|player-camera|. Você deve encontrar uma solução para mitigar esse atraso.
  57. Você pode, por exemplo, diminuir a velocidade de reação dos do seu robô, assim a posição real dele estará mais próxima da informada pela câmera. Você também pode tentar prever o próximo estado que seu robô estrá depois de uma ordem de movimento.
  58. \section{Utilizando o servidor}
  59. Para se conectar ao servidor você deve instanciar um objeto do tipo \verb|TagClient|. Para isso, deve fornecer o endereço IP da máquina que o servidor está sendo executado e a porta da aplicação.
  60. Para se conectar ao servidor você deve utilizar \verb|client.info(id, xs, ys, xtag, ytag)|. Onde:
  61. \begin{itemize}
  62. \item \verb|id|, o número do marcador do seu robô. Se for um robô virtual, pode ser qualquer número inteiro.
  63. \item \verb|xs, ys|, as dimensões do robô.
  64. \item \verb|xtag, ytag|, posição do centro do marcador referente ao canto de trás esquerdo do robô. Veja a classe \verb|Robot|.
  65. \end{itemize}
  66. Esses valores são necessários para descrever o retângulo que está em torno do robô. Esse retângulo deve ser proporcional ao tamanho real do robô. Na figura 1 abaixo temos um exemplo de marcador. A direção do marcador é definida pelos três quadrados pretos em suas bordas.
  67. \begin{figure}
  68. \begin{center}
  69. \includegraphics[height=0.3\linewidth]{marker}
  70. \end{center}
  71. \caption{Note que a posição do marcador determina a orientação do robô. No marcador acima o robô está orientado para cima.}
  72. \end{figure}
  73. Você estará conectado no servidor em quanto a constante do objeto \verb|quit| estar no estado \verb|False|.
  74. Durante essa condição você pode perguntar sobre informações do campo, \verb|getFieldInfo()|. Perguntar se o jogo está pausado ou não \verb|getStatus()|. Pegar a informação de quem é o pegador atual, \verb|getTagInfo| (esse método retorna apenas o id dele e o tempo de fuga restante). Ou receber um vetor com as últimas posições informadas pelo servidor (\verb|getPosition()|). Nesse vetor haverá o id do robô, a sua posição e os valores \verb|xs|,\verb|ys|, \verb|xtag| e \verb|ytag|.
  75. Para ver um exemplo funcional do código veja o arquivo \verb|player-virtual|. Esse arquivo simula um jogador, no entanto o próprio código informa a posição do jogado. Você não deve fazer isso. Use como esqueleto do seu projeto o arquivo \verb|player-camera| ou o \verb|player-lejos|.
  76. Para iniciar o servidor vocês devem executar o código \verb|main.py|. Vocês podem rodar com a flag \verb|-n| para que não haja a necessidade de câmera. Essa função serve para vocês testarem. Note que quando não há câmera, não há o atraso do processamento.
  77. \section{Simulação}
  78. Para executar o simulador você primeiramente deve iniciar o servidor sem câmera. Para isso execute o seguinte comando:
  79. \begin{verbatim}
  80. python3 main.py -n
  81. \end{verbatim}
  82. Feito isso, o servidor vai ser iniciado e uma tela como a seguinte será mostrada:
  83. \begin{center}
  84. \includegraphics[height=0.5\linewidth]{ini}
  85. \end{center}
  86. Depois disso você deve conectar o se robô ao servidor. Já temos um exemplo de robô pronto em \verb|player-virtual|. Assim que o robô for conectado ele aparecerá na tela. Você pode conectar múltiplos robôs reais ou virtuais ao servidor, no entanto eles devem ter \verb|id|s diferentes.
  87. Para iniciar o jogo é necessário no servidor apertar a tecla \verb|s|. Para pausar \verb|p| e para sair \verb|q|. Assim que o jogo iniciar, o pegador ficará marcado de vermelho.
  88. \section{Tarefas}
  89. Para concluir esse EP você deve montar um robô que consiga jogar.
  90. Você pode implementar qualquer estratégia.
  91. \end{document}