Source code for tools.sim.lib.simulated_car

import cereal.messaging as messaging

from opendbc.can.packer import CANPacker
from opendbc.can.parser import CANParser
from openpilot.common.params import Params
from openpilot.selfdrive.boardd.boardd_api_impl import can_list_to_can_capnp
from openpilot.tools.sim.lib.common import SimulatorState
from panda.python import Panda


[docs] class SimulatedCar: """Simulates a honda civic 2022 (panda state + can messages) to OpenPilot""" packer = CANPacker("honda_civic_ex_2022_can_generated") def __init__(self): self.pm = messaging.PubMaster(['can', 'pandaStates']) self.sm = messaging.SubMaster(['carControl', 'controlsState', 'carParams']) self.cp = self.get_car_can_parser() self.idx = 0 self.params = Params() self.obd_multiplexing = False
[docs] @staticmethod def get_car_can_parser(): dbc_f = 'honda_civic_ex_2022_can_generated' checks = [ ] return CANParser(dbc_f, checks, 0)
[docs] def send_can_messages(self, simulator_state: SimulatorState): if not simulator_state.valid: return msg = [] # *** powertrain bus *** speed = simulator_state.speed * 3.6 # convert m/s to kph msg.append(self.packer.make_can_msg("ENGINE_DATA", 0, {"XMISSION_SPEED": speed})) msg.append(self.packer.make_can_msg("WHEEL_SPEEDS", 0, { "WHEEL_SPEED_FL": speed, "WHEEL_SPEED_FR": speed, "WHEEL_SPEED_RL": speed, "WHEEL_SPEED_RR": speed })) msg.append(self.packer.make_can_msg("SCM_BUTTONS", 0, {"CRUISE_BUTTONS": simulator_state.cruise_button})) msg.append(self.packer.make_can_msg("GEARBOX", 0, {"GEAR": 4, "GEAR_SHIFTER": 8})) msg.append(self.packer.make_can_msg("GAS_PEDAL_2", 0, {})) msg.append(self.packer.make_can_msg("SEATBELT_STATUS", 0, {"SEATBELT_DRIVER_LATCHED": 1})) msg.append(self.packer.make_can_msg("STEER_STATUS", 0, {"STEER_TORQUE_SENSOR": simulator_state.user_torque})) msg.append(self.packer.make_can_msg("STEERING_SENSORS", 0, {"STEER_ANGLE": simulator_state.steering_angle})) msg.append(self.packer.make_can_msg("VSA_STATUS", 0, {})) msg.append(self.packer.make_can_msg("STANDSTILL", 0, {"WHEELS_MOVING": 1 if simulator_state.speed >= 1.0 else 0})) msg.append(self.packer.make_can_msg("STEER_MOTOR_TORQUE", 0, {})) msg.append(self.packer.make_can_msg("EPB_STATUS", 0, {})) msg.append(self.packer.make_can_msg("DOORS_STATUS", 0, {})) msg.append(self.packer.make_can_msg("CRUISE_PARAMS", 0, {})) msg.append(self.packer.make_can_msg("CRUISE", 0, {})) msg.append(self.packer.make_can_msg("CRUISE_FAULT_STATUS", 0, {})) msg.append(self.packer.make_can_msg("SCM_FEEDBACK", 0, { "MAIN_ON": 1, "LEFT_BLINKER": simulator_state.left_blinker, "RIGHT_BLINKER": simulator_state.right_blinker })) msg.append(self.packer.make_can_msg("POWERTRAIN_DATA", 0, { "ACC_STATUS": int(simulator_state.is_engaged), "PEDAL_GAS": simulator_state.user_gas, "BRAKE_PRESSED": simulator_state.user_brake > 0 })) msg.append(self.packer.make_can_msg("CAR_SPEED", 0, {})) # *** cam bus *** msg.append(self.packer.make_can_msg("STEERING_CONTROL", 2, {})) msg.append(self.packer.make_can_msg("ACC_HUD", 2, {})) msg.append(self.packer.make_can_msg("LKAS_HUD", 2, {})) self.pm.send('can', can_list_to_can_capnp(msg))
[docs] def send_panda_state(self, simulator_state): self.sm.update(0) if self.params.get_bool("ObdMultiplexingEnabled") != self.obd_multiplexing: self.obd_multiplexing = not self.obd_multiplexing self.params.put_bool("ObdMultiplexingChanged", True) dat = messaging.new_message('pandaStates', 1) dat.valid = True dat.pandaStates[0] = { 'ignitionLine': simulator_state.ignition, 'pandaType': "blackPanda", 'controlsAllowed': True, 'safetyModel': 'hondaBosch', 'alternativeExperience': self.sm["carParams"].alternativeExperience, 'safetyParam': Panda.FLAG_HONDA_RADARLESS | Panda.FLAG_HONDA_BOSCH_LONG, } self.pm.send('pandaStates', dat)
[docs] def update(self, simulator_state: SimulatorState): self.send_can_messages(simulator_state) if self.idx % 50 == 0: # only send panda states at 2hz self.send_panda_state(simulator_state) self.idx += 1