Vehicle Operation - LJoswig/SUZUKI_JIMNY_AUTONOMOUS_GRAMM_JOSWIG GitHub Wiki

Operation Guide: Jetson & RC Jimny

This wiki page covers Jetson setup, SSH access, running ROS nodes and RC control of the Jimny. Read this page in full before operating the system.


1. Jetson Hardware Connection

Before powering on the system, check that all cables are securely connected (see Cable Plan).

  1. Car battery: Connect the cable from the vehicle’s 12 V battery to the supply cable for the boards and motor driver.
  2. HDMI dummy plug: Connect it before powering on the Jetson. It simulates a connected monitor and is used for headless operation in the current setup.
  3. Lithium-Ion battery: Plug the power supply cable into the Jetson. A DC–DC converter is connected between the battery and the Jetson. ⚠️ Warning: Check the voltage of the 6S Li-Ion battery (10500 mAh) with a multimeter before use. It should be above 24 V for an estimated runtime of 2–3 hours. Recharge the battery if its voltage drops below 21 V.
  4. Cube Orange: Plug the Cube Orange USB cable into the vertical slot of the Jetson.
  5. Steering Board and Steerf Board: Plug the two USB cables into the horizontal USB ports (one top and one bottom). The physical order does not matter.
car battery Jetson cable Jetson battery

2. Jetson SSH Connection

All the working repository is currently on the Jetson. To control it, you need to access it via SSH from your laptop.

  1. Connect your laptop to the Jetson using an Ethernet cable.

  2. Open a Linux terminal on your laptop and identify its Ethernet interface name:

    ip link

    Look for a name like enp3s0, eno1, or eth0.

  3. The Jetson’s Ethernet IP address is 192.168.50.2 in this setup. Assign the IP 192.168.50.10 to your laptop. In both commands below, replace enp3s0 with the interface name you found in step 2:

    sudo ip addr add 192.168.50.10/24 dev enp3s0
    sudo ip link set enp3s0 up
  4. Test the network connection:

    ping 192.168.50.2

    Press Ctrl+C to stop the command.

  5. If it pings successfully, SSH from laptop into the Jetson (password is admin):

    ✓ You are now in the Jetson’s terminal.


3. ROS Terminals

  1. Connect the Jetson and hardware as described in Section 1 (Jetson Hardware Connection).
  2. Connect the Ethernet cable from your laptop to the Jetson.
  3. Switch the Jimny’s ignition ON, but do not start the engine yet.
  4. Open 4 separate terminals on your laptop and connect to the Jetson via SSH in each one.

Identify USB Ports

Before running the ROS nodes, list the serial device files:

ls /dev/tty*CH* /dev/ttyUSB*

Possible device files include /dev/ttyUSB0 and /dev/ttyUSB1, or with installed CH341 driver /dev/ttyCH341USB0 and /dev/ttyCH341USB1.

To identify which device file belongs to each board, monitor USB events:

sudo dmesg -w

Disconnect and reconnect one board’s USB cable at a time to identify its device file in the terminal.

Note: Linux device files may change after a reboot/reconnection; check before each session.

Running ROS2 Nodes

Run one of the following command blocks in each of the 4 opened terminals.

Terminal 1 (cuberos):

cd ~/workspaces/jimny/jimny_ws
ros2 run cuberos cuberos_node.py

Terminal 2 (to_vehicle):

cd ~/workspaces/jimny/jimny_ws
ros2 run to_vehicle to_vehicle /dev/ttyUSB1 
# /device file of Steerf Board
# Use the line below if you installed a CH341 driver:
# ros2 run to_vehicle to_vehicle /dev/ttyCH341USB1

Terminal 3 (ackermann_to_steering):

cd ~/ackermann_to_steering_serial
python3 ackermann_to_steering_serial_final.py /dev/ttyUSB0
# /device file of Steering Board
# Use the line below if you installed a CH341 driver:
# python3 ackermann_to_steering_serial_final.py /dev/ttyCH341USB0

Terminal 4 (mode_switching):

cd ~/workspaces/jimny/jimny_ws
ros2 run mode_switching switch

Each terminal runs one ROS2 node. To view the available ROS topics and their data:

