Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tools/sim: Implement MetaDrive simulator #27373

Closed
wants to merge 32 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
fae33d5
finish
jon-chuang Feb 17, 2023
f69eb53
minor
jon-chuang Feb 17, 2023
26ae348
merge-master
jon-chuang Feb 17, 2023
c42bd64
minor
jon-chuang Feb 17, 2023
fc3f642
minor
jon-chuang Feb 17, 2023
fdfebed
poetry
jon-chuang Feb 17, 2023
30079a7
integration test and fix ObdMultiplexing issue
jon-chuang Feb 17, 2023
e95c2bf
refactor
jon-chuang Feb 18, 2023
142a07e
refactor
jon-chuang Feb 18, 2023
1d07e5d
minor
jon-chuang Feb 18, 2023
9ce927c
minor
jon-chuang Feb 18, 2023
1899b41
dependencies
jon-chuang Feb 18, 2023
eaff9b3
default simlator is carla
jon-chuang Feb 18, 2023
1d7de6f
minor
jon-chuang Feb 18, 2023
d7afb14
Merge branch 'master' of https://github.com/commaai/openpilot into jo…
jon-chuang Feb 18, 2023
73c08b4
rename-for-pr
jon-chuang Feb 18, 2023
f8f9f21
minor
jon-chuang Feb 19, 2023
36370c7
minor
jon-chuang Feb 20, 2023
c5490e3
minor
jon-chuang Feb 20, 2023
d780e22
minor
jon-chuang Mar 6, 2023
681ae2c
undo
jon-chuang Mar 6, 2023
3e492f2
Merge branch 'master' of https://github.com/commaai/openpilot into jo…
jon-chuang Mar 6, 2023
b9123bd
done
jon-chuang Mar 6, 2023
cc44ad3
gym dep
jon-chuang Mar 6, 2023
995c1f5
lock
jon-chuang Mar 6, 2023
a3d1056
sim bridge unified integration test
jon-chuang Mar 6, 2023
086465c
empty
jon-chuang Mar 6, 2023
6217b96
calibrate and complex env
jon-chuang Mar 6, 2023
f5a83d2
rm unnec
jon-chuang Mar 6, 2023
a129edb
lint
jon-chuang Mar 6, 2023
b649709
Merge remote-tracking branch 'origin/master' into jon/monkey-patch-br…
jnewb1 Sep 7, 2023
52ea1c1
bump submodules
jnewb1 Sep 7, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file added tools/sim/bridge/__init__.py
Empty file.
115 changes: 115 additions & 0 deletions tools/sim/bridge/carla.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import math
from tools.sim.bridge.common import World, SimulatorBridge, Camerad, STEER_RATIO, W, H, gps_callback, imu_callback

class CarlaWorld(World):
def __init__(self, world, vehicle, camerad):
import carla # pylint: disable=import-error
self.world = world
self.vc = carla.VehicleControl(throttle=0, steer=0, brake=0, reverse=False)
self.vehicle = vehicle
self.max_steer_angle: float = vehicle.get_physics_control().wheels[0].max_steer_angle
self.camerad = camerad

def apply_controls(self, steer_sim, throttle_out, brake_out, _rk):
self.vc.throttle = throttle_out / 0.6
self.vc.steer = steer_sim
self.vc.brake = brake_out
self.vehicle.apply_control(self.vc)

def get_velocity(self):
self.vel = self.vehicle.get_velocity()
return self.vel

def get_speed(self) -> float:
return math.sqrt(self.vel.x ** 2 + self.vel.y ** 2 + self.vel.z ** 2) # in m/s

def get_steer_correction(self) -> float:
return self.max_steer_angle * STEER_RATIO * -1

def tick(self):
self.world.tick()

class CarlaBridge(SimulatorBridge):
TICKS_PER_FRAME = 5

def spawn_world(self):
camerad = Camerad()
import carla # pylint: disable=import-error
def connect_carla_client(host: str, port: int):
client = carla.Client(host, port)
client.set_timeout(5)
return client

client = connect_carla_client(self._args.host, self._args.port)
world = client.load_world(self._args.town)

settings = world.get_settings()
settings.synchronous_mode = True # Enables synchronous mode
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)

world.set_weather(carla.WeatherParameters.ClearSunset)

if not self._args.high_quality:
world.unload_map_layer(carla.MapLayer.Foliage)
world.unload_map_layer(carla.MapLayer.Buildings)
world.unload_map_layer(carla.MapLayer.ParkedVehicles)
world.unload_map_layer(carla.MapLayer.Props)
world.unload_map_layer(carla.MapLayer.StreetLights)
world.unload_map_layer(carla.MapLayer.Particles)

blueprint_library = world.get_blueprint_library()

world_map = world.get_map()

vehicle_bp = blueprint_library.filter('vehicle.tesla.*')[1]
vehicle_bp.set_attribute('role_name', 'hero')
spawn_points = world_map.get_spawn_points()
assert len(spawn_points) > self._args.num_selected_spawn_point, f'''No spawn point {self._args.num_selected_spawn_point}, try a value between 0 and
{len(spawn_points)} for this town.'''
spawn_point = spawn_points[self._args.num_selected_spawn_point]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
self._simulation_objects.append(vehicle)

# make tires less slippery
# wheel_control = carla.WheelPhysicsControl(tire_friction=5)
physics_control = vehicle.get_physics_control()
physics_control.mass = 2326
# physics_control.wheels = [wheel_control]*4
physics_control.torque_curve = [[20.0, 500.0], [5000.0, 500.0]]
physics_control.gear_switch_time = 0.0
vehicle.apply_physics_control(physics_control)

transform = carla.Transform(carla.Location(x=0.8, z=1.13))

def create_camera(fov, callback):
blueprint = blueprint_library.find('sensor.camera.rgb')
blueprint.set_attribute('image_size_x', str(W))
blueprint.set_attribute('image_size_y', str(H))
blueprint.set_attribute('fov', str(fov))
if not self._args.high_quality:
blueprint.set_attribute('enable_postprocess_effects', 'False')
camera = world.spawn_actor(blueprint, transform, attach_to=vehicle)
camera.listen(callback)
return camera

if self._args.dual_camera:
road_camera = create_camera(fov=40, callback=camerad.cam_callback_road)
self._simulation_objects.append(road_camera)

road_wide_camera = create_camera(fov=120, callback=camerad.cam_callback_wide_road) # fov bigger than 120 shows unwanted artifacts
self._simulation_objects.append(road_wide_camera)

# re-enable IMU
imu_bp = blueprint_library.find('sensor.other.imu')
imu_bp.set_attribute('sensor_tick', '0.01')
imu = world.spawn_actor(imu_bp, transform, attach_to=vehicle)
imu.listen(lambda imu: imu_callback(imu, self._vehicle_state))

gps_bp = blueprint_library.find('sensor.other.gnss')
gps = world.spawn_actor(gps_bp, transform, attach_to=vehicle)
gps.listen(lambda gps: gps_callback(gps, self._vehicle_state))
self.params.put_bool("UbloxAvailable", True)
self._simulation_objects.extend([imu, gps])

return CarlaWorld(world, vehicle, camerad)
Loading