← Caderno de laboratório

Um volante em uma aba do navegador

Construímos nosso simulador de direção para navegador, Seat Time, com agentes de programação de inteligência artificial (IA). Nenhum deles tocou no nosso volante. Em 25 de outubro, nosso G923 aceitava comandos de força sem informar falhas. Não sentíamos nada. O aro apenas ficava solto.

Queríamos conectar o volante, abrir o Chrome e dirigir. Um volante reconhecido deveria ter direção e pedais mapeados sem um interrogatório de calibração. Começamos a enviar comandos clássicos de força da Logitech em 10 de outubro. Transformar o código em algo que nossas mãos pudessem avaliar levou bem mais tempo.

Anteriormente: Cada número ganha uma fonte.

O Chrome não enxergava nosso volante

O primeiro obstáculo veio antes do retorno de força, a força que o motor aplica ao volante. O diagnóstico nativo de gamepads do Chrome mostrava zero dispositivos. Era nosso G923 em modo PlayStation, no macOS. Os agentes criaram uma ferramenta de captura passiva e depois um decodificador de entrada via WebHID, uma interface do navegador para dispositivos. Precisávamos ver o que o volante enviava antes de interpretar os controles.

A especificação Gamepad define uma interface de navegador para controles de jogos. O WebHID oferece acesso a dispositivos que usam o protocolo Human Interface Device. Isso nos deu outra opção quando a interface de gamepads não bastou. O guia de WebHID do Chrome descreve a seleção do dispositivo, as mensagens recebidas e os comandos enviados.

Nosso decodificador precisava transformar essas mensagens em valores de direção e pedais. O retorno de força seguia o caminho inverso, com comandos dizendo quanto o motor deveria puxar. Ler uma mensagem de entrada não provava que a saída funcionava. Nenhum dos caminhos provava que dirigir seria convincente.

Os agentes testavam o código; só nossas mãos testavam a sensação

Mantivemos estados separados: Implementado, Testado com entrada sintética e Verificado no nosso volante. Mensagens sintéticas permitiam testar a decodificação e as mudanças de estado sem um dispositivo. Elas não diziam se o aro se movia. Um item de hardware não verificado continuava assim depois dos testes de código.

Até um valor padrão conhecido estava errado para esse dispositivo. A zona morta da direção, que ignora movimentos perto do centro, herdara os 5% usados para gamepads. No nosso volante de 900°, isso significava cerca de 22° a partir do centro antes de registrar direção. Escolhemos 0,2%. A mudança fazia sentido no código; dirigir ainda cabia a nós.

Nossos relatos viravam a próxima correção

Os pedais inicialmente mostravam 100% sem nossos pés sobre eles. O jogo também dizia que o acelerador não estava atribuído. Depois da detecção da embreagem, a seleção do menu podia avançar sozinha. Estávamos longe da conexão sem configuração que queríamos.

Os agentes adicionaram uma aba Debug administrativa com o botão Copy report. Depois a moveram para a tela Settings que realmente acessávamos. Podíamos dirigir, copiar o relatório e devolver algo mais útil que “continua errado”. O relatório ligava o que víamos aos valores recebidos pelo código.

Nossos pedais soltos marcavam +1, enquanto um eixo mantinha um zero desatualizado até o primeiro movimento. Isso explicava como um mapeamento plausível podia interpretar repouso como acionamento completo. Um relatório posterior confirmou o mapeamento de acelerador e freio no nosso volante. O ciclo ficou utilizável: nós fornecíamos a observação física, e os agentes faziam a próxima mudança.

“Muito solto” era um problema de relação de direção

Descrevemos a direção como “muito solta”. O jogo mapeava os 900° completos do aro para o esterçamento total de cada carro. No kart, a geometria escolhida exigia apenas 86° de batente a batente no aro. Estávamos girando cerca de dez vezes mais do que essa geometria pedia.

A correção definiu um limite de giro por carro. O kart usava ±43°, o Formula Hybrid ±145°, o Formula Club 1600 ±224° e o GT3 ±357°. Eram valores escolhidos para nossa simulação, não medições desses veículos. Ainda não tínhamos dirigido com essa correção no volante.

Limites escolhidos: kart ±43°, Formula Hybrid ±145°, Formula Club 1600 ±224° e GT3 ±357°, em um volante de ±450°.
O limite do carro, e não o curso total do volante, define a relação da direção.

A força chegava, mas ainda podia desaparecer

