Hi all, I've been working a bit on the ChIrrGuiDriver class, a class that 
provides "human in the loop" support for many of the vehicle demos. That 
said, in it's current state, it definitely had some serious limitations. 
Before offering a PR, I put up a commit with my changes so far in a fork of 
Chrono I have on my github, because there might be some discussion points 
that need to be addressed.

This is the commit (so far):
https://github.com/m4rr5/chrono/commit/bb4367c0767bfb42a2bd4a1b6a2a82367a7d6bab

So what did I change? First and foremost, I implemented support for 
assigning joystick axis and buttons in a scenario where you have more than 
one "joystick" attached. This is pretty common when you talk about modern 
simulators. They come with pedals (separate USB device), a wheel (one or 
sometimes even two devices), an H-shifter (separate device) and a button 
box (again, separate device with tons of buttons to change in-car systems).

On top of that I added basic support to calibrate each of those axis, 
setting the minimum and maximum (raw) value for that axis as well as the 
intended (scaled) output values. More could be added here for sure, such as 
deadzones and non-linear behavior, but I'm putting those features up for 
discussion first.

Also, I changed the way you map your axis and buttons. Instead of 
hardcoding them, there is now a "../data/joystick.json" file that allows 
you to assign all axis and buttons. An example, for my development machine 
that only has an XBox controller (and it does not map all the H-shifter 
buttons, an exercise that can easily be done by the reader):

{
    "steering": {
        "name": "Controller (Xbox One For Windows)",
        "axis": 0,
        "min": -32768,
        "max": 32767,
        "scaled_min": 1,
        "scaled_max": -1
    },
    "throttle": {
        "name": "Controller (Xbox One For Windows)",
        "axis": 2,
        "min": -1,
        "max": -32767,
        "scaled_min": 0,
        "scaled_max": 1
    },
    "brake": {
        "name": "Controller (Xbox One For Windows)",
        "axis": 2,
        "min": 0,
        "max": 32767,
        "scaled_min": 0,
        "scaled_max": 1
    },
    "clutch": {
        "name": "Controller (Xbox One For Windows)",
        "axis": 4,
        "min": 0,
        "max": 32767,
        "scaled_min": 0,
        "scaled_max": 1
    },
    "shiftUp": {
        "name": "Controller (Xbox One For Windows)",
        "button": 4
    },
    "shiftDown": {
        "name": "Controller (Xbox One For Windows)",
        "button": 5
    }
}

So I think the values more or less explain themselves. By using the names 
of the controllers, it does not matter in what order they show up on your 
system. At startup, they get mapped to joystick IDs.

I also added sequential shifter support. The underlying code right now will 
only let you shift if you have a manual gearbox. I left that as is for now, 
but you could argue that it makes sense, even in the scenario of an 
automatic gearbox, to allow drivers to manually override gears.

There was some code in there too for H-shifter support, but in its current 
state I could not get that to work. I modified the code a bit to support up 
to 9 forward gears and added support for shifting (as long as you have the 
clutch pressed down). Again, you can argue if that (pressing the clutch) is 
needed. Especially modern race cars typically allow shifting without 
clutch. Up for discussion!

Now another issue I encountered is that there were some bits of API that I 
had to modify:

   1. There were methods to Get/Set JoystickAxes directly, but those did 
   not take into account what Joystick (ID or name) to use, so I commented 
   those out. As far as I can see, nobody was using them (but that could be 
   different for upstream projects using Chrono).
   2. I had to make the SetGear() method public so it could be accessed 
   from the driver. I saw no other way to implement the H-shifter and make it 
   change gears. The existing code had nothing to shift?!?

I also added a few minor things such as:

   - Protection against "double shifts" (timeout currently hardcoded).
   - Debug mode that will, twice per second, print all the values of the 
   joytick axes and buttons connected, very handy when you're writing a 
   joystick.json file, can be disabled otherwise.

I'm sure I accidentally left in a bug or two as well, so feel free to point 
out anything that can be improved, or suggest different ways of doing 
things.

Greetings, Marcel

-- 
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 on the web visit 
https://groups.google.com/d/msgid/projectchrono/b9db4907-3086-445e-b2a9-016c4f41a0ban%40googlegroups.com.

Reply via email to