CoppeliaSim

CoppeliaSim


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')

Autor: FILIPE A. S. ROCHA

Publicado em 06 de outubro de 2026· Atualizado em 20 de outubro de 2026