Hi Marcel,

This part of the code was indeed more experimental and has not seen much use as 
implemented in the main Chrono repository.  Having said that, students in the 
lab have implemented more sophisticated joystick interfaces, as well as 
interfaces to driving wheel controllers (such as the Logitech sets).  As you 
suspected, these were implemented in external projects that are built on top of 
Chrono & Chrono::Vehicle and which we use for human-in-the-loop simulations.

Having said that, more robust support for such controllers in Chrono is 
probably not a bad idea and you seem to have implemented a pretty comprehensive 
interface.  I think this would be a nice addition to Chrono and encourage you 
to submit it as a PR.

As for making ChPowertrain::SetGear() public, that’s fine.  For what we needed 
so far, we’ve always use ShiftUp and ShiftDown, but a fully manual transmission 
box would indeed allow you to traverse gears non-sequentially.

Thanks,
--Radu

From: [email protected] <[email protected]> On Behalf 
Of Marcel Offermans
Sent: Tuesday, June 21, 2022 8:32 PM
To: ProjectChrono <[email protected]>
Subject: [chrono] Improved joystick (wheel, pedal, h-shifter) support...

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]<mailto:[email protected]>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/projectchrono/b9db4907-3086-445e-b2a9-016c4f41a0ban%40googlegroups.com<https://groups.google.com/d/msgid/projectchrono/b9db4907-3086-445e-b2a9-016c4f41a0ban%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
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/PH0PR06MB82371E4BF8F6AF7F7C010396A7B29%40PH0PR06MB8237.namprd06.prod.outlook.com.

Reply via email to