I've further evolved and tested my earlier solution and made sure it works on different systems here, including both sequential and H-shifter setups. I've created a pull request here: https://github.com/projectchrono/chrono/pull/405
Looking forward to any feedback! Greetings, Marcel On Wednesday, June 22, 2022 at 5:28:53 PM UTC+2 Marcel Offermans wrote: > Hello Radu, > > Thanks for the feedback, I will work towards a PR. One other question came > to mind, since you say you've implemented something for the Logitech wheels > (assuming you're talking about the G25, 27, 29, ... range of consumer > wheels here): did you also implement any force feedback? Although I'm not > sure if the IrrLicht interface supports that, going directly to > DirectX/DirectInput would, so that could be another thing to add that would > improve the feeling of the cars a lot. > > Greetings, Marcel > > On Wednesday, June 22, 2022 at 2:12:06 PM UTC+2 Radu Serban wrote: > >> 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]. >> 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/ef5a33fd-5ca1-454e-bf93-c7dab257d7efn%40googlegroups.com.