Nossos testes de pulso e sondagem finalmente moveram o aro do G923. Isso confirmou um caminho de saída, mas dirigir normalmente ainda tinha outros problemas. Começamos a seguir a força solicitada até o comando enviado. Contar os níveis finais tornou “fraco” um relato mais útil.

Usamos os comandos clássicos documentados no protocolo de retorno de força da Logitech. O driver comunitário new-lg4ff foi outra referência. No nosso mapeamento, a magnitude chegava a 127 níveis em cada direção. Essa é uma escala de comandos, não uma medição de torque nas nossas mãos.

A primeira perda estava na ordem das operações. Adicionávamos um piso de força mínima e depois o reduzíamos ao aplicar o teto. Uma carga típica virava cerca de ±5 de 127. A correção passou a mapear o resultado entre piso e teto, com mínimo escolhido de 0,08. Paramos de reduzir justamente o piso que deveria preservar forças pequenas.

A força passa pelo torque na direção, escala por carro, curva, piso e teto até 127 níveis em cada direção; as falhas ocorreram em etapas diferentes.
Corrigir uma etapa não provava que a próxima entregava força.

O teste funcionava; o jogo não enviava força

Outro relatório mostrava 38 envios, todos vindos do teste de força. Não havia registro de força enviada durante a condução. Mover o aro no diagnóstico não tinha ligado a condução à saída de força. Tínhamos comprovado a parte errada do caminho.

Os agentes transformaram o retorno de força em uma preferência On/Off salva. Com ela ligada, dirigir ativaria a saída automaticamente. O torque subiria ao longo de um segundo, em vez de chegar de uma vez. Naquele momento, a evidência no hardware ainda cobria o teste de saída, não o novo comportamento durante a condução.

Paramos de achatar a força do kart

Execuções sem hardware revelaram outra perda antes de o comando chegar ao volante. O torque de referência antigo do kart saturava quase toda a varredura de direção. Depois da saturação, cargas diferentes produziam o mesmo sinal máximo. Substituímos essa referência pelo pico de cada carro em uma varredura simulada de pista circular.

A saturação do kart caiu de 99% para 0% nessas execuções. Também introduzimos uma curva que aproximava a força do limite gradualmente. Com o teto baixo, o maior salto entre quadros caiu de 23–27 níveis para 11–12. Eram medições da simulação e do código de força, sem volante conectado.

O teto deixava pouco espaço para sinais de aderência

Escolhemos 250 Hz para o ciclo de saída, mas o teto ainda permitia apenas 0,2 da faixa total. Nosso relato continuava sendo “ainda muito fraco”. Escolhemos a faixa completa, usando os 2,3 N·m nominais do G923. Também reforçamos a ênfase no limite de aderência e os sinais de derrapagem. Por decisão nossa, pulamos os ensaios térmicos graduais propostos pelo estudo ao ir direto à força nominal completa.

A mudança combinada ampliou o sinal de limite de aderência de 2–5 para 20–39 níveis nos carros, exceto o kart. O kart passou de 1 para 9. No teste de aumento gradual do esterçamento, a queda de força por subesterço passou de 1–6 para 7–57 níveis. A exceção era o carro de rodas expostas: passou de 0 para 1, pois a força simulada quase não diminuía.

Essas exceções importam. Uma faixa de saída maior não criaria uma queda ausente na carga simulada da direção. Um comando maior tampouco provava que conseguiríamos interpretá-lo pelo volante. Os números nos davam algo específico para avaliar dirigindo.

Um quadro escondia os passos dentro dele

As missões tinham outra diferença: enviavam o torque do último passo da física, em vez da média do quadro. Os agentes corrigiram isso primeiro. Depois substituíram a média pela reprodução de cada passo da física de 400 Hz no ciclo de saída. O padrão escolhido para Smoothing foi 25%, equivalente a 5 ms.

A mudança buscava preservar variações de força ocorridas dentro de um quadro exibido. Ela não veio acompanhada de uma condução registrada no nosso G923. Missões, reprodução por passo e Smoothing continuavam na lista do que precisávamos sentir. Uma saída mais detalhada era um resultado de implementação, ainda não um veredito ao volante.

O que nossas mãos realmente confirmaram

Nossa primeira condução com força completa, em uma versão local de desenvolvimento, foi “bem até aqui”. Também relatamos que a força às vezes “escapa”. Suspeitamos da proteção para quando soltamos o volante, que reduz a força se o aro parece girar livremente. Não tínhamos confirmado esse diagnóstico.