ros2 topic list
ros2 topic echo <topic_name>
ROS2 terminal output
Terminal Displayed Output
1 – cuberos CubePilot data publishing (GPS data, raw GPS data, RC channels, and CubePilot mode).
2 – to_vehicle Steerf Board serial connection status and CMD_TO_STERF commands (target velocity, target acceleration, actual GPS speed, safety state).
3 – ackermann_to_steering Steering Board serial connection status and sent steering commands (target steering angle and target steering rate).
4 – mode_switching Operating mode and ARM/DISARM status, RC command values (steering input, target steering rate, target steering angle, target velocity), published ackermann commands, and safety/error messages.

4. RC Control

🏁 Ready to drive

Once the 4 terminals are running without errors:

  1. Start the car engine.
  2. Turn on the Herelink handheld controller.
  3. Select Manual mode.
  4. Arm.

🛑 Safe Shutdown (CRUCIAL)

To avoid OS corruption on the Jetson, ALWAYS do this before disconnecting power from the Jetson. Stop the ROS Nodes. Go to one of the SSH terminals and run:

sudo poweroff

Wait for the Jetson LEDs to turn off completely before disconnecting the power source.

5. 🛠 Troubleshooting

Issue: CH341 driver not loaded after reboot - the driver file ch341.ko is already on the Jetson, but it may not load automatically after restarting. As a result, the USB ports for the connected boards may not appear under /dev/ttyCH341* or /dev/ttyUSB*.

Solution: Check whether the driver is loaded and the serial ports are available:

lsmod | grep ch341
ls /dev/ttyCH341* /dev/ttyUSB*

If the first command shows no output, the CH341 driver is not loaded. Install the driver so it loads automatically after rebooting:

cd ~/ch341ser_linux-main/driver
sudo make install

After rebooting, verify that the driver is loaded and the serial ports are available.


Issue: Herelink -> Cube Orange -> Jetson communication failure.

Solution: Check that there are no loose cable connections. Keep the ROS nodes running and open an additional SSH terminal. Check the Cube Orange connection on the Jetson:

ls /dev/ttyACM*

The Cube Orange should appear as dev/ttyACM0 or dev/tty/ACM1. Check whether Cube Orange heartbeat messages are being received by the Jetson:

ros2 topic echo /heartbeat

Check whether RC data is received from the Herelink controller:

ros2 topic echo /rc_inputs

Move the Herelink controls and verify that the values change. Check the Jetson’s safety mode which is sent to the Steerf Board:

ros2 topic echo /signal_error

<H,0> disarmed, <H,1> armed + ok, <H,2> armed + error. If no Cube heartbeat is received for more than 2 seconds while armed, it switches to <H,2>.


Issue: Jetson -> Arduino Boards communication failure.

Solution: Serial:

Jetson ───── SteerfBoard → baud rates must match

Jetson ───── Steering Board → baud rates must match

Check that the baud rates in to_vehicle.py and ackermann_to_steering_serial_final.py match Serial.begin(...) in the corresponding .ino codes.

Python:   baud_rate = 115200
Arduino:  Serial.begin(115200);

Issue: No longitudinal control - the vehicle does not respond to throttle or brake commands.

Solution: The Steerf Board selects and sends the operating mode via CAN bus to the AxelBrake and Brake Board: MANUAL (0), AUTO (1), or EMERGENCY (2). Check the Steerf Board debug CSV file for troubleshooting:

ls -lt ~/workspaces/jimny/jimny_ws/sterf_debug_*.csv

Open the relevant file and interpret its data using the table:

csv debug table

Tap into the CAN bus using an external CAN module, and connect a logic analyzer to the module to capture the CAN signals. Connect the logic analyzer to the laptop via USB and use the program Saleae Logic 2 to record and decode the CAN frames.

Logic Analyzer Saleae

Use can_ids.h to identify the CAN message IDs and the corresponding .ino board code to determine what the data bytes represent.


Issue: No steering control - the vehicle does not respond to steering commands.

Solution: Initially, try restarting the car engine to restart the steering board. If that doesn't work, connect the Steering Board to a laptop and open the Arduino IDE Serial Monitor. Use the debug commands (enable steering controller (e), send steering targets (s20, s-20, s0), disable steering controller (d), set zero steering position(z)) implemented in steer_try_serial_only.ino to check whether the steering wheel responds. In the Serial Monitor:

e
s10
s-10
s0
d

if that does not work, try rezeroing it with

d
z
e

then test steering angles like s10, if that works, steering should work again

⚠️ **GitHub.com Fallback** ⚠️