Definição da matriz de inércia
O código para a definição de matriz de inércia e peso de shapes no CoppeliaSim é:
python
h = sim.getObject('/chassi_dyn')
sim.computeMassAndInertia(h, 1000) # densidade em kg/m³; retorna 1 se deu certo
sim.setShapeMass(h, 1.0) # depois ajusta para a massa real, em kg
CoppeliaSim API
A API do CoppeliaSim trás a referência de todas as funções que o módulo
sim possui e que podem ser executadas nos scripts do simulador.
A referência para a API é:CoppeliaSim - Regular API
Movimentação do robô
O código para movimentar o robô modelado utilizando o teclado é:
python
V_PASSO = 2.0 # incremento de velocidade linear a cada toque (rad/s na roda)
W_PASSO = 1.0 # incremento de giro a cada toque (rad/s na roda)
V_MAX = 10.0 # limite de velocidade das rodas (rad/s)
# Se uma roda girar ao contrário, troque o sinal correspondente para -1
SINAL_L = 1
SINAL_R = 1
# Códigos de tecla do CoppeliaSim
SETA_CIMA, SETA_BAIXO, SETA_ESQ, SETA_DIR = 2007, 2008, 2009, 2010
ESPACO = 32
def sysCall_init():
sim = require('sim')
self.roda_l = sim.getObject('/chassi/j_roda_l')
self.roda_r = sim.getObject('/chassi/j_roda_r')
self.v = 0.0 # avanço
self.w = 0.0 # giro (positivo = esquerda)
sim.addLog(sim.verbosity_scriptinfos,
'Teclado: setas ou WASD para acelerar/girar, espaco para parar.')
def sysCall_actuation():
# Lê todas as teclas pressionadas desde o último passo
while True:
msg, dados, _ = sim.getSimulatorMessage()
if msg == -1:
break
if msg != sim.message_keypress:
continue
tecla = dados[0]
if tecla in (SETA_CIMA, ord('w')):
self.v += V_PASSO
elif tecla in (SETA_BAIXO, ord('s')):
self.v -= V_PASSO
elif tecla in (SETA_ESQ, ord('a')):
self.w += W_PASSO
elif tecla in (SETA_DIR, ord('d')):
self.w -= W_PASSO
elif tecla == ESPACO:
self.v = 0.0
self.w = 0.0
# Cinemática diferencial: giro positivo acelera a roda direita
vel_l = max(-V_MAX, min(V_MAX, self.v - self.w))
vel_r = max(-V_MAX, min(V_MAX, self.v + self.w))
sim.setJointTargetVelocity(self.roda_l, SINAL_L * vel_l)
sim.setJointTargetVelocity(self.roda_r, SINAL_R * vel_r)
def sysCall_cleanup():
sim.setJointTargetVelocity(self.roda_l, 0)
sim.setJointTargetVelocity(self.roda_r, 0)
Código de sensoriamento
O código abaixo faz a leitura de um sensor de proximidade no simulador e converte a leitura para tensão, seguindo o padrão de um sensor sonar US-016.
python
import random
def sysCall_init():
sim = require('sim')
self.sensor = sim.getObject('..') # o próprio sensor
# Parâmetros do US-016
self.VCC = 5.0
self.US_MIN = 0.02
self.US_MAX = 3.0
self.dist = None # metros (None = nada detectado)
self.volts = 0.0 # saída analógica emulada
def sysCall_sensing():
res, dist, pt, obj, n = sim.readProximitySensor(self.sensor)
if res <= 0 or dist < self.US_MIN or dist > self.US_MAX:
self.dist = None
self.volts = 0.0
return
# Ruído: precisão ~ 0,3 cm + 1% (tratada como 2 sigma)
sigma = (0.003 + 0.01 * dist) / 2
d = min(max(dist + random.gauss(0, sigma), self.US_MIN), self.US_MAX)
self.dist = d
self.volts = (d * 100.0) * self.VCC / 512.0 # Vcc/512 por cm
# Printa no console o dado do sensor
sim.addLog(sim.verbosity_scriptinfos, f'us016_back: {d * 100:.1f} cm')