O gatilho escolhido era uma velocidade do aro acima de 360°/s no sentido da força por mais de 150 ms. A proteção então limitava a força a 0,3 da faixa completa. Precisávamos de um registro do volante real para distinguir um corte esperado de um falso acionamento. Não havia esse registro.

Há relatos no volante para entrada, pedais e uma versão inicial do torque no jogo; testes de saída não são voltas dirigidas. Ajustes posteriores seguem sem uso real. O traço indica ausência de teste sintético registrado, inclusive para missões e reprodução passo a passo; não são resultados de um checklist de hardware concluído.
Testes sintéticos e nossos relatos no volante respondem a perguntas diferentes.

A troca de modo também continuava sem verificação. Nossa implementação seguia o byte de dispositivo no código de troca do driver comunitário. Ele diferia do valor no apêndice de modo PlayStation da Logitech. Não tínhamos executado a troca no hardware, e os testes de saída confirmados não estabelecem qual modo estava ativo.

Não tínhamos conectado um G29 nem uma base direct drive. A lista de testes supervisionados continuava sem resultados registrados. Ela pede que os testes comecem com o volante preso por grampos e o retorno de força desligado. O mapeamento de pedais e os testes que moveram o aro eram avanços reais, mas não uma declaração ampla de suporte. As conduções pendentes continuavam visíveis ao lado dos recursos implementados.

A seguir, entrar no jogo mais rápido

Finalmente conseguíamos contar onde a força desaparecia entre a direção simulada e o comando de saída. Queríamos que o volante nos dissesse quando os pneus perdiam aderência. Antes disso, outro problema precisava de atenção: quanto tempo o jogo demorava para carregar.

Abra o Seat Time; no Chrome, os controles de conexão do G923 ficam em Settings → Controls → Wheel.

A seguir: Rápido para quem chega pelo celular.

Notas e fontes

  • Medido — observações registradas no hardware: zero dispositivos no diagnóstico de gamepads do Chrome no macOS; pedais soltos em 100%; leituras de +1 e zero desatualizado; mapeamento corrigido; direção “muito solta”; aro solto apesar dos comandos aceitos; testes de pulso e sondagem com movimento; 38 envios apenas do teste; “ainda muito fraco”; e “bem até aqui” e “escapa” na versão local. São observações individuais, não uma lista completa de testes executados.
  • Valores escolhidos de projeto: zona morta de 5% → 0,2%; faixa de entrada de 900°; limites por carro de ±43°, ±145°, ±224° e ±357°; força mínima de 0,08; rampa de um segundo; saída de 250 Hz; teto de 0,2 → 1,0; reprodução dos passos de 400 Hz; Smoothing de 25% = 5 ms; proteção acima de 360°/s por mais de 150 ms, limitando a força a 0,3. A diferença de cerca de dez vezes do kart vem de 900° divididos por 86°.
  • Medido — sem hardware: saturação do kart de 99% → 0%; saltos entre quadros com teto baixo de 23–27 → 11–12 níveis; sinal de aderência de 2–5 → 20–39, exceto kart, de 1 → 9. No teste de esterçamento, quedas de 1–6 → 7–57, com rodas expostas em 0 → 1 separadamente. A comparação de faixa completa também alterou a ênfase de aderência e os sinais de derrapagem. São níveis de comando, não torque medido no volante nem prova de sensação.
  • Fato de fonte externa: a especificação Gamepad, o padrão WebHID e o guia do Chrome descrevem as interfaces do navegador. O protocolo da Logitech e o new-lg4ff são as referências de comandos. A página do G923 da Logitech informa os 2,3 N·m nominais, não uma medição da nossa unidade.
  • Nossa interpretação: nossos relatos viraram o ciclo de aceitação no hardware para os agentes; a proteção pode explicar a força que “escapa”. As conversões de torque do estudo pressupunham uma escala linear de 2,2 N·m, não confirmada no hardware. Por isso informamos níveis e usamos 2,3 N·m apenas como valor nominal.
  • Ainda não dirigido no hardware: limite de giro por carro, troca de modo, missões, reprodução por passo e Smoothing. Sem resultados de G29 ou direct drive, sem lista supervisionada concluída e sem resultados registrados de ensaios térmicos graduais. A decisão de força é parte da história do projeto, não uma recomendação de segurança.

Ferramentas de IA ajudaram na redação e tradução deste artigo. Logitech, G923 e G29 são marcas da Logitech; PlayStation é marca da Sony. O Seat Time não tem afiliação nem endosso da Logitech ou da Sony.

Continue lendo