So currently I'm trying to create and run a new vehicle on the pychrono
module through anaconda prompt. I created the JSON files and the needed
mesh files. The only issue I'm having is successfully executing the program
without errors. To note, I'm just pulling the HMMWV model using
'WheeledVehicle' to test my code.
*The issues I'm getting are* 'WheeledVehicle' has no attributes to
'SetContactMethod' and I get a vehicle that falls through the map.
Additionally, I had issues loading in the tires, but figured that out, and
now the vehicle floats above the map.
File Get_HMMWV: Vehicle has no wheels and falls through map
File Get_HMMWV_3: Vehicle has wheels but doesn't drop onto map.
(Issues with uploading file, code was copy pasted below)
Is it a lot easier to use the C++ API? Are there other methods that I'm
missing. Thanks.
*===== Get_HMMWV.py =====*
import pychrono as chrono
import pychrono.vehicle as veh
import os
import math
#
=============================================================================
# CONFIGURATION
#
=============================================================================
# Simulation parameters
contact_method = chrono.ChContactMethod_SMC
step_size = 3e-3
tire_step_size = 1e-3
render_step_size = 1.0 / 50 # 50 FPS
t_end = 60.0
debug_step_size = 1.0
# Output
out_dir = "hmmwv_output"
debug_output = True
contact_vis = False
# Visualization types
chassis_vis_type = veh.VisualizationType_MESH
suspension_vis_type = veh.VisualizationType_PRIMITIVES
steering_vis_type = veh.VisualizationType_PRIMITIVES
wheel_vis_type = veh.VisualizationType_MESH
tire_vis_type = veh.VisualizationType_MESH
chassis_collision_type = veh.CollisionType_NONE
# Initial vehicle pose
initLoc = chrono.ChVector3d(0, 0, 1.6)
initRot = chrono.QUNIT
trackPoint = chrono.ChVector3d(0.0, 0.0, 1.75)
# Vehicle model choices
engine_model = veh.EngineModelType_SHAFTS
transmission_model = veh.TransmissionModelType_AUTOMATIC_SHAFTS
drive_type = veh.DrivelineTypeWV_AWD
steering_type = veh.SteeringTypeWV_PITMAN_ARM
tire_model = veh.TireModelType_TMEASY
# Terrain dimensions
terrainLength = 100.0
terrainWidth = 100.0
#
=============================================================================
# MAIN FUNCTION
#
=============================================================================
def main():
chrono.SetChronoDataPath(chrono.GetChronoDataPath())
veh.SetDataPath(chrono.GetChronoDataPath() + "vehicle/")
# Load HMMWV vehicle from JSON
hmmwv_json = veh.GetDataFile("hmmwv/vehicle/HMMWV_Vehicle.json")
#("D:/CHRONO-engine_demos/chrono-9.0.0/chrono-9.0.0/data/vehicle/hmmwv/vehicle/HMMWV_Vehicle.json")
#truck = veh.WheeledVehicle(hmmwv_json, True)
truck = veh.WheeledVehicle(
"D:/CHRONO-engine_demos/chrono-9.0.0/chrono-9.0.0/data/vehicle/hmmwv/vehicle/HMMWV_Vehicle.json",
chrono.ChContactMethod_NSC)
#truck.SetContactMethod(contact_method)
#truck.SetContactMethod(chrono.ChContactMethod_NSC)
#truck.SetChassisCollisionType(chassis_collision_type)
#truck.SetChassisFixed(False)
#truck.SetInitPosition(chrono.ChCoordsysD(initLoc, initRot))
#truck.SetEngineType(engine_model)
#truck.SetTransmissionType(transmission_model)
#truck.SetDriveType(drive_type)
#truck.SetSteeringType(steering_type)
#truck.SetTireType(tire_model)
#truck.SetTireStepSize(tire_step_size)
#initial_pos = chrono.ChCoordsysd(chrono.ChVector3d(5, 0, 1),
chrono.QUNIT)
#truck.SetInitialPosition(chassisPos)
truck.Initialize(chrono.ChCoordsysd(initLoc, initRot))
truck.SetChassisVisualizationType(chassis_vis_type)
truck.SetSuspensionVisualizationType(suspension_vis_type)
truck.SetSteeringVisualizationType(steering_vis_type)
truck.SetWheelVisualizationType(wheel_vis_type)
truck.SetTireVisualizationType(tire_vis_type)
truck.GetSystem().SetCollisionSystemType(chrono.ChCollisionSystem.
Type_BULLET)
# Create terrain
terrain = veh.RigidTerrain(truck.GetSystem())
patch_mat = chrono.ChContactMaterialSMC()
patch_mat.SetFriction(0.9)
patch_mat.SetRestitution(0.01)
patch_mat.SetYoungModulus(2e7)
patch = terrain.AddPatch(patch_mat, chrono.CSYSNORM, terrainLength,
terrainWidth)
patch.SetColor(chrono.ChColor(0.6, 0.6, 0.4))
patch.SetTexture(veh.GetDataFile("terrain/textures/tile4.jpg"), 200, 200
)
terrain.Initialize()
# Visualization system
vis = veh.ChWheeledVehicleVisualSystemIrrlicht()
vis.SetWindowTitle("HMMWV JSON Vehicle")
vis.SetWindowSize(1280, 1024)
vis.SetChaseCamera(trackPoint, 6.0, 0.5)
vis.Initialize()
vis.AddSkyBox()
vis.AddLogo(chrono.GetChronoDataFile("logo_pychrono_alpha.png"))
vis.AddLightDirectional()
vis.AttachVehicle(truck)
# Driver
driver = veh.ChInteractiveDriverIRR(vis)
driver.SetSteeringDelta(render_step_size / 1.0)
driver.SetThrottleDelta(render_step_size / 1.0)
driver.SetBrakingDelta(render_step_size / 0.3)
driver.Initialize()
# Output directory setup
os.makedirs(out_dir, exist_ok=True)
truck.SetChassisOutput(True)
truck.SetSuspensionOutput(0, True)
truck.SetSteeringOutput(0, True)
truck.SetOutput(veh.ChVehicleOutput.ASCII, out_dir, "output", 0.1)
truck.ExportComponentList(os.path.join(out_dir, "component_list.json"))
# Simulation loop
step_number = 0
render_steps = math.ceil(render_step_size / step_size)
debug_steps = math.ceil(debug_step_size / step_size)
truck.EnableRealtime(True)
while vis.Run():
time = truck.GetSystem().GetChTime()
if time >= t_end:
break
vis.BeginScene()
vis.Render()
vis.EndScene()
if debug_output and step_number % debug_steps == 0:
print(f"[{time:.3f} s] Step {step_number}")
# Synchronize
driver_inputs = driver.GetInputs()
driver.Synchronize(time)
terrain.Synchronize(time)
truck.Synchronize(time, driver_inputs, terrain)
vis.Synchronize(time, driver_inputs)
# Advance
driver.Advance(step_size)
terrain.Advance(step_size)
truck.Advance(step_size)
vis.Advance(step_size)
step_number += 1
if __name__ == "__main__":
main()
*===== Get_HMMWV_3.py =====*
import os
import pychrono as chrono
import pychrono.vehicle as veh
import pychrono.irrlicht as irr
import math
#
=============================================================================
# SETUP SIMULATION
#
=============================================================================
def main():
# Set data path (replace with your vehicle JSON directory)
veh.SetDataPath(chrono.GetChronoDataPath() + "vehicle/")
# Create Chrono system
system = chrono.ChSystemNSC()
system.SetCollisionSystemType(chrono.ChCollisionSystem.Type_BULLET)
system.SetGravitationalAcceleration(chrono.ChVector3d(0, 0, -9.81))
#
=========================================================================
# 1. VEHICLE DEFINITION (JSON-based)
#
=========================================================================
# Load vehicle from JSON (replace with your file)
vehicle_file =
"D:/CHRONO-engine_demos/chrono-9.0.0/chrono-9.0.0/data/vehicle/hmmwv/vehicle/HMMWV_Vehicle.json"
#vehicle_file = "D:/Hangups on Crossings/Vehicle
Models/Scania-old-Charlie/vehicle.json"
vehicle = veh.WheeledVehicle(system, vehicle_file)
vehicle.Initialize(chrono.ChCoordsysd(chrono.ChVector3d(0, 0, 1.5),
chrono.ChQuaterniond(1, 0, 0, 0)))
# Add this debug print immediately after
print(f"Vehicle reference frame height: {vehicle.GetChassis().GetPos().z
}")
for axle in vehicle.GetAxles():
tireL = veh.ReadTireJSON("D:/Hangups on Crossings/Vehicle
Models/hmmwv/tire/HMMWV_TMeasyTire.json") # Replace with your tire file
tireR = veh.ReadTireJSON("D:/Hangups on Crossings/Vehicle
Models/hmmwv/tire/HMMWV_TMeasyTire.json")
vehicle.InitializeTire(tireL, axle.m_wheels[0], veh.
VisualizationType_MESH)
vehicle.InitializeTire(tireR, axle.m_wheels[1], veh.
VisualizationType_MESH)
#tireL.EnableCollision(veh.ChTire.CollisionType_MESH)
#tireR.EnableCollision(veh.ChTire.CollisionType_MESH)
vehicle.SetWheelVisualizationType(veh.VisualizationType_MESH)
#debug
print(f"Vehicle has {vehicle.GetNumberAxles()} axles") # Should print
2 for HMMWV
#print(f"Initialized {len(vehicle.GetTires())} tires") # Should print
4 for HMMWV
#for i, tire in enumerate(vehicle.GetTires()):
# print(f"Tire {i} collision enabled: {tire.IsCollisionEnabled()}")
# Add this check before loading tires:
#tire_path = veh.GetDataFile("D:/Hangups on Crossings/Vehicle
Models/hmmwv/tire/HMMWV_TMeasyTire.json")
tire_path = "D:/Hangups on Crossings/Vehicle
Models/hmmwv/tire/HMMWV_TMeasyTire.json"
tireL = veh.ReadTireJSON(tire_path)
tireL.Initialize(axle.m_wheels[0])
tireR.Initialize(axle.m_wheels[1])
if not os.path.exists(tire_path):
print(f"ERROR: Tire file not found at {tire_path}")
else:
print(f"Found tire file at {tire_path}")
# Set visualization modes
vehicle.SetChassisVisualizationType(veh.VisualizationType_MESH)
vehicle.SetSuspensionVisualizationType(veh.VisualizationType_PRIMITIVES)
vehicle.SetWheelVisualizationType(veh.VisualizationType_MESH)
vehicle.SetTireVisualizationType(veh.VisualizationType_MESH)
#
=========================================================================
# 2. TERRAIN
#
=========================================================================
patch_mat = chrono.ChContactMaterialNSC()
patch_mat.SetFriction(0.9)
patch_mat.SetRestitution(0.1)
terrain = veh.RigidTerrain(system)
patch = terrain.AddPatch(patch_mat, chrono.CSYSNORM, 100, 100)
patch.SetTexture(veh.GetDataFile("terrain/textures/tile4.jpg"), 200, 200
)
terrain.Initialize()
#
=========================================================================
# 3. VISUALIZATION (Irrlicht)
#
=========================================================================
vis = veh.ChWheeledVehicleVisualSystemIrrlicht()
vis.SetWindowTitle("Custom Vehicle Demo")
vis.SetWindowSize(1280, 1024)
vis.SetChaseCamera(chrono.ChVector3d(0.0, 0.0, 1.75), 6.0, 0.5)
vis.Initialize()
vis.AddLogo(chrono.GetChronoDataFile("logo_pychrono_alpha.png"))
vis.AddSkyBox()
vis.AddLightDirectional()
vis.AttachVehicle(vehicle)
#
=========================================================================
# 4. DRIVER CONTROLS
#
=========================================================================
# Option A: Interactive driver (keyboard controls)
driver = veh.ChInteractiveDriverIRR(vis)
driver.SetSteeringDelta(0.02)
driver.SetThrottleDelta(0.02)
driver.SetBrakingDelta(0.06)
driver.Initialize()
# Option B: Path-follower (uncomment to use)
#path = veh.StraightLinePath(chrono.ChVector3d(0, 0, 0),
chrono.ChVector3d(100, 0, 0))
#driver = veh.ChPathFollowerDriver(vehicle, path, "my_path", 10.0) #
10 m/s target speed
#driver.Initialize()
# Debug print vehicle components
print("\n=== Vehicle Status ===")
print(f"Chassis pos: {vehicle.GetChassisBody().GetPos()}")
for i, axle in enumerate(vehicle.GetAxles()):
print(f"Axle {i}:")
print(f" Left wheel pos: {axle.m_wheels[0].GetPos()}")
print(f" Right wheel pos: {axle.m_wheels[1].GetPos()}")
#if i < len(vehicle.GetTires()):
#print(f" Left tire contact:
{vehicle.GetTires()[2*i].IsInContact()}")
#print(f" Right tire contact:
{vehicle.GetTires()[2*i+1].IsInContact()}")
# Pause briefly to see debug output
import time
time.sleep(3)
#
=========================================================================
# 5. SIMULATION LOOP
#
=========================================================================
step_size = 0.002
while vis.Run():
time = system.GetChTime()
# Render scene
vis.BeginScene()
vis.Render()
vis.EndScene()
# Get driver inputs
driver_inputs = driver.GetInputs()
# Update modules
driver.Synchronize(time)
terrain.Synchronize(time)
vehicle.Synchronize(time, driver_inputs, terrain)
vis.Synchronize(time, driver_inputs)
# Advance simulation
driver.Advance(step_size)
terrain.Advance(step_size)
vehicle.Advance(step_size)
vis.Advance(step_size)
#
=============================================================================
# RUN SIMULATION
#
=============================================================================
#if __name__ == "__main__":print(f"Vehicle has {vehicle.GetNumberAxles()}
axles") # Should print 2 for HMMWV
#print(f"Initialized {len(vehicle.GetTires())} tires") # Should print 4
for HMMWV
#for i, tire in enumerate(vehicle.GetTires()):
# print(f"Tire {i} collision enabled: {tire.IsCollisionEnabled()}")
# main()
if __name__ == "__main__":
main()
--
You received this message because you are subscribed to the Google Groups
"ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/projectchrono/04145708-1d4a-4e56-bdb3-7181e62c34fen%40googlegroups.com.