Pular para o conteúdo

TORCS – Instalação e criação de um bot simples

Nesse tutorial, abordarei como criar um bot simples para você colocá-lo correr no TORCS com você, ou contra você :D. Aqui farei uma abordagem breve sobre a instalação do jogo e tentarei nortear quem já soube que é possível construirmos um bot para correr no jogo mas não sabe como começar. Boa leitura.
ssssssssss edirlf
Hits: 9.582 Categoria: C/C++ Subcategoria: Módulos
  • Indicar
  • Impressora
  • Denunciar

Parte 4: Conhecendo e adicionando código no nosso carro

Bom, não vamos por a carroça na frente dos bois. Antes de começarmos efetivamente a inserir código no nosso carro precisamos entender um pouco como tudo funciona, quando nosso código começa a rodar e também alguns aspectos do nosso carro.

Existem algumas variáveis do nosso carro muito importantes nesse início. A maioria delas são de ponto flutuante e frequentemente vão do intervalo -1.0 até 1.0. Exemplo disso são:

//Controla a direção
car->ctrl.steer=-1.0; //Volante todo virado para a esquerda
car->ctrl.steer = 0; // Volante alinhado
car->ctrl.steer=1.0; // Volante todo virado para a direita

//Controla a aceleração
car->ctrl.accelCmd = 0; //Sem aceleração
car->ctrl.accelCmd = 1.0; // Aceleração total

car->ctrl.breakCmd=0; // Freios não pressionado
car->ctrl.breakCmd=1.0; // Freios totalmente pressionados

car->ctrl.gear = -1; //Marcha ré
car->ctrl.gear = 0; //Neutro
car->ctrl.gear = 1; //1ª Marcha
...
car->ctrl.gear = 6; // 6ª Marcha

O Torcs, a cada 0.02 segundos faz uma chamada à função abaixo para guiar o seu carro. Ou seja, conforme a situação do seu carro no momento, aqui é que você definirá qual decisão tomar: mudança de marcha, de aceleração, acionar freios, direção, etc;

static void drive(int index, tCarElt* car, tSituation *s) {

    memset(&car->ctrl, 0, sizeof(tCarCtrl));   

    /* É nessa área que inserimos nosso código */

}

Conforme vimos acima, é nessa função que inserimos o código para guiar nosso carro. Mas para guiarmos nosso carro na pista precisamos saber em primeiro lugar como acessar informações sobre ele, por exemplo, em que parte da pista ele está, em que ângulo está em relação à pista, qual o nível de aceleração atual, de freio, qual marcha, se ele não está contra uma parede bloqueado, etc.. Abaixo seguem algumas informações úteis:

// Calcula a tangente do ângulo do segmento atual (útil para se calcular o nível certo do volante para curvas, veremos a frente)
RtTrackSideTgAngleL(&(car->_trkPos))

Obs: A pista do torcs é dividida em segmentos, os quais podem ser retas ou curvas. A função acima é usada bastante para calcular a tangente do ângulo do segmento atual. No caso de curva o resultado usamos ela juntamente com o ângulo do carro na pista para calcular o quanto nós devemos virar e para qual lado.

//Ângulo do carro em relação à pista
car->_yaw

//A distância do carro para o meio da pista é (em metros):
car->_trkPos.toMiddle  // (+ para esquerda, - para direita)

//Para definir o ângulo inicial do carro...
angle = RtTrackSideTgAngleL(&(car->_trkPos)) – car->_yaw;

// Agora normalizamos o ângulo para o intervalo -PI até +PI.
NORM_PI_PI(angle);

// Aqui conseguimos o novo valor a ser aplicado às rodas com o objetivo de manter o carro no meio da pista.
angle -= SC*car->_trkPos.toMiddle/car->_trkPos.seg->width;

Como pode ver abaixo car->ctrl.steer recebe o novo ângulo, mudando a cada chamada de função o nível de inclinação das rodas para corrigir o traçado. O restante está comentado no código.

static void  drive(int index, tCarElt* car, tSituation *s) {

    memset(&car->ctrl, 0, sizeof(tCarCtrl));
    
    float angle;
    const float SC = 1.0;

    angle = RtTrackSideTgAngleL(&(car->_trkPos)) - car->_yaw;
    NORM_PI_PI(angle); // put the angle back in the range from -PI to PI
    angle -= SC*car->_trkPos.toMiddle/car->_trkPos.seg->width;

    car->ctrl.steer = angle / car->_steerLock;
    car->ctrl.gear = 1; // coloca em primeira marcha
    car->ctrl.accelCmd = 0.3; // define 30 % de aceleração
    car->ctrl.brakeCmd = 0.0; // solta o freio
}

Substitua a função drive do seu arquivo nome_do_meu_carro.cpp por esta acima. Em seguida salve o arquivo e execute:

# cd $TORCS_BASE/src/drivers/nome_do_nosso_carro
# make clean
# make
# make install


Rode o jogo novamente e veja seu carro andando. Não espere muito pois neste exemplo dada a simplicidade do código seu carro provavelmente não passará de 80 Km/h e também não trocará de marcha.

Experimente também definir car->ctrl.gear=3 e car->ctrl.accelCmd=1.0 e veja como seu carro sai fora da pista e empaca em algumas paredes, não se assuste, pra tudo há um jeito. E isso veremos na próxima página.

   1. Instalação
   2. Preparando o terreno
   3. Configurando o jogo para correr com nosso carro
   4. Conhecendo e adicionando código no nosso carro
   5. Detectando quando o carro fica preso em uma curva
   6. Considerações

Desinstalando todos os programas instalados a partir de uma data específica

Squid logando usuários em aplicações web

Gerenciando pacotes para C/C++ com Conan

Comando MAKE

Android NDK: Desmistificando o acesso a códigos nativos em C

Tutorial SDL

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.