Error in documentation "Getting Started"

Describe the bug
When starting the docker containers, I get the following error messages:
picarx-gazebo-1             | [gazebo_gui-3] process has died [pid 52, exit code 134, cmd /opt/ros/noetic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/root/.ros/log/884fc2d4-6b84-11ef-afb6-0242ac120003/gazebo_gui-3.log].

picarx-gazebo-1             | [ERROR] [1725540245.266274479, 0.175000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/joint_wheel_right

picarx-gazebo-1             | [ERROR] [1725540245.266727800, 0.175000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/joint_wheel_left

picarx-gazebo-1             | [ERROR] [1725540245.267164615, 0.175000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/steer_left

picarx-gazebo-1             | [ERROR] [1725540245.267614366, 0.175000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/steer_right

motor_right-dtp-1           | [motor_right-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_right 23 P13 /dev/i2c-0 1 __name:=motor_right __log:=/root/.ros/log/884bf078-6b84-11ef-a227-0242ac120002/motor_right-1.log].

steering-dtp-1              | [ackermann_clutchgear_driver-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_driver/ackermann_clutchgear.py ackermann_clutchgear_driver P2 /dev/i2c-0 __name:=ackermann_clutchgear_driver __log:=/root/.ros/log/884bf078-6b84-11ef-a227-0242ac120002/ackermann_clutchgear_driver-1.log].

steering_emulator-dtp-1     | [ackermann_clutchgear_emulator-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py ackermann_clutchgear_emulator P2 /dev/i2c-0 __name:=ackermann_clutchgear_emulator __log:=/root/.ros/log/884fc2d4-6b84-11ef-afb6-0242ac120003/ackermann_clutchgear_emulator-1.log].

motor_left-dtp-1            | [motor_left-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_left 24 P12 /dev/i2c-0 0 __name:=motor_left __log:=/root/.ros/log/884bf078-6b84-11ef-a227-0242ac120002/motor_left-1.log].

mqtt-dtp-1                  | [MQTTTwinBridge-1] process has died [pid 31, exit code 1, cmd /root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py MQTTTwinBridge None __name:=MQTTTwinBridge __log:=/root/.ros/log/884bf078-6b84-11ef-a227-0242ac120002/MQTTTwinBridge-1.log].

 exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_emulator/dcmotor_emulator.py motor_emulator_left 24 P12 /dev/i2c-0 0 __name:=motor_emulator_left __log:=/root/.ros/log/884fc2d4-6b84-11ef-afb6-0242ac120003/motor_emulator_left-1.log].

To Reproduce
Steps to reproduce the behavior:

Follow the Quick Start guide

Compile linux kernel
Activate GPIO and I2C on System
Build and Start Docker Containers from Scratch
Run docker compose -f docker-compose-dtp.yml up

Desktop (please complete the following information):

OS: Ubuntu 20.04, Linux kernel 5.13

openjournals/joss-reviews/issues/7179

When I run docker compose -f docker-compose-dtp.yml up I tried to attach to picar-x-motor_emulator_right-dtp-1 as quickly as possible. This is the output:
docker attach picar-x-motor_emulator_right-dtp-1

... logging to /root/.ros/log/70b0838c-6c26-11ef-b4e9-0242ac120002/roslaunch-b60bf20f98df-1.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://b60bf20f98df:40169/

SUMMARY
========

PARAMETERS
 * /motor_emulator_right/controller_publisher_topic: /picarx/rear_righ...
 * /motor_emulator_right/direction_pin: 23
 * /motor_emulator_right/i2c_port: /dev/i2c-0
 * /motor_emulator_right/motor_side: 1
 * /motor_emulator_right/name: motor_emulator_right
 * /motor_emulator_right/pwm_pin: P13
 * /rosdistro: noetic
 * /rosversion: 1.16.0

NODES
  /
    motor_emulator_right (picarx_dcmotor_emulator/dcmotor_emulator.py)

ROS_MASTER_URI=http://picarx-gazebo:11312

process[motor_emulator_right-1]: started with pid [31]

... but I noticed that I got the following error on the other terminal:
steering_emulator-dtp-1     | Traceback (most recent call last):
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 191, in <module>
steering_emulator-dtp-1     |     clutchgear_emulator = AckermannClutchGearEmulator(
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 67, in __init__
steering_emulator-dtp-1     |     super(AckermannClutchGearEmulator, self).__init__(pwm_pin, i2c_port)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 27, in __init__
steering_emulator-dtp-1     |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 46, in pwm_pin
steering_emulator-dtp-1     |     self.__pwm_pin = PWM(
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 81, in __init__
steering_emulator-dtp-1     |     super(PWM, self).__init__(i2c_port=i2c_port, address=address)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 50, in __init__
steering_emulator-dtp-1     |     self.smbus = SMBus(self.i2c_port)
steering_emulator-dtp-1     |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 280, in __init__
steering_emulator-dtp-1     |     self.open(bus)
steering_emulator-dtp-1     |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 310, in open
steering_emulator-dtp-1     |     self.fd = os.open(filepath, os.O_RDWR)
steering_emulator-dtp-1     | IsADirectoryError: [Errno 21] Is a directory: '/dev/i2c-0'

I assume it is mounted from the host into the container. I also checked it on the host system and this is correct, /dev/i2c-0 is a directory. Is that a problem?
On the same terminal I got
motor_left-dtp-1            | OSError: [Errno 22] Invalid argument
motor_left-dtp-1            |
motor_left-dtp-1            | During handling of the above exception, another exception occurred:
motor_left-dtp-1            |
motor_left-dtp-1            | Traceback (most recent call last):
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 137, in <module>
motor_left-dtp-1            |     dcmotor = DCMotorDriver(options.args.name, options.args.direction_pin,
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 91, in __init__
motor_left-dtp-1            |     super(DCMotorDriver, self).__init__(name, int(direction_pin),
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 25, in __init__
motor_left-dtp-1            |     self.direction_pin = direction_pin
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 65, in direction_pin
motor_left-dtp-1            |     self.__direction_pin = GPIO().setup(
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/gpio.py", line 407, in setup
motor_left-dtp-1            |     new_pin = Pin(pin_number, direction=direction, callback=callback)
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/gpio.py", line 141, in __init__
motor_left-dtp-1            |     self.pin_number = pin_number
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/gpio.py", line 196, in pin_number
motor_left-dtp-1            |     self.__export()
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/gpio.py", line 305, in __export
motor_left-dtp-1            |     export.write('%d' % self.pin_number)
motor_left-dtp-1            | OSError: [Errno 22] Invalid argument

and
mqtt-dtp-1                  | Traceback (most recent call last):
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py", line 19, in <module>
mqtt-dtp-1                  |     twin_bridge.start()
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 106, in start
mqtt-dtp-1                  |     self.client = rospy.get_param("~config")
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 50, in client
mqtt-dtp-1                  |     self.__client = MQTTClientFactory.create_client(
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 14, in create_client
mqtt-dtp-1                  |     cls.__connection(client, config['connect'])
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 49, in __connection
mqtt-dtp-1                  |     client.connect(**connection_config)
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1435, in connect
mqtt-dtp-1                  |     return self.reconnect()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1598, in reconnect
mqtt-dtp-1                  |     self._sock = self._create_socket()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4609, in _create_socket
mqtt-dtp-1                  |     sock = self._create_socket_connection()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4640, in _create_socket_connection
mqtt-dtp-1                  |     return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 787, in create_connection
mqtt-dtp-1                  |     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
mqtt-dtp-1                  |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
mqtt-dtp-1                  | socket.gaierror: [Errno -3] Temporary failure in name resolution

Okay, the I2C error was the problem with the folder, removing it helped.
I assume the error on the motor_left-dtp-1 is now a problem with the gpio pins:
File "/root/catkin_ws/src/core/picarx/src/picarx/gpio.py", line 305, in __export
motor_left-dtp-1            |     export.write('%d' % self.pin_number)
motor_left-dtp-1            | OSError: [Errno 22] Invalid argument

If you shut down the containers with
docker compose down

and then execute
ls /sys/class/gpio

You should get the result:
export  gpiochip1  unexport

if there are gpio pins gpio23 and gpio24 listed, then you have to remove them. I think the easierst way is just a restart and then you activate the three modules again. If this does not delete the gpio pins, then execute:
echo 24 > /sys/class/gpio/unexport
echo 23 > /sys/class/gpio/unexport

I am trying to replicate this error on a fresh Ubuntu 20.04.

OK, that sounds about right. Unfortunately, I will only be able to check this next week.

 I'm not very familiar with GPIO stuff.

Sorry, looks like I did not send the comment I wrote after the commit, will check if I am home.
The log looks fine, no active gpio pin.
You could try the following:
Create a file, e.g.:
nano export-gpio.bash

Enter in that file
echo 23 > /sys/class/gpio/export
echo 24 > /sys/class/gpio/export

Save and execute:
chmod +x export-gpio.bash

And then execute with sudo export-gpio.bash.
With ls /sys/class/gpio/* you should now see something like gpio23 and gpio24.
To unexport the pins again, create a file with the content:
echo 23 > /sys/class/gpio/unexport
echo 24 > /sys/class/gpio/unexport

I already added this to the documentation yesterday.

So I got this:
$ ls /sys/class/gpio/*
/sys/class/gpio/export  /sys/class/gpio/unexport

/sys/class/gpio/gpio23:
active_low  device  direction  edge  power  subsystem  uevent  value

/sys/class/gpio/gpio24:
active_low  device  direction  edge  power  subsystem  uevent  value

/sys/class/gpio/gpiochip1:
base  device  label  ngpio  power  subsystem  uevent

/sys/class/gpio/gpiochip81:
base  device  label  ngpio  power  subsystem  uevent

So the following does not work directly. I have to put it in a script and run it with sudo ./script.sh.
echo 23 > /sys/class/gpio/unexport
echo 24 > /sys/class/gpio/unexport

Okay, then the gpio modules are installed correctly.
I suggest the following:

reboot once
Check with ls /dev/i2c* if there is already an i2c available.
There could be /dev/i2c-0 by default.
activate the three modules with modprobe
Check if there is a new i2c available, e.g. /dev/i2c-1
Set the I2C variable in ARCHES-PiCar-X/PiCar-X/env/simulation.env to the new I2C device.
Execute in den PiCaR-X folder docker compose -f docker-compose-dtp.yml up.
Paste again the log from a crashing container (not mqtt)

$ ls /dev/i2c*
ls: cannot access '/dev/i2c*': No such file or directory

$ sudo modprobe gpio-mockup gpio_mockup_ranges=1,41
$ sudo modprobe i2c-dev
$ sudo modprobe i2c-stub chip_addr=0x14

$ ls /dev/i2c*
/dev/i2c-0  /dev/i2c-1  /dev/i2c-2  /dev/i2c-3

Now ARCHES-PiCar-X/PiCar-X/env/simulation.env only contains
ROS_MASTER_URI=http://picarx-gazebo:11312
ROS_HOST_PORT=11312

Which I2C variable should I set? And to which value exactly?
OK, I updated to the latest commit. Now it contains
ROS_MASTER_URI=http://picarx-gazebo:11312
ROS_HOST_PORT=11312
I2C=/dev/i2c-0

I believe that is OK? Or should I choose a different one?

Click to show the full log.

docker compose -f docker-compose-dtp.yml up
[+] Running 13/13
 ✔ Network picar-x_default                       Created                   0.0s
 ✔ Container picar-x-picarx-1                    Created                   0.1s
 ✔ Container picar-x-picarx-gazebo-1             Created                   0.1s
 ✔ Container picar-x-mqtt-dtp-1                  Created                   0.0s
 ✔ Container picar-x-ackermann_skill-dtp-1       Created                   0.0s
 ✔ Container picar-x-motor_right-dtp-1           Created                   0.0s
 ✔ Container picar-x-motor_left-dtp-1            Created                   0.0s
 ✔ Container picar-x-shadow-dtp-1                Created                   0.0s
 ✔ Container picar-x-steering-dtp-1              Created                   0.0s
 ✔ Container picar-x-picarx-gazebo-control-1     Created                   0.0s
 ✔ Container picar-x-steering_emulator-dtp-1     Created                   0.0s
 ✔ Container picar-x-motor_emulator_left-dtp-1   Created                   0.0s
 ✔ Container picar-x-motor_emulator_right-dtp-1  Created                   0.0s
Attaching to ackermann_skill-dtp-1, motor_emulator_left-dtp-1, motor_emulator_right-dtp-1, motor_left-dtp-1, motor_right-dtp-1, mqtt-dtp-1, picarx-1, picarx-gazebo-1, picarx-gazebo-control-1, shadow-dtp-1, steering-dtp-1, steering_emulator-dtp-1
picarx-1                    | ... logging to /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/roslaunch-e30d2f51b567-1.log
picarx-1                    | Checking log directory for disk usage. This may take a while.
picarx-1                    | Press Ctrl-C to interrupt
picarx-1                    | Done checking log file disk usage. Usage is <1GB.
picarx-1                    |
picarx-gazebo-1             | ... logging to /root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/roslaunch-123d75246fcb-1.log
picarx-gazebo-1             | Checking log directory for disk usage. This may take a while.
picarx-gazebo-1             | Press Ctrl-C to interrupt
picarx-gazebo-1             | Done checking log file disk usage. Usage is <1GB.
picarx-gazebo-1             |
picarx-1                    | started roslaunch server http://picarx:34043/
picarx-1                    | ros_comm version 1.16.0
picarx-1                    |
picarx-1                    |
picarx-1                    | SUMMARY
picarx-1                    | ========
picarx-1                    |
picarx-1                    | PARAMETERS
picarx-1                    |  * /rosdistro: noetic
picarx-1                    |  * /rosversion: 1.16.0
picarx-1                    |
picarx-1                    | NODES
picarx-1                    |
picarx-1                    | auto-starting new master
picarx-1                    | process[master]: started with pid [32]
picarx-gazebo-1             | started roslaunch server http://picarx-gazebo:33733/
picarx-gazebo-1             |
picarx-gazebo-1             | SUMMARY
picarx-gazebo-1             | ========
picarx-gazebo-1             |
picarx-gazebo-1             | PARAMETERS
picarx-gazebo-1             |  * /gazebo/enable_ros_network: True
picarx-gazebo-1             |  * /robot_description:
steering-dtp-1              |     ackermann_clutchgear_driver = AckermannClutchGearDriver(
steering-dtp-1              |   File "/root/catkin_ws/install/lib/picarx_clutchgear_driver/ackermann_clutchgear.py", line 68, in __init__
steering-dtp-1              |     super(AckermannClutchGearDriver, self).__init__(pwm_pin, i2c_port)
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/clutchgear.py", line 19, in __init__
steering-dtp-1              |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/clutchgear.py", line 38, in pwm_pin
steering-dtp-1              |     self.__pwm_pin = PWM(
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
steering-dtp-1              |     self.channel = channel
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
steering-dtp-1              |     raise IOError("Can't send stuff.")
steering-dtp-1              | OSError: Can't send stuff.
motor_emulator_right-dtp-1  | ... logging to /root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/roslaunch-e714c8e49335-1.log
motor_emulator_right-dtp-1  | Checking log directory for disk usage. This may take a while.
motor_emulator_right-dtp-1  | Press Ctrl-C to interrupt
motor_emulator_right-dtp-1  | Done checking log file disk usage. Usage is <1GB.
motor_emulator_right-dtp-1  |
motor_right-dtp-1           | ... logging to /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/roslaunch-b4d6f89d1b18-1.log
motor_right-dtp-1           | Checking log directory for disk usage. This may take a while.
motor_right-dtp-1           | Press Ctrl-C to interrupt
motor_right-dtp-1           | Done checking log file disk usage. Usage is <1GB.
motor_right-dtp-1           |
motor_emulator_left-dtp-1   | ... logging to /root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/roslaunch-240f7c494817-1.log
motor_emulator_left-dtp-1   | Checking log directory for disk usage. This may take a while.
motor_emulator_left-dtp-1   | Press Ctrl-C to interrupt
motor_emulator_left-dtp-1   | Done checking log file disk usage. Usage is <1GB.
motor_emulator_left-dtp-1   |
motor_left-dtp-1            | ... logging to /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/roslaunch-faba2263b3a6-1.log
motor_left-dtp-1            | Checking log directory for disk usage. This may take a while.
motor_left-dtp-1            | Press Ctrl-C to interrupt
motor_left-dtp-1            | Done checking log file disk usage. Usage is <1GB.
motor_left-dtp-1            |
mqtt-dtp-1                  | ... logging to /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/roslaunch-6595a15394f0-1.log
mqtt-dtp-1                  | Checking log directory for disk usage. This may take a while.
mqtt-dtp-1                  | Press Ctrl-C to interrupt
mqtt-dtp-1                  | Done checking log file disk usage. Usage is <1GB.
mqtt-dtp-1                  |
steering_emulator-dtp-1     | Traceback (most recent call last):
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
steering_emulator-dtp-1     |     self.write_byte(0x2C)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
steering_emulator-dtp-1     |     return self.smbus.write_byte(self.address, data)
steering_emulator-dtp-1     |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
steering_emulator-dtp-1     |     ioctl(self.fd, I2C_SMBUS, msg)
steering_emulator-dtp-1     | OSError: [Errno 6] No such device or address
steering_emulator-dtp-1     |
steering_emulator-dtp-1     | During handling of the above exception, another exception occurred:
steering_emulator-dtp-1     |
steering_emulator-dtp-1     | Traceback (most recent call last):
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 191, in
steering_emulator-dtp-1     |     clutchgear_emulator = AckermannClutchGearEmulator(
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 67, in __init__
steering_emulator-dtp-1     |     super(AckermannClutchGearEmulator, self).__init__(pwm_pin, i2c_port)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 27, in __init__
steering_emulator-dtp-1     |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 46, in pwm_pin
steering_emulator-dtp-1     |     self.__pwm_pin = PWM(
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
steering_emulator-dtp-1     |     self.channel = channel
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
steering_emulator-dtp-1     |     raise IOError("Can't send stuff.")
steering_emulator-dtp-1     | OSError: Can't send stuff.
shadow-dtp-1                | ... logging to /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/roslaunch-d8abc11ea095-1.log
shadow-dtp-1                | Checking log directory for disk usage. This may take a while.
shadow-dtp-1                | Press Ctrl-C to interrupt
shadow-dtp-1                | Done checking log file disk usage. Usage is <1GB.
shadow-dtp-1                |
ackermann_skill-dtp-1       | started roslaunch server http://76a6681eec60:36187/
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | SUMMARY
ackermann_skill-dtp-1       | ========
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | PARAMETERS
ackermann_skill-dtp-1       |  * /ackermann_skill/command_topic: /picarx/drive/com...
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_left_status_topic: /motor_left/status
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_left_topic: motor_left/speed
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_right_status_topic: /motor_right/status
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_right_topic: motor_right/speed
ackermann_skill-dtp-1       |  * /ackermann_skill/status_topic: drive/status
ackermann_skill-dtp-1       |  * /ackermann_skill/steering_status_topic: /steering/status
ackermann_skill-dtp-1       |  * /ackermann_skill/steering_topic: steering/angle
ackermann_skill-dtp-1       |  * /rosdistro: noetic
ackermann_skill-dtp-1       |  * /rosversion: 1.16.0
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | NODES
ackermann_skill-dtp-1       |   /
ackermann_skill-dtp-1       |     ackermann_skill (picarx_ackermann_drive/ackermann_drive_skill.py)
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | ROS_MASTER_URI=http://picarx:11311
ackermann_skill-dtp-1       |
picarx-gazebo-control-1     | ... logging to /root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/roslaunch-2127abb2723d-1.log
picarx-gazebo-control-1     | Checking log directory for disk usage. This may take a while.
picarx-gazebo-control-1     | Press Ctrl-C to interrupt
picarx-gazebo-control-1     | Done checking log file disk usage. Usage is <1GB.
picarx-gazebo-control-1     |
motor_emulator_right-dtp-1  | started roslaunch server http://e714c8e49335:45137/
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | SUMMARY
motor_emulator_right-dtp-1  | ========
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | PARAMETERS
motor_emulator_right-dtp-1  |  * /motor_emulator_right/controller_publisher_topic: /picarx/rear_righ...
motor_emulator_right-dtp-1  |  * /motor_emulator_right/direction_pin: 23
motor_emulator_right-dtp-1  |  * /motor_emulator_right/i2c_port: /dev/i2c-0
motor_emulator_right-dtp-1  |  * /motor_emulator_right/motor_side: 1
motor_emulator_right-dtp-1  |  * /motor_emulator_right/name: motor_emulator_right
motor_emulator_right-dtp-1  |  * /motor_emulator_right/pwm_pin: P13
motor_emulator_right-dtp-1  |  * /rosdistro: noetic
motor_emulator_right-dtp-1  |  * /rosversion: 1.16.0
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | NODES
motor_emulator_right-dtp-1  |   /
motor_emulator_right-dtp-1  |     motor_emulator_right (picarx_dcmotor_emulator/dcmotor_emulator.py)
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | ROS_MASTER_URI=http://picarx-gazebo:11312
motor_emulator_right-dtp-1  |
ackermann_skill-dtp-1       | process[ackermann_skill-1]: started with pid [32]
motor_emulator_right-dtp-1  | process[motor_emulator_right-1]: started with pid [32]
motor_emulator_left-dtp-1   | started roslaunch server http://240f7c494817:34457/
motor_emulator_left-dtp-1   |
motor_emulator_left-dtp-1   | SUMMARY
motor_emulator_left-dtp-1   | ========
motor_emulator_left-dtp-1   |
motor_emulator_left-dtp-1   | PARAMETERS
motor_emulator_left-dtp-1   |  * /motor_emulator_left/controller_publisher_topic: /picarx/rear_left...
motor_emulator_left-dtp-1   |  * /motor_emulator_left/direction_pin: 24
motor_emulator_left-dtp-1   |  * /motor_emulator_left/i2c_port: /dev/i2c-0
motor_emulator_left-dtp-1   |  * /motor_emulator_left/motor_side: 0
motor_emulator_left-dtp-1   |  * /motor_emulator_left/name: motor_emulator_left
motor_emulator_left-dtp-1   |  * /motor_emulator_left/pwm_pin: P12
motor_emulator_left-dtp-1   |  * /rosdistro: noetic
motor_emulator_left-dtp-1   |  * /rosversion: 1.16.0
motor_emulator_left-dtp-1   |
motor_emulator_left-dtp-1   | NODES
motor_emulator_left-dtp-1   |   /
motor_emulator_left-dtp-1   |     motor_emulator_left (picarx_dcmotor_emulator/dcmotor_emulator.py)
motor_emulator_left-dtp-1   |
motor_left-dtp-1            | started roslaunch server http://faba2263b3a6:46363/
motor_left-dtp-1            |
motor_left-dtp-1            | SUMMARY
motor_left-dtp-1            | ========
motor_left-dtp-1            |
motor_left-dtp-1            | PARAMETERS
motor_left-dtp-1            |  * /motor_left/command_topic: motor_left/speed
motor_left-dtp-1            |  * /motor_left/direction_pin: 24
motor_left-dtp-1            |  * /motor_left/i2c_port: /dev/i2c-1
motor_left-dtp-1            |  * /motor_left/motor_side: 0
motor_left-dtp-1            |  * /motor_left/name: motor_left
motor_left-dtp-1            |  * /motor_left/pwm_pin: P12
motor_left-dtp-1            |  * /motor_left/status_topic: motor_left/status
motor_left-dtp-1            |  * /rosdistro: noetic
motor_left-dtp-1            |  * /rosversion: 1.16.0
motor_left-dtp-1            |
motor_left-dtp-1            | NODES
motor_left-dtp-1            |   /
motor_left-dtp-1            |     motor_left (picarx_dcmotor_driver/dcmotor_driver.py)
motor_left-dtp-1            |
motor_right-dtp-1           | started roslaunch server http://b4d6f89d1b18:38111/
motor_right-dtp-1           |
motor_right-dtp-1           | SUMMARY
motor_right-dtp-1           | ========
motor_right-dtp-1           |
motor_right-dtp-1           | PARAMETERS
motor_right-dtp-1           |  * /motor_right/command_topic: motor_right/speed
motor_right-dtp-1           |  * /motor_right/direction_pin: 23
motor_right-dtp-1           |  * /motor_right/i2c_port: /dev/i2c-1
motor_right-dtp-1           |  * /motor_right/motor_side: 1
motor_right-dtp-1           |  * /motor_right/name: motor_right
motor_right-dtp-1           |  * /motor_right/pwm_pin: P13
motor_right-dtp-1           |  * /motor_right/status_topic: motor_right/status
motor_right-dtp-1           |  * /rosdistro: noetic
motor_right-dtp-1           |  * /rosversion: 1.16.0
motor_right-dtp-1           |
motor_right-dtp-1           | NODES
motor_right-dtp-1           |   /
motor_right-dtp-1           |     motor_right (picarx_dcmotor_driver/dcmotor_driver.py)
motor_right-dtp-1           |
motor_emulator_left-dtp-1   | ROS_MASTER_URI=http://picarx-gazebo:11312
motor_emulator_left-dtp-1   |
motor_left-dtp-1            | ROS_MASTER_URI=http://picarx:11311
motor_left-dtp-1            |
motor_right-dtp-1           | ROS_MASTER_URI=http://picarx:11311
motor_right-dtp-1           |
steering-dtp-1              | [ackermann_clutchgear_driver-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_driver/ackermann_clutchgear.py ackermann_clutchgear_driver P2 /dev/i2c-1 __name:=ackermann_clutchgear_driver __log:=/root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/ackermann_clutchgear_driver-1.log].
steering-dtp-1              | log file: /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/ackermann_clutchgear_driver-1*.log
steering-dtp-1              | all processes on machine have died, roslaunch will exit
mqtt-dtp-1                  | started roslaunch server http://6595a15394f0:33343/
mqtt-dtp-1                  |
mqtt-dtp-1                  | SUMMARY
mqtt-dtp-1                  | ========
mqtt-dtp-1                  |
mqtt-dtp-1                  | PARAMETERS
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/client/clean_session: True
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/client/client_id:
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/client/protocol: MQTTv311
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/client/transport: tcp
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/client/userdata: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/connect/bind_address:
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/connect/host: mqtt-server
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/connect/keepalive: 60
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/connect/port: 1883
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/credentials/password: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/credentials/username: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/ca_certs: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/cert_reqs: True
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/certfile: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/ciphers: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/keyfile: None
mqtt-dtp-1                  |  * /MQTTTwinBridge/config/tls/tls_version: True
mqtt-dtp-1                  |  * /rosdistro: noetic
mqtt-dtp-1                  |  * /rosversion: 1.16.0
mqtt-dtp-1                  |
mqtt-dtp-1                  | NODES
mqtt-dtp-1                  |   /
mqtt-dtp-1                  |     MQTTTwinBridge (arches_mqtt_bridge/twin_bridge_pt.py)
mqtt-dtp-1                  |
mqtt-dtp-1                  | ROS_MASTER_URI=http://picarx:11311
mqtt-dtp-1                  |
motor_emulator_left-dtp-1   | process[motor_emulator_left-1]: started with pid [32]
motor_left-dtp-1            | process[motor_left-1]: started with pid [31]
motor_right-dtp-1           | process[motor_right-1]: started with pid [33]
shadow-dtp-1                | started roslaunch server http://d8abc11ea095:33345/
shadow-dtp-1                |
shadow-dtp-1                | SUMMARY
shadow-dtp-1                | ========
shadow-dtp-1                |
shadow-dtp-1                | PARAMETERS
shadow-dtp-1                |  * /rosdistro: noetic
shadow-dtp-1                |  * /rosversion: 1.16.0
shadow-dtp-1                |
shadow-dtp-1                | NODES
shadow-dtp-1                |   /
shadow-dtp-1                |     PTControlDistributor (arches_core/digitalshadow_control_pt.py)
shadow-dtp-1                |     PTDataCollector (arches_core/digitalshadow_data_pt.py)
shadow-dtp-1                |
shadow-dtp-1                | ROS_MASTER_URI=http://picarx:11311
shadow-dtp-1                |
mqtt-dtp-1                  | process[MQTTTwinBridge-1]: started with pid [32]
shadow-dtp-1                | process[PTDataCollector-1]: started with pid [32]
shadow-dtp-1                | process[PTControlDistributor-2]: started with pid [33]
picarx-gazebo-control-1     | started roslaunch server http://2127abb2723d:45153/
picarx-gazebo-control-1     |
picarx-gazebo-control-1     | SUMMARY
picarx-gazebo-control-1     | ========
picarx-gazebo-control-1     |
picarx-gazebo-control-1     | PARAMETERS
picarx-gazebo-control-1     |  * /picarx/joint_state_controller/publish_rate: 50
picarx-gazebo-control-1     |  * /picarx/joint_state_controller/type: joint_state_contr...
picarx-gazebo-control-1     |  * /picarx/rear_left_wheel_controller/joint: joint_wheel_left
picarx-gazebo-control-1     |  * /picarx/rear_left_wheel_controller/pid/d: 10.0
picarx-gazebo-control-1     |  * /picarx/rear_left_wheel_controller/pid/i: 0.01
picarx-gazebo-control-1     |  * /picarx/rear_left_wheel_controller/pid/p: 100.0
picarx-gazebo-control-1     |  * /picarx/rear_left_wheel_controller/type: velocity_controll...
picarx-gazebo-control-1     |  * /picarx/rear_right_wheel_controller/joint: joint_wheel_right
picarx-gazebo-control-1     |  * /picarx/rear_right_wheel_controller/pid/d: 10.0
picarx-gazebo-control-1     |  * /picarx/rear_right_wheel_controller/pid/i: 0.01
picarx-gazebo-control-1     |  * /picarx/rear_right_wheel_controller/pid/p: 100.0
picarx-gazebo-control-1     |  * /picarx/rear_right_wheel_controller/type: velocity_controll...
picarx-gazebo-control-1     |  * /picarx/steer_left_controller/joint: steer_left
picarx-gazebo-control-1     |  * /picarx/steer_left_controller/type: position_controll...
picarx-gazebo-control-1     |  * /picarx/steer_right_controller/joint: steer_right
picarx-gazebo-control-1     |  * /picarx/steer_right_controller/type: position_controll...
picarx-gazebo-control-1     |  * /rosdistro: noetic
picarx-gazebo-control-1     |  * /rosversion: 1.16.0
picarx-gazebo-control-1     |
picarx-gazebo-control-1     | NODES
picarx-gazebo-control-1     |   /
picarx-gazebo-control-1     |     robot_state_publisher (robot_state_publisher/robot_state_publisher)
picarx-gazebo-control-1     |   /picarx/
picarx-gazebo-control-1     |     controller_spawner (controller_manager/spawner)
picarx-gazebo-control-1     |
picarx-gazebo-control-1     | ROS_MASTER_URI=http://picarx-gazebo:11312
picarx-gazebo-control-1     |
steering_emulator-dtp-1     | [ackermann_clutchgear_emulator-1] process has died [pid 31, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py ackermann_clutchgear_emulator P2 /dev/i2c-0 __name:=ackermann_clutchgear_emulator __log:=/root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/ackermann_clutchgear_emulator-1.log].
steering_emulator-dtp-1     | log file: /root/.ros/log/09314c90-6ec0-11ef-84d9-0242ac120002/ackermann_clutchgear_emulator-1*.log
steering_emulator-dtp-1     | all processes on machine have died, roslaunch will exit
picarx-gazebo-control-1     | process[picarx/controller_spawner-1]: started with pid [32]
steering-dtp-1              | shutting down processing monitor...
steering-dtp-1              | ... shutting down processing monitor complete
steering-dtp-1              | done
picarx-gazebo-control-1     | process[robot_state_publisher-2]: started with pid [33]
steering_emulator-dtp-1     | shutting down processing monitor...
steering_emulator-dtp-1     | ... shutting down processing monitor complete
steering_emulator-dtp-1     | done
motor_left-dtp-1            | Traceback (most recent call last):
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
motor_left-dtp-1            |     self.write_byte(0x2C)
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
motor_left-dtp-1            |     return self.smbus.write_byte(self.address, data)
motor_left-dtp-1            |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
motor_left-dtp-1            |     ioctl(self.fd, I2C_SMBUS, msg)
motor_left-dtp-1            | OSError: [Errno 121] Remote I/O error
motor_left-dtp-1            |
motor_left-dtp-1            | During handling of the above exception, another exception occurred:
motor_left-dtp-1            |
motor_left-dtp-1            | Traceback (most recent call last):
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 137, in
motor_left-dtp-1            |     dcmotor = DCMotorDriver(options.args.name, options.args.direction_pin,
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 91, in __init__
motor_left-dtp-1            |     super(DCMotorDriver, self).__init__(name, int(direction_pin),
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 26, in __init__
motor_left-dtp-1            |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 84, in pwm_pin
motor_left-dtp-1            |     self.__pwm_pin = PWM(
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
motor_left-dtp-1            |     self.channel = channel
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
motor_left-dtp-1            |     raise IOError("Can't send stuff.")
motor_left-dtp-1            | OSError: Can't send stuff.
ackermann_skill-dtp-1       | [INFO] [1725895661.289490]: The skill AckermannSkill was update in the system.
ackermann_skill-dtp-1       | [INFO] [1725895661.296142]: The skill AckermannSkill was update in the system.
motor_right-dtp-1           | Traceback (most recent call last):
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
motor_right-dtp-1           |     self.write_byte(0x2C)
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
motor_right-dtp-1           |     return self.smbus.write_byte(self.address, data)
motor_right-dtp-1           |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
motor_right-dtp-1           |     ioctl(self.fd, I2C_SMBUS, msg)
motor_right-dtp-1           | OSError: [Errno 121] Remote I/O error
motor_right-dtp-1           |
motor_right-dtp-1           | During handling of the above exception, another exception occurred:
motor_right-dtp-1           |
motor_right-dtp-1           | Traceback (most recent call last):
motor_right-dtp-1           |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 137, in
motor_right-dtp-1           |     dcmotor = DCMotorDriver(options.args.name, options.args.direction_pin,
motor_right-dtp-1           |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 91, in __init__
motor_right-dtp-1           |     super(DCMotorDriver, self).__init__(name, int(direction_pin),
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 26, in __init__
motor_right-dtp-1           |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 84, in pwm_pin
motor_right-dtp-1           |     self.__pwm_pin = PWM(
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
motor_right-dtp-1           |     self.channel = channel
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
motor_right-dtp-1           |     raise IOError("Can't send stuff.")
motor_right-dtp-1           | OSError: Can't send stuff.
mqtt-dtp-1                  | Traceback (most recent call last):
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py", line 19, in
mqtt-dtp-1                  |     twin_bridge.start()
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 106, in start
mqtt-dtp-1                  |     self.client = rospy.get_param("~config")
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 50, in client
mqtt-dtp-1                  |     self.__client = MQTTClientFactory.create_client(
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 14, in create_client
mqtt-dtp-1                  |     cls.__connection(client, config['connect'])
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 49, in __connection
mqtt-dtp-1                  |     client.connect(**connection_config)
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1435, in connect
mqtt-dtp-1                  |     return self.reconnect()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1598, in reconnect
mqtt-dtp-1                  |     self._sock = self._create_socket()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4609, in _create_socket
mqtt-dtp-1                  |     sock = self._create_socket_connection()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4640, in _create_socket_connection
mqtt-dtp-1                  |     return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 787, in create_connection
mqtt-dtp-1                  |     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
mqtt-dtp-1                  |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
mqtt-dtp-1                  | socket.gaierror: [Errno -3] Temporary failure in name resolution
picarx-gazebo-control-1     | [INFO] [1725895661.457953, 0.000000]: Controller Spawner: Waiting for service controller_manager/load_controller
picarx-gazebo-control-1     | [INFO] [1725895661.459729, 0.000000]: Controller Spawner: Waiting for service controller_manager/switch_controller
picarx-gazebo-control-1     | [INFO] [1725895661.461284, 0.000000]: Controller Spawner: Waiting for service controller_manager/unload_controller
picarx-gazebo-control-1     | [INFO] [1725895661.462920, 0.000000]: Loading controller: rear_left_wheel_controller
motor_left-dtp-1            | [motor_left-1] process has died [pid 31, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_left 24 P12 /dev/i2c-1 0 __name:=motor_left __log:=/root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/motor_left-1.log].
motor_left-dtp-1            | log file: /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/motor_left-1*.log
motor_left-dtp-1            | all processes on machine have died, roslaunch will exit
picarx-gazebo-control-1     | [INFO] [1725895661.561507, 6.229000]: Loading controller: rear_right_wheel_controller
steering-dtp-1 exited with code 0
motor_right-dtp-1           | [motor_right-1] process has died [pid 33, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_right 23 P13 /dev/i2c-1 1 __name:=motor_right __log:=/root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/motor_right-1.log].
motor_right-dtp-1           | log file: /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/motor_right-1*.log
motor_right-dtp-1           | all processes on machine have died, roslaunch will exit
picarx-gazebo-control-1     | [INFO] [1725895661.605260, 6.273000]: Loading controller: steer_right_controller
picarx-gazebo-control-1     | [INFO] [1725895661.614181, 6.282000]: Loading controller: steer_left_controller
picarx-gazebo-control-1     | [INFO] [1725895661.618279, 6.286000]: Loading controller: joint_state_controller
picarx-gazebo-control-1     | [INFO] [1725895661.624195, 6.292000]: Controller Spawner: Loaded controllers: rear_left_wheel_controller, rear_right_wheel_controller, steer_right_controller, steer_left_controller, joint_state_controller
motor_left-dtp-1            | shutting down processing monitor...
motor_left-dtp-1            | ... shutting down processing monitor complete
motor_left-dtp-1            | done
picarx-gazebo-control-1     | [INFO] [1725895661.627231, 6.295000]: Started controllers: rear_left_wheel_controller, rear_right_wheel_controller, steer_right_controller, steer_left_controller, joint_state_controller
steering_emulator-dtp-1 exited with code 0
motor_right-dtp-1           | shutting down processing monitor...
motor_right-dtp-1           | ... shutting down processing monitor complete
motor_right-dtp-1           | done
motor_left-dtp-1 exited with code 0
mqtt-dtp-1                  | [MQTTTwinBridge-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py MQTTTwinBridge None __name:=MQTTTwinBridge __log:=/root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/MQTTTwinBridge-1.log].
mqtt-dtp-1                  | log file: /root/.ros/log/0924a26a-6ec0-11ef-80d4-0242ac120003/MQTTTwinBridge-1*.log
mqtt-dtp-1                  | all processes on machine have died, roslaunch will exit
motor_right-dtp-1 exited with code 0
mqtt-dtp-1                  | shutting down processing monitor...
mqtt-dtp-1                  | ... shutting down processing monitor complete
mqtt-dtp-1                  | done
mqtt-dtp-1 exited with code 0
```

This error looks more familiar now.
On my windows system i2c-0 is the device I get after loading the module with modprobe.
On Ubuntu systems the i2c-0 could be there by default.
Try I2C=/dev/i2c-1 in the simulation.env.
Since you have several i2c devices listed, you could try also the others if i2c-1 throws the same error.

The comment I prepared yesterday after the commit but did not send:
So, I tried to reproduce the error you posted and I am a bit clueless.
If the gpio pin is still active in the system, there error would be OSError: [Errno 16] Device or resource busy. If you use the wrong I2C device, the error would be raise IOError("Can't send stuff.").
Did you activate the gpio-mockup module?
** END **
I will also add the error messages to the documentation.

Try I2C=/dev/i2c-1 in the simulation.env.

Since you have several i2c devices listed, you could try also the others if i2c-1 throws the same error.

I tried all 4 now. I keep getting this error:

Click to show log

$ docker compose -f docker-compose-dtp.yml up
[+] Running 13/0
 ✔ Network picar-x_default                       Created                                           0.0s
 ✔ Container picar-x-picarx-1                    Created                                           0.0s
 ✔ Container picar-x-picarx-gazebo-1             Created                                           0.0s
 ✔ Container picar-x-motor_right-dtp-1           Created                                           0.0s
 ✔ Container picar-x-steering-dtp-1              Created                                           0.0s
 ✔ Container picar-x-motor_left-dtp-1            Created                                           0.0s
 ✔ Container picar-x-shadow-dtp-1                Created                                           0.0s
 ✔ Container picar-x-ackermann_skill-dtp-1       Crea...                                           0.0s
 ✔ Container picar-x-mqtt-dtp-1                  Created                                           0.0s
 ✔ Container picar-x-picarx-gazebo-control-1     Cr...                                             0.0s
 ✔ Container picar-x-motor_emulator_left-dtp-1   Created                                           0.0s
 ✔ Container picar-x-steering_emulator-dtp-1     Cr...                                             0.0s
 ✔ Container picar-x-motor_emulator_right-dtp-1  Created                                           0.0s
Attaching to ackermann_skill-dtp-1, motor_emulator_left-dtp-1, motor_emulator_right-dtp-1, motor_left-dtp-1, motor_right-dtp-1, mqtt-dtp-1, picarx-1, picarx-gazebo-1, picarx-gazebo-control-1, shadow-dtp-1, steering-dtp-1, steering_emulator-dtp-1
picarx-1                    | ... logging to /root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/roslaunch-4dd5ea7aead3-1.log
picarx-1                    | Checking log directory for disk usage. This may take a while.
picarx-1                    | Press Ctrl-C to interrupt
picarx-1                    | Done checking log file disk usage. Usage is <1GB.
picarx-1                    |
picarx-gazebo-1             | ... logging to /root/.ros/log/e3bdd0ec-6f40-11ef-b42d-0242ac120003/roslaunch-9df847c7cb1a-1.log
picarx-gazebo-1             | Checking log directory for disk usage. This may take a while.
picarx-gazebo-1             | Press Ctrl-C to interrupt
picarx-gazebo-1             | Done checking log file disk usage. Usage is <1GB.
picarx-gazebo-1             |
picarx-1                    | started roslaunch server http://picarx:45183/
picarx-1                    | ros_comm version 1.16.0
picarx-1                    |
picarx-1                    |
picarx-1                    | SUMMARY
picarx-1                    | ========
picarx-1                    |
picarx-1                    | PARAMETERS
picarx-1                    |  * /rosdistro: noetic
picarx-1                    |  * /rosversion: 1.16.0
picarx-1                    |
picarx-1                    | NODES
picarx-1                    |
picarx-1                    | auto-starting new master
picarx-1                    | process[master]: started with pid [32]
picarx-gazebo-1             | started roslaunch server http://picarx-gazebo:33363/
picarx-gazebo-1             |
picarx-gazebo-1             | SUMMARY
picarx-gazebo-1             | ========
picarx-gazebo-1             |
picarx-gazebo-1             | PARAMETERS
picarx-gazebo-1             |  * /gazebo/enable_ros_network: True
picarx-gazebo-1             |  * /robot_description:
steering-dtp-1              |     ackermann_clutchgear_driver = AckermannClutchGearDriver(
steering-dtp-1              |   File "/root/catkin_ws/install/lib/picarx_clutchgear_driver/ackermann_clutchgear.py", line 68, in __init__
steering-dtp-1              |     super(AckermannClutchGearDriver, self).__init__(pwm_pin, i2c_port)
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/clutchgear.py", line 19, in __init__
steering-dtp-1              |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/clutchgear.py", line 38, in pwm_pin
steering-dtp-1              |     self.__pwm_pin = PWM(
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
steering-dtp-1              |     self.channel = channel
steering-dtp-1              |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
steering-dtp-1              |     raise IOError("Can't send stuff.")
steering-dtp-1              | OSError: Can't send stuff.
steering_emulator-dtp-1     | Traceback (most recent call last):
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
steering_emulator-dtp-1     |     self.write_byte(0x2C)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
steering_emulator-dtp-1     |     return self.smbus.write_byte(self.address, data)
steering_emulator-dtp-1     |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
steering_emulator-dtp-1     |     ioctl(self.fd, I2C_SMBUS, msg)
steering_emulator-dtp-1     | OSError: [Errno 6] No such device or address
steering_emulator-dtp-1     |
steering_emulator-dtp-1     | During handling of the above exception, another exception occurred:
steering_emulator-dtp-1     |
steering_emulator-dtp-1     | Traceback (most recent call last):
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 191, in
steering_emulator-dtp-1     |     clutchgear_emulator = AckermannClutchGearEmulator(
steering_emulator-dtp-1     |   File "/root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py", line 67, in __init__
steering_emulator-dtp-1     |     super(AckermannClutchGearEmulator, self).__init__(pwm_pin, i2c_port)
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 27, in __init__
steering_emulator-dtp-1     |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/emulators/clutchgear.py", line 46, in pwm_pin
steering_emulator-dtp-1     |     self.__pwm_pin = PWM(
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
steering_emulator-dtp-1     |     self.channel = channel
steering_emulator-dtp-1     |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
steering_emulator-dtp-1     |     raise IOError("Can't send stuff.")
steering_emulator-dtp-1     | OSError: Can't send stuff.
motor_left-dtp-1            | Traceback (most recent call last):
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
motor_left-dtp-1            |     self.write_byte(0x2C)
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
motor_left-dtp-1            |     return self.smbus.write_byte(self.address, data)
motor_left-dtp-1            |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
motor_left-dtp-1            |     ioctl(self.fd, I2C_SMBUS, msg)
motor_left-dtp-1            | OSError: [Errno 121] Remote I/O error
motor_left-dtp-1            |
motor_left-dtp-1            | During handling of the above exception, another exception occurred:
motor_left-dtp-1            |
motor_left-dtp-1            | Traceback (most recent call last):
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 137, in
motor_left-dtp-1            |     dcmotor = DCMotorDriver(options.args.name, options.args.direction_pin,
motor_left-dtp-1            |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 91, in __init__
motor_left-dtp-1            |     super(DCMotorDriver, self).__init__(name, int(direction_pin),
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 26, in __init__
motor_left-dtp-1            |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 84, in pwm_pin
motor_left-dtp-1            |     self.__pwm_pin = PWM(
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
motor_left-dtp-1            |     self.channel = channel
motor_left-dtp-1            |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
motor_left-dtp-1            |     raise IOError("Can't send stuff.")
motor_left-dtp-1            | OSError: Can't send stuff.
ackermann_skill-dtp-1       | started roslaunch server http://ad3b7f7668f7:45395/
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | SUMMARY
ackermann_skill-dtp-1       | ========
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | PARAMETERS
ackermann_skill-dtp-1       |  * /ackermann_skill/command_topic: /picarx/drive/com...
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_left_status_topic: /motor_left/status
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_left_topic: motor_left/speed
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_right_status_topic: /motor_right/status
ackermann_skill-dtp-1       |  * /ackermann_skill/motor_right_topic: motor_right/speed
ackermann_skill-dtp-1       |  * /ackermann_skill/status_topic: drive/status
ackermann_skill-dtp-1       |  * /ackermann_skill/steering_status_topic: /steering/status
ackermann_skill-dtp-1       |  * /ackermann_skill/steering_topic: steering/angle
ackermann_skill-dtp-1       |  * /rosdistro: noetic
ackermann_skill-dtp-1       |  * /rosversion: 1.16.0
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | NODES
ackermann_skill-dtp-1       |   /
ackermann_skill-dtp-1       |     ackermann_skill (picarx_ackermann_drive/ackermann_drive_skill.py)
ackermann_skill-dtp-1       |
ackermann_skill-dtp-1       | ROS_MASTER_URI=http://picarx:11311
ackermann_skill-dtp-1       |
picarx-gazebo-control-1     | [INFO] [1725951003.160564, 0.000000]: Controller Spawner: Waiting for service controller_manager/load_controller
picarx-gazebo-control-1     | [INFO] [1725951003.162660, 0.000000]: Controller Spawner: Waiting for service controller_manager/switch_controller
picarx-gazebo-control-1     | [INFO] [1725951003.164607, 0.000000]: Controller Spawner: Waiting for service controller_manager/unload_controller
picarx-gazebo-control-1     | [INFO] [1725951003.166645, 0.000000]: Loading controller: rear_left_wheel_controller
motor_emulator_right-dtp-1  | started roslaunch server http://fd1e9fcc71fa:38327/
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | SUMMARY
motor_emulator_right-dtp-1  | ========
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | PARAMETERS
motor_emulator_right-dtp-1  |  * /motor_emulator_right/controller_publisher_topic: /picarx/rear_righ...
motor_emulator_right-dtp-1  |  * /motor_emulator_right/direction_pin: 23
motor_emulator_right-dtp-1  |  * /motor_emulator_right/i2c_port: /dev/i2c-3
motor_emulator_right-dtp-1  |  * /motor_emulator_right/motor_side: 1
motor_emulator_right-dtp-1  |  * /motor_emulator_right/name: motor_emulator_right
motor_emulator_right-dtp-1  |  * /motor_emulator_right/pwm_pin: P13
motor_emulator_right-dtp-1  |  * /rosdistro: noetic
motor_emulator_right-dtp-1  |  * /rosversion: 1.16.0
motor_emulator_right-dtp-1  |
motor_emulator_right-dtp-1  | NODES
motor_emulator_right-dtp-1  |   /
motor_emulator_right-dtp-1  |     motor_emulator_right (picarx_dcmotor_emulator/dcmotor_emulator.py)
motor_emulator_right-dtp-1  |
picarx-gazebo-control-1     | [INFO] [1725951003.176610, 5.792000]: Loading controller: rear_right_wheel_controller
motor_right-dtp-1           | started roslaunch server http://5c3d1110fe26:44981/
motor_right-dtp-1           |
motor_right-dtp-1           | SUMMARY
motor_right-dtp-1           | ========
motor_right-dtp-1           |
motor_right-dtp-1           | PARAMETERS
motor_right-dtp-1           |  * /motor_right/command_topic: motor_right/speed
motor_right-dtp-1           |  * /motor_right/direction_pin: 23
motor_right-dtp-1           |  * /motor_right/i2c_port: /dev/i2c-1
motor_right-dtp-1           |  * /motor_right/motor_side: 1
motor_right-dtp-1           |  * /motor_right/name: motor_right
motor_right-dtp-1           |  * /motor_right/pwm_pin: P13
motor_right-dtp-1           |  * /motor_right/status_topic: motor_right/status
motor_right-dtp-1           |  * /rosdistro: noetic
motor_right-dtp-1           |  * /rosversion: 1.16.0
motor_right-dtp-1           |
motor_right-dtp-1           | NODES
motor_right-dtp-1           |   /
motor_right-dtp-1           |     motor_right (picarx_dcmotor_driver/dcmotor_driver.py)
motor_right-dtp-1           |
motor_emulator_right-dtp-1  | ROS_MASTER_URI=http://picarx-gazebo:11312
motor_emulator_right-dtp-1  |
motor_right-dtp-1           | ROS_MASTER_URI=http://picarx:11311
motor_right-dtp-1           |
ackermann_skill-dtp-1       | process[ackermann_skill-1]: started with pid [32]
picarx-gazebo-control-1     | [INFO] [1725951003.183191, 5.798000]: Loading controller: steer_right_controller
picarx-gazebo-control-1     | [INFO] [1725951003.192829, 5.808000]: Loading controller: steer_left_controller
picarx-gazebo-control-1     | [INFO] [1725951003.197650, 5.813000]: Loading controller: joint_state_controller
motor_emulator_right-dtp-1  | process[motor_emulator_right-1]: started with pid [32]
picarx-gazebo-control-1     | [INFO] [1725951003.203726, 5.819000]: Controller Spawner: Loaded controllers: rear_left_wheel_controller, rear_right_wheel_controller, steer_right_controller, steer_left_controller, joint_state_controller
motor_right-dtp-1           | process[motor_right-1]: started with pid [32]
picarx-gazebo-control-1     | [INFO] [1725951003.207552, 5.823000]: Started controllers: rear_left_wheel_controller, rear_right_wheel_controller, steer_right_controller, steer_left_controller, joint_state_controller
steering-dtp-1              | [ackermann_clutchgear_driver-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_driver/ackermann_clutchgear.py ackermann_clutchgear_driver P2 /dev/i2c-1 __name:=ackermann_clutchgear_driver __log:=/root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/ackermann_clutchgear_driver-1.log].
steering-dtp-1              | log file: /root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/ackermann_clutchgear_driver-1*.log
steering-dtp-1              | all processes on machine have died, roslaunch will exit
steering_emulator-dtp-1     | [ackermann_clutchgear_emulator-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_clutchgear_emulator/ackermann_clutchgear_emulator.py ackermann_clutchgear_emulator P2 /dev/i2c-0 __name:=ackermann_clutchgear_emulator __log:=/root/.ros/log/e3bdd0ec-6f40-11ef-b42d-0242ac120003/ackermann_clutchgear_emulator-1.log].
steering_emulator-dtp-1     | log file: /root/.ros/log/e3bdd0ec-6f40-11ef-b42d-0242ac120003/ackermann_clutchgear_emulator-1*.log
steering_emulator-dtp-1     | all processes on machine have died, roslaunch will exit
mqtt-dtp-1                  | Traceback (most recent call last):
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py", line 19, in
mqtt-dtp-1                  |     twin_bridge.start()
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 106, in start
mqtt-dtp-1                  |     self.client = rospy.get_param("~config")
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 50, in client
mqtt-dtp-1                  |     self.__client = MQTTClientFactory.create_client(
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 14, in create_client
mqtt-dtp-1                  |     cls.__connection(client, config['connect'])
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 49, in __connection
mqtt-dtp-1                  |     client.connect(**connection_config)
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1435, in connect
mqtt-dtp-1                  |     return self.reconnect()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1598, in reconnect
mqtt-dtp-1                  |     self._sock = self._create_socket()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4609, in _create_socket
mqtt-dtp-1                  |     sock = self._create_socket_connection()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4640, in _create_socket_connection
mqtt-dtp-1                  |     return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 787, in create_connection
mqtt-dtp-1                  |     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
mqtt-dtp-1                  |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
mqtt-dtp-1                  | socket.gaierror: [Errno -3] Temporary failure in name resolution
motor_left-dtp-1            | [motor_left-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_left 24 P12 /dev/i2c-1 0 __name:=motor_left __log:=/root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/motor_left-1.log].
motor_left-dtp-1            | log file: /root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/motor_left-1*.log
motor_left-dtp-1            | all processes on machine have died, roslaunch will exit
motor_right-dtp-1           | Traceback (most recent call last):
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 121, in channel
motor_right-dtp-1           |     self.write_byte(0x2C)
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/i2c.py", line 84, in write_byte
motor_right-dtp-1           |     return self.smbus.write_byte(self.address, data)
motor_right-dtp-1           |   File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 414, in write_byte
motor_right-dtp-1           |     ioctl(self.fd, I2C_SMBUS, msg)
motor_right-dtp-1           | OSError: [Errno 121] Remote I/O error
motor_right-dtp-1           |
motor_right-dtp-1           | During handling of the above exception, another exception occurred:
motor_right-dtp-1           |
motor_right-dtp-1           | Traceback (most recent call last):
motor_right-dtp-1           |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 137, in
motor_right-dtp-1           |     dcmotor = DCMotorDriver(options.args.name, options.args.direction_pin,
motor_right-dtp-1           |   File "/root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py", line 91, in __init__
motor_right-dtp-1           |     super(DCMotorDriver, self).__init__(name, int(direction_pin),
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 26, in __init__
motor_right-dtp-1           |     self.pwm_pin = {'channel': pwm_pin, 'i2c_port': i2c_port}
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/drivers/dcmotor.py", line 84, in pwm_pin
motor_right-dtp-1           |     self.__pwm_pin = PWM(
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 83, in __init__
motor_right-dtp-1           |     self.channel = channel
motor_right-dtp-1           |   File "/root/catkin_ws/src/core/picarx/src/picarx/pwm.py", line 125, in channel
motor_right-dtp-1           |     raise IOError("Can't send stuff.")
motor_right-dtp-1           | OSError: Can't send stuff.
steering-dtp-1              | shutting down processing monitor...
steering-dtp-1              | ... shutting down processing monitor complete
steering-dtp-1              | done
steering_emulator-dtp-1     | shutting down processing monitor...
steering_emulator-dtp-1     | ... shutting down processing monitor complete
steering_emulator-dtp-1     | done
ackermann_skill-dtp-1       | [INFO] [1725951003.491987]: The skill AckermannSkill was update in the system.
ackermann_skill-dtp-1       | [INFO] [1725951003.496749]: The skill AckermannSkill was update in the system.
motor_left-dtp-1            | shutting down processing monitor...
motor_left-dtp-1            | ... shutting down processing monitor complete
motor_left-dtp-1            | done
motor_right-dtp-1           | [motor_right-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/picarx_dcmotor_driver/dcmotor_driver.py motor_right 23 P13 /dev/i2c-1 1 __name:=motor_right __log:=/root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/motor_right-1.log].
motor_right-dtp-1           | log file: /root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/motor_right-1*.log
motor_right-dtp-1           | all processes on machine have died, roslaunch will exit
motor_right-dtp-1           | shutting down processing monitor...
motor_right-dtp-1           | ... shutting down processing monitor complete
motor_right-dtp-1           | done
steering-dtp-1 exited with code 0
mqtt-dtp-1                  | [MQTTTwinBridge-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py MQTTTwinBridge None __name:=MQTTTwinBridge __log:=/root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/MQTTTwinBridge-1.log].
mqtt-dtp-1                  | log file: /root/.ros/log/e3bb3c88-6f40-11ef-ab3a-0242ac120002/MQTTTwinBridge-1*.log
mqtt-dtp-1                  | all processes on machine have died, roslaunch will exit
steering_emulator-dtp-1 exited with code 0
mqtt-dtp-1                  | shutting down processing monitor...
mqtt-dtp-1                  | ... shutting down processing monitor complete
mqtt-dtp-1                  | done
motor_left-dtp-1 exited with code 0
motor_right-dtp-1 exited with code 0
mqtt-dtp-1 exited with code 0

Is there any way to investigate the i2c mockup in more detail? Is it also necessary to activate the modules after each reboot of the host system? If I don't do it, I have no i2c devices at all.

There is a way to check the registers on the I2C.
The general way is:

install with sudo apt install i2c-tools
Execute i2cdetect -l
Execute i2cdetect -l -r 0 to get the registers for /dev/i2c-0. Replace the 0 with the number of the other devices.

I do not have access to my system right now, but the result should be something like here: using_i2c. Only one register should be active (different from --).
I further saw, that the -dtp.yml also uses the picarx.env. There you should adjust the I2C value, too. The value should match the simulation.env. But I do not think that this will solve the current problem.
Maybe there is an docker error with default environment variable values, try to execute docker compose with:
I2C=/dev/i2c-1 docker compose -f docker-compose-dtp.yml up

And again, replace the -1 with any other device number also set in the *.env.
Your question regarding the activation after reboot: it is possible to place the stuff in autostart, but did not try this. On the RPi the modules are activated by default.

$ i2cdetect -l
i2c-3	unknown   	SMBus stub driver               	N/A
i2c-1	unknown   	Synopsys DesignWare I2C adapter 	N/A
i2c-2	unknown   	Synopsys DesignWare I2C adapter 	N/A
i2c-0	unknown   	SMBus I801 adapter at efa0      	N/A

$ sudo i2cdetect -r 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0 using receive byte commands.
I will probe address range 0x03-0x77.
Continue?  This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1 using receive byte commands.
I will probe address range 0x03-0x77.
Continue?  This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-2 using receive byte commands.
I will probe address range 0x03-0x77.
Continue?  This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-3 using receive byte commands.
I will probe address range 0x03-0x77.
Continue?  Changed simulation.env and picar.env and started with I2C=/dev/i2c-X docker compose -f docker-compose-dtp.yml up. 2 failed again with the same error. 3 works kind of:

Click to show the full log.

$ I2C=/dev/i2c-3 docker compose -f docker-compose-dtp.yml up
[+] Running 13/0
 ✔ Network picar-x_default                       Created                                         0.0s
 ✔ Container picar-x-picarx-gazebo-1             Created                                         0.0s
 ✔ Container picar-x-picarx-1                    Created                                         0.0s
 ✔ Container picar-x-ackermann_skill-dtp-1       Cr...                                           0.0s
 ✔ Container picar-x-mqtt-dtp-1                  Created                                         0.0s
 ✔ Container picar-x-shadow-dtp-1                Created                                         0.0s
 ✔ Container picar-x-motor_left-dtp-1            Created                                         0.0s
 ✔ Container picar-x-motor_right-dtp-1           Create...                                       0.0s
 ✔ Container picar-x-steering-dtp-1              Created                                         0.0s
 ✔ Container picar-x-steering_emulator-dtp-1     Created                                         0.0s
 ✔ Container picar-x-motor_emulator_left-dtp-1   Created                                         0.0s
 ✔ Container picar-x-motor_emulator_right-dtp-1  Created                                         0.0s
 ✔ Container picar-x-picarx-gazebo-control-1     Created                                         0.0s
Attaching to ackermann_skill-dtp-1, motor_emulator_left-dtp-1, motor_emulator_right-dtp-1, motor_left-dtp-1, motor_right-dtp-1, mqtt-dtp-1, picarx-1, picarx-gazebo-1, picarx-gazebo-control-1, shadow-dtp-1, steering-dtp-1, steering_emulator-dtp-1
picarx-1                    | ... logging to /root/.ros/log/ccce3aac-6f54-11ef-b7c4-0242ac120002/roslaunch-d9ae73d76881-1.log
picarx-1                    | Checking log directory for disk usage. This may take a while.
picarx-1                    | Press Ctrl-C to interrupt
picarx-1                    | Done checking log file disk usage. Usage is <1GB.
picarx-1                    |
picarx-gazebo-1             | ... logging to /root/.ros/log/ccd0ffbc-6f54-11ef-bae6-0242ac120003/roslaunch-bbc2e7b99351-1.log
picarx-gazebo-1             | Checking log directory for disk usage. This may take a while.
picarx-gazebo-1             | Press Ctrl-C to interrupt
picarx-gazebo-1             | Done checking log file disk usage. Usage is <1GB.
picarx-gazebo-1             |
picarx-1                    | started roslaunch server http://picarx:35891/
picarx-1                    | ros_comm version 1.16.0
picarx-1                    |
picarx-1                    |
picarx-1                    | SUMMARY
picarx-1                    | ========
picarx-1                    |
picarx-1                    | PARAMETERS
picarx-1                    |  * /rosdistro: noetic
picarx-1                    |  * /rosversion: 1.16.0
picarx-1                    |
picarx-1                    | NODES
picarx-1                    |
picarx-1                    | auto-starting new master
picarx-1                    | process[master]: started with pid [32]
picarx-gazebo-1             | started roslaunch server http://picarx-gazebo:43127/
picarx-gazebo-1             |
picarx-gazebo-1             | SUMMARY
picarx-gazebo-1             | ========
picarx-gazebo-1             |
picarx-gazebo-1             | PARAMETERS
picarx-gazebo-1             |  * /gazebo/enable_ros_network: True
picarx-gazebo-1             |  * /robot_description:
mqtt-dtp-1                  |     twin_bridge.start()
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 106, in start
mqtt-dtp-1                  |     self.client = rospy.get_param("~config")
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/twin_bridge.py", line 50, in client
mqtt-dtp-1                  |     self.__client = MQTTClientFactory.create_client(
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 14, in create_client
mqtt-dtp-1                  |     cls.__connection(client, config['connect'])
mqtt-dtp-1                  |   File "/root/catkin_ws/install/lib/python3/dist-packages/arches_mqtt_bridge/client.py", line 49, in __connection
mqtt-dtp-1                  |     client.connect(**connection_config)
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1435, in connect
mqtt-dtp-1                  |     return self.reconnect()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 1598, in reconnect
mqtt-dtp-1                  |     self._sock = self._create_socket()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4609, in _create_socket
mqtt-dtp-1                  |     sock = self._create_socket_connection()
mqtt-dtp-1                  |   File "/usr/local/lib/python3.8/dist-packages/paho/mqtt/client.py", line 4640, in _create_socket_connection
mqtt-dtp-1                  |     return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 787, in create_connection
mqtt-dtp-1                  |     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
mqtt-dtp-1                  |   File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
mqtt-dtp-1                  |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
mqtt-dtp-1                  | socket.gaierror: [Errno -3] Temporary failure in name resolution
picarx-gazebo-control-1     | [INFO] [1725959555.155161, 6.291000]: Started controllers: rear_left_wheel_controller, rear_right_wheel_controller, steer_right_controller, steer_left_controller, joint_state_controller
mqtt-dtp-1                  | [MQTTTwinBridge-1] process has died [pid 32, exit code 1, cmd /root/catkin_ws/install/lib/arches_mqtt_bridge/twin_bridge_pt.py MQTTTwinBridge None __name:=MQTTTwinBridge __log:=/root/.ros/log/ccce3aac-6f54-11ef-b7c4-0242ac120002/MQTTTwinBridge-1.log].
mqtt-dtp-1                  | log file: /root/.ros/log/ccce3aac-6f54-11ef-b7c4-0242ac120002/MQTTTwinBridge-1*.log
mqtt-dtp-1                  | all processes on machine have died, roslaunch will exit
mqtt-dtp-1                  | shutting down processing monitor...
mqtt-dtp-1                  | ... shutting down processing monitor complete
mqtt-dtp-1                  | done
mqtt-dtp-1 exited with code 0

Does that mean it's working?

Additional remarks:

it's a bit annoying to copy the commands from "Getting started" because they are all indented by 4 spaces
I don't have any visual confirmation after sending commands to the picar, is there a guide to set up the Gazebo GUI?

Sorry for the late response. If I understand the comments correct, the I2C problem is solved. Thanks for posting the results, I will place it on the troubleshooting page.
In the end, the installation guide for the modules was correct, but the configuration with the I2C variable in the environemnt files was missing, right?
Visualization with a Gazebo Simulation
I adjusted the docker compose file to use xhost for the Gazebo GUI on both, Ubuntu and WSL2. Therefore, you have to install:
sudo apt install xorg

Afterwards, you can activate the X11 forwarding via
xhost +

And then you can start the docker compose file. I tested this with Ubuntu and WSL2 and it worked on both systems.
After stopping the docker compose file remove the X11 forwarding again.
xhost -

This is no perfect solution, but I was not able to limit it to the user level. I added this part also to the documentation.
Visualization in a terminal
An alternative way to display the content without the GUI would be to switch into a container
docker exec -it picar-x-ackermann_skill-dtp-1 /bin/bash

# in general, this should not be required, but in case the .bashrc is not loaded..
source ./install/setup.bash

# get all available topics with
rostopic list

# enter any of the listed topics after rostopic echo
rostopic echo /drive/status

In a second terminal you also switch into a container, but there you publish a message:
docker exec -it picar-x-ackermann_skill-dtp-1 /bin/bash

# in general, this should not be required, but in case the .bashrc is not loaded..
source ./install/setup.bash

rostopic pub /picarx/drive/command picarx_msgs/Drive "{speed: 50, angle: 20}"

With regard to your other remarks:

I removed the whitespaces
The command was not a typo, but the active tab and the tab content were mixed up, fixed it.

At the moment I have to define the environment variable I2C with
I2C=/dev/i2c-3  docker compose -f docker-compose-dtp.yml up
It does not work without it.
I also have to activate the modules after each reboot of the host system:
sudo modprobe gpio-mockup gpio_mockup_ranges=1,41
sudo modprobe i2c-dev
sudo modprobe i2c-stub chip_addr=0x14

I will test the GUI in a minute.

And then you can start the docker compose file. I tested this with Ubuntu and WSL2 and it worked on both systems.

Do I have to change anything else to start the Gazebo GUI? Because it doesn't work like that on my machine after running xhost + and also rebuilding the images.
Everything else works as intended now. Thanks a lot! I apologize for being a bit helpless here since I never worked with this before.

Do I have to change anything else to start the Gazebo GUI? Because it doesn't work like that on my machine after running xhost + and also rebuilding the images.

Have you pulled the latest commits? I changed the environmental variable display and mounted /tmp/X.11-unix into the container. On my systems that was enough.
Instead of starting via docker compose, you could try
docker run --rm --name guitest -i -e DISPLAY -v /tmp/X.11-unix:/tmp/X.11-unix --net=host ghcr.io/cau-se/arches-picar-x/picarx-gazebo::latest roslaunch picarx_gazebo picarx-world.launch

If this opens, there is still some problem in the compose file.

Everything else works as intended now. Thanks a lot! I apologize for being a bit helpless here since I never worked with this before. But I think the documentation improved for other clueless researchers. :)

Thank you very much for you patience! :) refactored the compose files a few weeks ago to allow the environmental variables instead of changing each compose file individually. But quite error prone this approach.

Okay, maybe the interactive shell activation in the compose file was missing. Did not affect my WSL setup, but for ubuntu this seems important.

This one works:

docker run --rm --name guitest -i -e DISPLAY -v /tmp/X.11-unix:/tmp/X.11-unix --net=host ghcr.io/cau-se/arches-picar-x/picarx-gazebo::latest roslaunch picarx_gazebo picarx-world.launch

I pulled from Github, rebuild the docker images and used docker compose to start everything, but the Gazebo GUI doesn't show up. But there is an error message. Unfortunately I was not able to copy the log file mentioned to the host.
picarx-gazebo-1             | started roslaunch server http://picarx-gazebo:37623/
picarx-gazebo-1             |
picarx-gazebo-1             | SUMMARY
picarx-gazebo-1             | ========
picarx-gazebo-1             |
picarx-gazebo-1             | PARAMETERS
picarx-gazebo-1             |  * /gazebo/enable_ros_network: True
picarx-gazebo-1             |  * /robot_description: <?xml version="1....
picarx-gazebo-1             |  * /rosdistro: noetic
picarx-gazebo-1             |  * /rosversion: 1.16.0
picarx-gazebo-1             |  * /use_sim_time: True
picarx-gazebo-1             |
picarx-gazebo-1             | NODES
picarx-gazebo-1             |   /
picarx-gazebo-1             |     gazebo (gazebo_ros/gzserver)
picarx-gazebo-1             |     gazebo_gui (gazebo_ros/gzclient)
picarx-gazebo-1             |     spawn_urdf (gazebo_ros/spawn_model)
picarx-gazebo-1             |
picarx-gazebo-1             | auto-starting new master
picarx-gazebo-1             | process[master]: started with pid [34]
picarx-1                    | ROS_MASTER_URI=http://picarx:11311/
picarx-1                    |
picarx-1                    | setting /run_id to 34624818-7011-11ef-b02b-0242ac120002
picarx-1                    | process[rosout-1]: started with pid [42]
picarx-1                    | started core service [/rosout]
picarx-gazebo-1             | ROS_MASTER_URI=http://picarx-gazebo:11312
picarx-gazebo-1             |
picarx-gazebo-1             | setting /run_id to 346503be-7011-11ef-b0a5-0242ac120003
picarx-gazebo-1             | process[rosout-1]: started with pid [44]
picarx-gazebo-1             | started core service [/rosout]
picarx-gazebo-1             | process[gazebo-2]: started with pid [47]
picarx-gazebo-1             | process[gazebo_gui-3]: started with pid [54]
picarx-gazebo-1             | process[spawn_urdf-4]: started with pid [61]
picarx-gazebo-1             | [ INFO] [1726040467.581318713]: Finished loading Gazebo ROS API Plugin.
picarx-gazebo-1             | [ INFO] [1726040467.582130798]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting...
picarx-gazebo-1             | [ INFO] [1726040467.652530124]: Finished loading Gazebo ROS API Plugin.
picarx-gazebo-1             | [ INFO] [1726040467.653397659]: waitForService: Service [/gazebo_gui/set_physics_properties] has not been advertised, waiting...
picarx-gazebo-1             | [ INFO] [1726040467.725197957]: waitForService: Service [/gazebo/set_physics_properties] is now available.
picarx-gazebo-1             | [ INFO] [1726040467.736731687, 0.010000000]: Physics dynamic reconfigure ready.
picarx-gazebo-1             | Aborted (core dumped)
picarx-gazebo-1             | [gazebo_gui-3] process has died [pid 54, exit code 134, cmd /opt/ros/noetic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/root/.ros/log/346503be-7011-11ef-b0a5-0242ac120003/gazebo_gui-3.log].
picarx-gazebo-1             | log file: /root/.ros/log/346503be-7011-11ef-b0a5-0242ac120003/gazebo_gui-3*.log
picarx-gazebo-1             | [ INFO] [1726040468.026205265, 0.177000000]: Loading gazebo_ros_control plugin
picarx-gazebo-1             | [ INFO] [1726040468.026284914, 0.177000000]: Starting gazebo_ros_control plugin in namespace: /picarx
picarx-gazebo-1             | [ INFO] [1726040468.026668431, 0.177000000]: gazebo_ros_control plugin is waiting for model URDF in parameter [/robot_description] on the ROS param server.
picarx-gazebo-1             | [ERROR] [1726040468.169133224, 0.177000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/joint_wheel_right
picarx-gazebo-1             | [ERROR] [1726040468.170563922, 0.177000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/joint_wheel_left
picarx-gazebo-1             | [ERROR] [1726040468.171776769, 0.177000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/steer_left
picarx-gazebo-1             | [ERROR] [1726040468.172886364, 0.177000000]: No p gain specified for pid.  Namespace: /picarx/gazebo_ros_control/pid_gains/steer_right
picarx-gazebo-1             | [ INFO] [1726040468.176124421, 0.177000000]: Loaded gazebo_ros_control.
picarx-gazebo-1             | [spawn_urdf-4] process has finished cleanly
picarx-gazebo-1             | log file: /root/.ros/log/346503be-7011-11ef-b0a5-0242ac120003/spawn_urdf-4*.log

The GUI process gets killed in the compose process. But if it is working without docker compose, we are not far away from our goal.
In my last commit I added
stdin_open: true to the picarx-gazebo container in the docker-compose-dtp.yml, did you also pull this commit?

In my last commit I added
stdin_open: true to the picarx-gazebo container in the docker-compose-dtp.yml, did you also pull this commit?

Yes, and then rebuilt the images.

hmmmm, so I cloned the repo again on my Ubuntu system, activate xhost with xhost +, adjusted the I2C in the simulation.env and picarx.env, built the docker-compose-core.yml and the docker-compose-dtp.yml, started it with docker compose and the GUI opened. I will set up a new Ubuntu System tomorrow evening and try it again step by step, but have to leave now for a business trip.
I do not know if xhost could block something with the docker user, maybe try xhost + local:root or xhost local:docker, but if the GUI opens with plain docker run..
Do you use the plain docker engine on your Ubuntu or did you install the Docker Desktop application?

hmmmm, so I cloned the repo again on my Ubuntu system, activate xhost with xhost +, adjusted the I2C in the simulation.env and picarx.env, built the docker-compose-core.yml and the docker-compose-dtp.yml, started it with docker compose and the GUI opened. I will set up a new Ubuntu System tomorrow evening and try it again step by step, but have to leave now for a business trip.

I tried the same. Didn't work on my machine.

I do not know if xhost could block something with the docker user, maybe try xhost + local:root or xhost local:docker, but if the GUI opens with plain docker run..

Tried that too.

Do you use the plain docker engine on your Ubuntu or did you install the Docker Desktop application?

I did not install the desktop application.

EDIT: what I was just thinking about, try to rebuild the containers with --no-cache:

I've done that multiple times, but nothing seems to work.

I reinstalled the Ubuntu two times now and copied the instructions fromt he gruide to build the kernel. What i am doing different from the guide is that I used the gui tool grub-customizer to switch from kernel 5.15.0-119-generic (default in the Ubuntu 20.04 Image on the official ubuntu page) to kernel 5.13.0. Furthermore, I installed the packages git and curl. For Docker I used the official Docker installation guide. I will add git and curl in the dependency list, reference to the docker guide and add the grub-customizer to the troubleshooting page, in case someone wants to switch easily between kernel versions.
However, the Gazebo window always opens after xhost + and the docker compose. I am wondering whether the grub-customizer installs dependencies that can influence the behavior. Can you please try:
sudo apt install grub-customizer

I almost gave up. Then I checked the docker compose file again. It works now on my machine! This is the git diff. I can see the picar moving! :)
diff --git a/PiCar-X/docker-compose-dtp.yml b/PiCar-X/docker-compose-dtp.yml
index 67c6ef6..be6db24 100644
--- a/PiCar-X/docker-compose-dtp.yml
+++ b/PiCar-X/docker-compose-dtp.yml
@@ -151,7 +151,7 @@ services:
     ports:
       - 11312:11312
     volumes:
-      - ${X11PATH:-/tmp/.X11-unix/X0}:/tmp/.X11-unix/X0
+      - ${X11PATH:-/tmp/.X11-unix}:/tmp/.X11-unix
       - ./core:/root/catkin_ws/src/core
       - ./simulation:/root/catkin_ws/src/simulation
     command: /bin/bash -c "roslaunch picarx_gazebo picarx-world.launch"

Great news!!! Thank you for your patience with this matter!! :)

Can this be closed now? (sorry if not, this is long thread...)

I think so. @AlexanderBarbie Do you want to update anything in the documentation?

I was not sure if we maybe still need this issue, but it does not look like. I will create a new issue for the documentation and enhance the documentation at the weekend and also rewrite the paper a little bit.