<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rsewiki.electro.dtu.dk/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=S253734</id>
	<title>Rsewiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://rsewiki.electro.dtu.dk/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=S253734"/>
	<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Special:Contributions/S253734"/>
	<updated>2026-06-11T13:32:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_file&amp;diff=8996</id>
		<title>CycloneDDS Configuration file</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_file&amp;diff=8996"/>
		<updated>2026-05-28T18:43:37Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Electronics]]&lt;br /&gt;
&lt;br /&gt;
The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.&lt;br /&gt;
 &amp;lt;CycloneDDS&amp;gt;&lt;br /&gt;
   &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;General&amp;gt;&lt;br /&gt;
       &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;&lt;br /&gt;
       &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;&lt;br /&gt;
     &amp;lt;/General&amp;gt;&lt;br /&gt;
   &amp;lt;/Domain&amp;gt;&lt;br /&gt;
 &amp;lt;/CycloneDDS&amp;gt;&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8995</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8995"/>
		<updated>2026-05-28T18:43:00Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: [https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf LD19_Development Manual]&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8994</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8994"/>
		<updated>2026-05-28T18:42:20Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Electronics]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: [https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf LD19_Development Manual]&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8993</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8993"/>
		<updated>2026-05-28T18:41:12Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis ROS2 Software]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system.&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline.&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline.&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline.&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment.&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods.&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation.&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation.&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach.&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm.&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration.&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights.&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector.&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking.&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images.&lt;br /&gt;
* Live camera stream testing produced mixed results.&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance.&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines.&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected, however false detections and random line generation frequently occurred.&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection.&lt;br /&gt;
* Only &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations.&lt;br /&gt;
* Additional filtering and depth processing could improve robustness.&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment.&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 &#039;&#039;&#039;MarkerArray&#039;&#039;&#039; visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8992</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8992"/>
		<updated>2026-05-28T18:40:23Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system.&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline.&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline.&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline.&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment.&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods.&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation.&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation.&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach.&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm.&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration.&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights.&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector.&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking.&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images.&lt;br /&gt;
* Live camera stream testing produced mixed results.&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance.&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines.&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected, however false detections and random line generation frequently occurred.&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection.&lt;br /&gt;
* Only &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations.&lt;br /&gt;
* Additional filtering and depth processing could improve robustness.&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment.&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 &#039;&#039;&#039;MarkerArray&#039;&#039;&#039; visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8991</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8991"/>
		<updated>2026-05-28T18:38:16Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* RViz Visualization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected, however false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, &#039;&#039;&#039;jsk-visualization&#039;&#039;&#039; was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 &#039;&#039;&#039;MarkerArray&#039;&#039;&#039; visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8990</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8990"/>
		<updated>2026-05-28T18:37:15Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Areas for Future Improvement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected, however false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the jsk-visualization package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, jsk-visualization was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 MarkerArray visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8989</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8989"/>
		<updated>2026-05-28T18:34:19Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Current Results */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected, however false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only people_detection_pose_segmentation.py was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the jsk-visualization package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, jsk-visualization was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 MarkerArray visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8988</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8988"/>
		<updated>2026-05-28T18:30:33Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* launch/ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main_launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected and false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only people_detection_pose_segmentation.py was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the jsk-visualization package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, jsk-visualization was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 MarkerArray visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8987</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8987"/>
		<updated>2026-05-28T18:29:23Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* fejemis_vision package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main-launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039; - Launches the cable detection pipeline&lt;br /&gt;
* &#039;&#039;net_test.launch.py&#039;&#039; - Launches the net detection pipeline&lt;br /&gt;
* &#039;&#039;people_test.launch.py&#039;&#039; - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* &#039;&#039;main.py&#039;&#039; - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* &#039;&#039;cable_detection.py&#039;&#039; - Detects cables and linear structures in the environment&lt;br /&gt;
* &#039;&#039;net_detection.py&#039;&#039; - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* &#039;&#039;people_detection_pose_segmentation.py&#039;&#039; - Human detection using pose estimation and segmentation&lt;br /&gt;
* &#039;&#039;people_detection_depth_segmentation.py&#039;&#039; - Human detection using depth-based segmentation&lt;br /&gt;
* &#039;&#039;people_detection_simple_segmentation.py&#039;&#039; - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* &#039;&#039;people_detection_deep_sort.py&#039;&#039; - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* &#039;&#039;cable_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test.py&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_basic.py&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;cable_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;net_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;people_test_images/&#039;&#039;&lt;br /&gt;
* &#039;&#039;other_imgs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* &#039;&#039;yolov4-tiny.cfg&#039;&#039; - YOLOv4-tiny network configuration&lt;br /&gt;
* &#039;&#039;yolov4-tiny.weights&#039;&#039; - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* &#039;&#039;classes.txt&#039;&#039; - Object class labels used by the detector&lt;br /&gt;
* &#039;&#039;mars-small128.pb&#039;&#039; - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected and false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only people_detection_pose_segmentation.py was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the jsk-visualization package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, jsk-visualization was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 MarkerArray visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8986</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8986"/>
		<updated>2026-05-28T18:26:18Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* LD19 LiDAR Sensor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: [https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf LD19_Development Manual]&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8985</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8985"/>
		<updated>2026-05-28T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for environmental perception and object detection using RGB and depth camera data.&lt;br /&gt;
&lt;br /&gt;
Main functionalities include:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Net detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Directory Structure ===&lt;br /&gt;
&lt;br /&gt;
====launch/====&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system and individual detection pipelines.&lt;br /&gt;
&lt;br /&gt;
Main launch files:&lt;br /&gt;
* &#039;&#039;main-launch.py&#039;&#039; - Launches the complete perception system&lt;br /&gt;
&lt;br /&gt;
Testing launch files:&lt;br /&gt;
* cable_test.launch.py - Launches the cable detection pipeline&lt;br /&gt;
* net_test.launch.py - Launches the net detection pipeline&lt;br /&gt;
* people_test.launch.py - Launches the people detection pipeline&lt;br /&gt;
&lt;br /&gt;
These launch files initialize the required ROS 2 nodes, camera subscriptions, and RViz visualization.&lt;br /&gt;
&lt;br /&gt;
==== pyth/ ====&lt;br /&gt;
Contains the main Python source code for the vision and detection system.&lt;br /&gt;
&lt;br /&gt;
Main scripts:&lt;br /&gt;
* main.py - Main ROS 2 vision node coordinating the perception system&lt;br /&gt;
&lt;br /&gt;
Detection scripts:&lt;br /&gt;
* cable_detection.py - Detects cables and linear structures in the environment&lt;br /&gt;
* net_detection.py - Detects net or mesh-like structures using computer vision methods&lt;br /&gt;
* people_detection_pose_segmentation.py - Human detection using pose estimation and segmentation&lt;br /&gt;
* people_detection_depth_segmentation.py - Human detection using depth-based segmentation&lt;br /&gt;
* people_detection_simple_segmentation.py - Simpler segmentation-based human detection approach&lt;br /&gt;
&lt;br /&gt;
Tracking:&lt;br /&gt;
* people_detection_deep_sort.py - Multi-person tracking using the DeepSORT tracking algorithm&lt;br /&gt;
&lt;br /&gt;
Testing scripts:&lt;br /&gt;
* cable_test.py&lt;br /&gt;
* net_test.py&lt;br /&gt;
* people_test_basic.py&lt;br /&gt;
&lt;br /&gt;
These scripts are used for testing and validating the detection pipelines independently.&lt;br /&gt;
&lt;br /&gt;
==== Test Image Directories ====&lt;br /&gt;
The package contains several directories with offline test images used during development and debugging:&lt;br /&gt;
&lt;br /&gt;
* cable_test_images/&lt;br /&gt;
* net_test_images/&lt;br /&gt;
* people_test_images/&lt;br /&gt;
* other_imgs/&lt;br /&gt;
&lt;br /&gt;
These images are used to evaluate the detection models without requiring a live camera stream.&lt;br /&gt;
&lt;br /&gt;
==== deep_learning/ ====&lt;br /&gt;
Contains neural network models and configuration files used by the detection system.&lt;br /&gt;
&lt;br /&gt;
Files include:&lt;br /&gt;
* yolov4-tiny.cfg - YOLOv4-tiny network configuration&lt;br /&gt;
* yolov4-tiny.weights - Pretrained YOLOv4-tiny weights&lt;br /&gt;
* classes.txt - Object class labels used by the detector&lt;br /&gt;
* mars-small128.pb - Feature extraction model used by DeepSORT tracking&lt;br /&gt;
&lt;br /&gt;
The package uses YOLOv4-tiny to achieve lightweight real-time object detection suitable for embedded systems such as Raspberry Pi devices.&lt;br /&gt;
&lt;br /&gt;
==== config/ ====&lt;br /&gt;
Contains configuration files used to tune the perception system.&lt;br /&gt;
&lt;br /&gt;
Typical configuration includes:&lt;br /&gt;
&lt;br /&gt;
* Detection thresholds&lt;br /&gt;
* Camera parameters&lt;br /&gt;
* Segmentation parameters&lt;br /&gt;
* ROS topic settings&lt;br /&gt;
&lt;br /&gt;
These configuration files allow tuning the system without modifying the source code.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
Install OpenCV:&lt;br /&gt;
 pip install opencv-python&lt;br /&gt;
&lt;br /&gt;
Install the required Python packages:&lt;br /&gt;
 pip install -r requirements.txt&lt;br /&gt;
&lt;br /&gt;
=== Make Python Scripts Executable ===&lt;br /&gt;
Before launching the ROS 2 nodes, ensure the Python scripts have executable permissions:&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
=== Launch files ===&lt;br /&gt;
To launch the full perception pipeline:&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
To run individual test pipelines:&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
== Progress and Current State ==&lt;br /&gt;
&lt;br /&gt;
A major part of the work involved converting the original package from ROS 1 to ROS 2 compatibility.&lt;br /&gt;
&lt;br /&gt;
Due to limited project time, only partial testing and validation were completed. Additional development and tuning are still required.&lt;br /&gt;
&lt;br /&gt;
=== Current Results ===&lt;br /&gt;
&lt;br /&gt;
* All detection pipelines were successfully tested offline using stored test images&lt;br /&gt;
* Live camera stream testing produced mixed results&lt;br /&gt;
* People detection and net detection showed the most stable and reliable performance&lt;br /&gt;
* RViz marker visualization worked correctly for several detection pipelines&lt;br /&gt;
* Cable detection was significantly more unstable and noisy. The cables were sometimes correctly detected and false detections and random line generation frequently occurred&lt;br /&gt;
&lt;br /&gt;
=== Areas for Future Improvement ===&lt;br /&gt;
&lt;br /&gt;
* Detection parameters and thresholds were not fully tuned. Additional tuning may significantly reduce detection noise, especially for cable detection&lt;br /&gt;
* Only people_detection_pose_segmentation.py was verified to work reliably during live testing. The remaining human detection methods were not fully investigated due to time limitations&lt;br /&gt;
* Additional filtering and depth processing could improve robustness&lt;br /&gt;
* Performance optimization may still be required for Raspberry Pi deployment&lt;br /&gt;
&lt;br /&gt;
=== RViz Visualization ===&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation used the jsk-visualization package for RViz markers.&lt;br /&gt;
&lt;br /&gt;
At the time of this project, jsk-visualization was not fully compatible with ROS 2. Therefore, the system was modified to use built-in ROS 2 MarkerArray visualization messages instead.&lt;br /&gt;
&lt;br /&gt;
This allowed detected objects and positions to still be visualized in RViz.&lt;br /&gt;
&lt;br /&gt;
== Original ROS 1 Repository ==&lt;br /&gt;
&lt;br /&gt;
The original ROS 1 implementation can be found here: [https://github.com/MP-EL/fejemis_vision MP-EL/fejemis_vision]&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8984</id>
		<title>Fejemis Vision ROS2</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_Vision_ROS2&amp;diff=8984"/>
		<updated>2026-05-28T18:06:03Z</updated>

		<summary type="html">&lt;p&gt;S253734: Created page with &amp;quot; == fejemis_vision package ==  The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for:  * Human detection * Cable detection * Depth-based segmentation * Pose estimation * Object tracking  The package is located in: &amp;#039;&amp;#039;src/fejemis/fejemis_vision&amp;#039;&amp;#039;  launch/: Contains ROS 2 launch files used to start the vision system.   * &amp;#039;&amp;#039;main-launch.py&amp;#039;&amp;#039; - launch full detection  * &amp;#039;&amp;#039;cable_test.launch.py&amp;#039;&amp;#039;, &amp;#039;&amp;#039;net_test.launch.p...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== fejemis_vision package ==&lt;br /&gt;
&lt;br /&gt;
The fejemis_vision package is the computer vision subsystem used in the Fejemis robot platform. It is responsible for:&lt;br /&gt;
&lt;br /&gt;
* Human detection&lt;br /&gt;
* Cable detection&lt;br /&gt;
* Depth-based segmentation&lt;br /&gt;
* Pose estimation&lt;br /&gt;
* Object tracking&lt;br /&gt;
&lt;br /&gt;
The package is located in: &#039;&#039;src/fejemis/fejemis_vision&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
launch/:&lt;br /&gt;
Contains ROS 2 launch files used to start the vision system. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;main-launch.py&#039;&#039; - launch full detection &lt;br /&gt;
* &#039;&#039;cable_test.launch.py&#039;&#039;, &#039;&#039;net_test.launch.py&#039;&#039;, &#039;&#039;people_test.launch.py&#039;&#039; - launches individual detection&lt;br /&gt;
&lt;br /&gt;
pyth/:&lt;br /&gt;
* main.py - Main ROS 2 vision node&lt;br /&gt;
* cable_detection.py - Cable and linear object detection&lt;br /&gt;
* net_test.py - Used for testing and validating the net detection pipeline&lt;br /&gt;
* people_detection_pose_segmentation.py - Human detection using pose estimation and segmentation&lt;br /&gt;
* people_detection_depth_segmentation.py - Human detection using depth-based segmentation&lt;br /&gt;
* people_detection_deep_sort.py - Multi-person tracking using DeepSORT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each detector has a test script to run for testing.These test uses test images to do offline testing of the detection models fromdifferent test images folder.&lt;br /&gt;
&lt;br /&gt;
config/:&lt;br /&gt;
* Configuration files allow tuning the perception system without modifying source code.&lt;br /&gt;
&lt;br /&gt;
deep_learning/:&lt;br /&gt;
* The deep_learning/ directory contains the neural network models and configuration files used by the vision system for object and human detection.&lt;br /&gt;
&lt;br /&gt;
Setup:&lt;br /&gt;
&lt;br /&gt;
* OpenCV should be installed using &amp;quot;pip install opencv-python&amp;quot;&lt;br /&gt;
* The various python packages used can be installed using the requiremtents.txt file by running &amp;quot;pip install requiremtents.txt&amp;quot;&lt;br /&gt;
* To run the scripts using roslaunch make sure to set scripts to be executable permissionns:&lt;br /&gt;
&lt;br /&gt;
 chmod +x main.py&lt;br /&gt;
 chmod +x net_test.py&lt;br /&gt;
 chmod +x people_test_basic.py&lt;br /&gt;
 chmod +x cable_test.py &lt;br /&gt;
&lt;br /&gt;
* To run the main script:&lt;br /&gt;
&lt;br /&gt;
 ros2 launch fejemis_vision main.launch.py&lt;br /&gt;
&lt;br /&gt;
* To run any of the test scripts:&lt;br /&gt;
&lt;br /&gt;
 ros2 launch fejemis_vision cable_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision people_test.launch.py&lt;br /&gt;
 ros2 launch fejemis_vision net.launch.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Progress == &lt;br /&gt;
&lt;br /&gt;
The main work done was to convert this package from ROS1 to compatible with ROS 2. Limited testing was done due to limited time, and more modifying needs to be done.&lt;br /&gt;
&lt;br /&gt;
* Each detections worked on offline testing meaning testing with existing images. &lt;br /&gt;
&lt;br /&gt;
* The result testing each detector from camera stream was mixed. People detection and net detection had the most working detection and displaying the markers in rviz. Cable detectors seems random where it some time detected cables and ofte drawed cables on random places and some time&lt;br /&gt;
&lt;br /&gt;
This can look into:&lt;br /&gt;
&lt;br /&gt;
* The detection parameters was not fully tested and twearked, which can be done to improve the noise expecially for cable detectors.&lt;br /&gt;
&lt;br /&gt;
* From people detection only the  people_detection_pose_segmentation.py observed to work. There other was not invastigated due to limited time and can be further invastigate.&lt;br /&gt;
&lt;br /&gt;
* In the original ROS jsk-visualization was used for markering in Rviz. However at the time of this project this package was not compatible in ROS2. Instead inbuilt marker array was used to draw the object in Rviz. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access the old ROS 1 repository: https://github.com/MP-EL/fejemis_vision&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8931</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8931"/>
		<updated>2026-05-27T14:28:50Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Router */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8928</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8928"/>
		<updated>2026-05-27T14:26:51Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS 2 Network Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8925</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8925"/>
		<updated>2026-05-27T14:25:59Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS 2 Network Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8923</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8923"/>
		<updated>2026-05-27T14:24:29Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== External Computer ROS 2 Setup ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8922</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8922"/>
		<updated>2026-05-27T14:23:52Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup for External Computers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== External Computer Ethernet Setup ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8921</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8921"/>
		<updated>2026-05-27T14:22:09Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS Network files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* &#039;&#039;bash_setup.sh&#039;&#039; - Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* &#039;&#039;bash_setup_aux.sh&#039;&#039; - Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;br /&gt;
&lt;br /&gt;
Additional information about Ethernet configuration and the required ROS 2 network setup on external computers can be found in the [[Electronics]] section.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8920</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8920"/>
		<updated>2026-05-27T14:21:28Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS Network files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* &#039;&#039;bash_setup.sh&#039;&#039; - Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* &#039;&#039;bash_setup_aux.sh&#039;&#039; - Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;br /&gt;
&lt;br /&gt;
To find out how to setup the ethernet and nesaccary script for ROS Network you can find it in [[Electronics]] section.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8919</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8919"/>
		<updated>2026-05-27T14:19:23Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (more info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8918</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8918"/>
		<updated>2026-05-27T14:19:04Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory (More info about this file &#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8917</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8917"/>
		<updated>2026-05-27T14:18:21Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script located in the bin directory. More info in the *&#039;&#039;&#039;[[Fejemis ROS2 Software]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8916</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8916"/>
		<updated>2026-05-27T14:15:30Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The final step is to add the computer Ethernet IP address to the ROS_STATIC_PEERS variable inside the &#039;&#039;bash_setup.sh&#039;&#039; script.&lt;br /&gt;
Locate the following line:&lt;br /&gt;
 export ROS_STATIC_PEERS=&#039;192.168.1.2,192.168.1.3, 192.168.1.4,192.168.1.5&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add the IP address of the local computer to the list if it is not already included. This enables ROS 2 static peer discovery between the Raspberry Pi units and the external computer. Remember to source the bash file.&lt;br /&gt;
&lt;br /&gt;
After the configuration is completed, the computer should be able to discover and communicate with the ROS 2 nodes running on the robot.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8915</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8915"/>
		<updated>2026-05-27T14:10:15Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS Network files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* &#039;&#039;bash_setup.sh&#039;&#039; - Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* &#039;&#039;bash_setup_aux.sh&#039;&#039; - Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8914</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8914"/>
		<updated>2026-05-27T14:09:52Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Convenience commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* bash_setup.sh&lt;br /&gt;
Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* bash_setup_aux.sh&lt;br /&gt;
Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8913</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8913"/>
		<updated>2026-05-27T14:09:18Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS Network Bash Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* bash_setup.sh&lt;br /&gt;
Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* bash_setup_aux.sh&lt;br /&gt;
Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8912</id>
		<title>Fejemis ROS2 Software</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Fejemis_ROS2_Software&amp;diff=8912"/>
		<updated>2026-05-27T14:08:46Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
== Fejemis Software Overview ==&lt;br /&gt;
The Fejemis software is split into multiple components. The full ROS2 workspace and related repositories are available on GitHub: https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This documentation summarises the main software components used on the robot and explains how the system can be distributed across multiple Raspberry Pis (Multi‑Pi setup).&lt;br /&gt;
&lt;br /&gt;
The two primary concerns are:&lt;br /&gt;
* Hardware bridge and low-level microcontroller integration (the Fejemis bridge).&lt;br /&gt;
* The ROS 2 software stack for mapping, perception, and high-level behaviours (the Fejemis ROS2 workspace).&lt;br /&gt;
&lt;br /&gt;
== Fejemis ==&lt;br /&gt;
The top-level &#039;&#039;fejemis&#039;&#039; package is the entry point for the robot stack. It ties the bridge, description, map/localisation, simulation, and vision packages together and installs the main launch files for the complete system.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/robot.launch.py&#039;&#039; - main bringup file for the real robot and multi-Pi setup. It starts the bridge control first and then launches odometry, LiDAR, SLAM, localisation, and vision depending on the selected options.&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - convenience entry point for simulation. It starts &#039;&#039;launch/robot.launch.py&#039;&#039; with &#039;&#039;in_sim=True&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters in &#039;&#039;launch/robot.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - marks whether the launch is running on the auxiliary Raspberry Pi. The default is detected automatically.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; - enables simulation mode.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - runs RTAB-Map in localisation mode when &#039;&#039;true&#039;&#039;.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects the map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack for people, cable, and net detection.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Bridge ==&lt;br /&gt;
The &#039;&#039;fejemis_bridge&#039;&#039; package handles the low-level interface between the main Raspberry Pi and the Teensy controllers. It contains the serial bridge, the command mixer, and the joystick helper nodes used for manual control. See [[Fejemis Bridge ROS2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/bridge.launch.py&#039;&#039; - starts the bridge node itself.&lt;br /&gt;
* &#039;&#039;launch/mixer.launch.py&#039;&#039; - starts the command mixer and joystick input nodes.&lt;br /&gt;
* &#039;&#039;launch/control.launch.py&#039;&#039; - launches the full control side of the bridge stack and forwards the serial-device arguments.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;bridge&#039;&#039; - main bridge executable, published in the &#039;&#039;fejemis&#039;&#039; namespace.&lt;br /&gt;
* &#039;&#039;raubase_core/rcmixer&#039;&#039; - command mixer that combines control inputs.&lt;br /&gt;
* &#039;&#039;joy/game_controller_node&#039;&#039; - joystick/gamepad input node.&lt;br /&gt;
* &#039;&#039;raubase_core/joy_control&#039;&#039; - joystick mode switch node.&lt;br /&gt;
* &#039;&#039;joy_brush_toggle.py&#039;&#039; - button toggle for the brush control.&lt;br /&gt;
* &#039;&#039;joy_linear_actuator.py&#039;&#039; - button toggle for the linear actuator.&lt;br /&gt;
* &#039;&#039;keyboard_teleop_rover.py&#039;&#039; - keyboard teleoperation node that publishes RoverCommand messages.&lt;br /&gt;
* &#039;&#039;twist_to_rover_command.py&#039;&#039; - adapter that converts Twist commands into RoverCommand messages.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;front_device&#039;&#039; - serial device for the front Teensy controller.&lt;br /&gt;
* &#039;&#039;drive_device&#039;&#039; - serial device for the drive Teensy controller.&lt;br /&gt;
* &#039;&#039;log_level&#039;&#039; - logging level for the bridge node.&lt;br /&gt;
* &#039;&#039;in_sim&#039;&#039; and &#039;&#039;is_aux&#039;&#039; - forwarded through the control launch file to select the correct runtime path.&lt;br /&gt;
* Joystick helper settings such as &#039;&#039;joy_topic&#039;&#039;, &#039;&#039;steer_manage_topic&#039;&#039;, &#039;&#039;linear_actuator_topic&#039;&#039;, &#039;&#039;button_index&#039;&#039;, &#039;&#039;initial_brush_on&#039;&#039;, and &#039;&#039;initial_actuator_up&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Description ==&lt;br /&gt;
The &#039;&#039;fejemis_description&#039;&#039; package provides the robot model and URDF/Xacro setup. It is responsible for publishing the robot description and state so the rest of the stack can use the same model.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/model.launch.py&#039;&#039; - generates the URDF from the Xacro description and launches &#039;&#039;robot_state_publisher&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;robot_state_publisher&#039;&#039; - publishes the robot TF tree from the generated &#039;&#039;robot_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - enables simulated time when running in Gazebo or another simulator.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Sim ==&lt;br /&gt;
The &#039;&#039;fejemis_sim&#039;&#039; package contains the Gazebo simulation resources and the simulation bringup. It combines the robot description with the simulation world and connects ROS topics to Gazebo.&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/sim.launch.py&#039;&#039; - starts the full simulation stack.&lt;br /&gt;
&lt;br /&gt;
Nodes in this package:&lt;br /&gt;
* &#039;&#039;ros_gz_sim/create&#039;&#039; - spawns the robot in Gazebo from &#039;&#039;/robot_description&#039;&#039;.&lt;br /&gt;
* &#039;&#039;ros_gz_bridge/parameter_bridge&#039;&#039; - bridges ROS and Gazebo topics.&lt;br /&gt;
* &#039;&#039;raubase_core/rover_2_twist&#039;&#039; - optional adapter that converts rover commands into Twist commands for Gazebo.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;world&#039;&#039; - world file to load, defaulting to &#039;&#039;fejemis_sim::worlds/room.world&#039;&#039;.&lt;br /&gt;
* &#039;&#039;rover_cmd_adapter&#039;&#039; - enables or disables the RoverCommand-to-Twist adapter.&lt;br /&gt;
* &#039;&#039;rviz&#039;&#039; - optional RViz flag provided by the launch file.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Maploc ==&lt;br /&gt;
The &#039;&#039;fejemis_maploc&#039;&#039; package contains the mapping, localisation, navigation, and sensor bringup for the robot. It is the package that ties the RealSense camera, LiDAR, odometry, RTAB-Map, Nav2, and the behaviour-tree layer together. See [[Fejemis Maploc Ros2]] for more detailed information&lt;br /&gt;
&lt;br /&gt;
Launch files:&lt;br /&gt;
* &#039;&#039;launch/lidar.launch.py&#039;&#039; - starts the LiDAR driver and forwards the serial-port and container settings.&lt;br /&gt;
* &#039;&#039;launch/tf.launch.py&#039;&#039; - publishes the static transforms between the robot, camera, and LiDAR frames.&lt;br /&gt;
* &#039;&#039;launch/odometry.launch.py&#039;&#039; - launches the EKF and IMU filter for wheel and IMU odometry.&lt;br /&gt;
* &#039;&#039;launch/map.launch.py&#039;&#039; - starts the map server component for the local map container.&lt;br /&gt;
* &#039;&#039;launch/lifecycle.launch.py&#039;&#039; - starts the Nav2 lifecycle managers.&lt;br /&gt;
* &#039;&#039;launch/planning.launch.py&#039;&#039; - starts the Nav2 planning stack, path follower, behavior server, and coverage server.&lt;br /&gt;
* &#039;&#039;launch/behavior.launch.py&#039;&#039; - starts the BT engine and behavior-tree-related runtime nodes.&lt;br /&gt;
* &#039;&#039;launch/realsense.launch.py&#039;&#039; - starts the RealSense camera driver.&lt;br /&gt;
* &#039;&#039;launch/rtabmap_slam.launch.py&#039;&#039; - starts RTAB-Map SLAM or localisation.&lt;br /&gt;
&lt;br /&gt;
Main nodes and components:&lt;br /&gt;
* &#039;&#039;imu_filter_madgwick_node&#039;&#039; - filters raw IMU data before fusion.&lt;br /&gt;
* &#039;&#039;robot_localization/ekf_node&#039;&#039; - fuses wheel odometry and IMU data.&lt;br /&gt;
* &#039;&#039;ldlidar_stl_ros2&#039;&#039; LiDAR driver - publishes the laser scan used by navigation and SLAM.&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the fixed camera and LiDAR transforms.&lt;br /&gt;
* &#039;&#039;depthimage_to_laserscan_node&#039;&#039; - converts the depth image to a laser scan for the costmaps.&lt;br /&gt;
* &#039;&#039;rtabmap_sync/rgbd_sync&#039;&#039; and &#039;&#039;rtabmap_odom/icp_odometry&#039;&#039; - prepare RGB-D data and odometry for RTAB-Map.&lt;br /&gt;
* &#039;&#039;rtabmap_slam/rtabmap&#039;&#039; - runs SLAM or localisation depending on the launch arguments.&lt;br /&gt;
* &#039;&#039;nav2_map_server::MapServer&#039;&#039; - provides the occupancy grid map.&lt;br /&gt;
* &#039;&#039;nav2_controller/controller_server&#039;&#039;, &#039;&#039;nav2_planner/planner_server&#039;&#039;, &#039;&#039;nav2_behaviors/behavior_server&#039;&#039;, and &#039;&#039;nav2_bt_navigator/bt_navigator&#039;&#039; - navigation and behaviour nodes.&lt;br /&gt;
* &#039;&#039;nav2_lifecycle_manager/lifecycle_manager&#039;&#039; - manages the Nav2 lifecycle transitions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/nav2_cmd_vel_deg_relay.py&#039;&#039; - relays Nav2 velocity commands into the robot control format.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/brush_control_service.py&#039;&#039; - exposes the brush control service used by the planning stack.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/complete_coverage_planner.py&#039;&#039; and &#039;&#039;fejemis_maploc/fixed_complete_coverage_planner.py&#039;&#039; - coverage planners for generating full-field coverage actions.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/mission_trigger.py&#039;&#039; - publishes the cleaning mission and supporting blackboard values.&lt;br /&gt;
* &#039;&#039;fejemis_maploc/rviz_goal_relay.py&#039;&#039; - converts RViz goal clicks into NavigateToPose actions.&lt;br /&gt;
* &#039;&#039;opennav_coverage/opennav_coverage&#039;&#039; - optional coverage server when the coverage packages are available.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;use_sim_time&#039;&#039; - switches the stack to simulated time.&lt;br /&gt;
* &#039;&#039;is_aux&#039;&#039; - used by the top-level bringup to decide which side of the multi-Pi setup launches the sensor stack.&lt;br /&gt;
* &#039;&#039;localization&#039;&#039; - selects between SLAM mode and localisation mode in RTAB-Map.&lt;br /&gt;
* &#039;&#039;map_location&#039;&#039; - selects which RTAB-Map database to load (&#039;&#039;lab&#039;&#039; or &#039;&#039;asta&#039;&#039;).&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - enables the vision stack from the top-level bringup.&lt;br /&gt;
* &#039;&#039;enable_coverage&#039;&#039; - enables the coverage navigation components.&lt;br /&gt;
* &#039;&#039;namespace&#039;&#039; - namespace used by the SLAM and navigation nodes.&lt;br /&gt;
* &#039;&#039;port_name&#039;&#039; - serial port for the LiDAR.&lt;br /&gt;
* &#039;&#039;ld_make_container&#039;&#039;, &#039;&#039;ld_container&#039;&#039;, and &#039;&#039;ld_container_ns&#039;&#039; - control how the LiDAR node is placed in its component container.&lt;br /&gt;
* &#039;&#039;camera_namespace&#039;&#039; - namespace passed to the RealSense driver.&lt;br /&gt;
* &#039;&#039;world&#039;&#039;, &#039;&#039;rover_cmd_adapter&#039;&#039;, and &#039;&#039;rviz&#039;&#039; - simulation parameters forwarded from the top-level bringup.&lt;br /&gt;
&lt;br /&gt;
== Fejemis Vision ==&lt;br /&gt;
The &#039;&#039;fejemis_vision&#039;&#039; package provides the vision pipeline for the robot. In the current bringup, only the nodes launched from &#039;&#039;launch/main.launch.py&#039;&#039; are listed here. See [[Fejemis Vision ROS2]] for more detailed information.&lt;br /&gt;
&lt;br /&gt;
Nodes launched in &#039;&#039;launch/main.launch.py&#039;&#039;:&lt;br /&gt;
* &#039;&#039;tf2_ros/static_transform_publisher&#039;&#039; - publishes the test camera transform when both &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;test_static_tf&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;rviz2/rviz2&#039;&#039; - opens RViz with the vision configuration when &#039;&#039;enable_vision&#039;&#039; and &#039;&#039;open_rviz&#039;&#039; are true.&lt;br /&gt;
* &#039;&#039;fejemis_vision/main.py&#039;&#039; - runs the main vision node when &#039;&#039;enable_vision&#039;&#039; is true.&lt;br /&gt;
&lt;br /&gt;
Configurable parameters:&lt;br /&gt;
* &#039;&#039;enable_vision&#039;&#039; - master switch for the vision stack.&lt;br /&gt;
* &#039;&#039;open_rviz&#039;&#039; - opens RViz for the vision stack when enabled.&lt;br /&gt;
* &#039;&#039;test_static_tf&#039;&#039; - adds a temporary static transform for camera frame testing.&lt;br /&gt;
* The main vision node also loads &#039;&#039;config/main.yaml&#039;&#039; and uses &#039;&#039;use_sim_time=False&#039;&#039; in this launch file.&lt;br /&gt;
&lt;br /&gt;
== Multi pi setup ==&lt;br /&gt;
This system supports a multi‑Pi arrangement where some hardware (for example, a RealSense camera or other sensors) runs on an auxiliary Raspberry Pi while the main robot and ROS 2 stack run on the primary Pi.&lt;br /&gt;
&lt;br /&gt;
Recommended minimal steps for a Multi‑Pi setup:&lt;br /&gt;
&lt;br /&gt;
1. Network and host setup&lt;br /&gt;
* Ensure all Pis are on the same local network (switch, VLAN or Wi‑Fi SSID) and can reach each other via IP.&lt;br /&gt;
* Prefer DHCP reservations or static IPs for each Pi to simplify configuration.&lt;br /&gt;
&lt;br /&gt;
2. SSH and automation&lt;br /&gt;
* Install SSH keys on each Pi so you can run remote commands and automation without passwords.&lt;br /&gt;
&lt;br /&gt;
3. Clone the workspace and install dependencies&lt;br /&gt;
On each Pi that needs software from the repository, clone the workspace and run the provided install scripts:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
git clone https://github.com/Melvin-Angel/Fejemis_Workspace_2026.git&lt;br /&gt;
cd Fejemis_Workspace_2026&lt;br /&gt;
./install.sh&lt;br /&gt;
source ./activate.sh&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
4. Camera / sensor hosts&lt;br /&gt;
* If the camera is on an auxiliary Pi, run the camera driver or streaming node there and expose the expected ROS topics across the network.&lt;br /&gt;
* In this workspace the mapping components expect RealSense RGB‑D topics; when the camera is on an aux Pi you can launch the camera remotely. Example (run on the primary Pi to start the aux launch):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis_maploc realsense.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
5. Time sync and reliability&lt;br /&gt;
* Enable NTP or systemd‑timesyncd on all Pis so timestamps on messages line up for logging and perception.&lt;br /&gt;
&lt;br /&gt;
=== Convenience commands ===&lt;br /&gt;
These helper commands make working with a two‑Pi setup easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis launch_aux&#039;&#039; — start a launch file on an auxiliary Pi from the primary Pi. This is commonly used to start camera or sensor nodes remotely. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis launch_aux fejemis robot.launch.py&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;fejemis sync_clocks&#039;&#039; — synchronise system clocks across Pis (uses SSH and sudo on targets). Run this before recording or starting perception stacks so timestamps align. Example:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fejemis sync_clocks&lt;br /&gt;
```&lt;br /&gt;
== Network Configuration ==&lt;br /&gt;
&lt;br /&gt;
== ROS Network Bash Files ==&lt;br /&gt;
&lt;br /&gt;
The bash scripts used for configuring the ROS 2 network are located in the bin/ directory:&lt;br /&gt;
* bash_setup.sh&lt;br /&gt;
    ** Configures the ROS 2 network settings for the Main Raspberry Pi&lt;br /&gt;
* bash_setup_aux.sh&lt;br /&gt;
    ** Configures the ROS 2 network settings for the Aux Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
These scripts set up:&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
* CycloneDDS configuration&lt;br /&gt;
* Static peer discovery&lt;br /&gt;
* Network interface binding for Ethernet communication&lt;br /&gt;
&lt;br /&gt;
The scripts are automatically sourced during system startup, ensuring that the ROS 2 network is configured correctly whenever the Raspberry Pi units boot.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8910</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8910"/>
		<updated>2026-05-27T13:55:59Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Ethernet Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
== ROS 2 Network Setup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The computer should then be able to discover and communicate with the ROS 2 nodes running on the Raspberry Pi units.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_file&amp;diff=8909</id>
		<title>CycloneDDS Configuration file</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_file&amp;diff=8909"/>
		<updated>2026-05-27T13:54:07Z</updated>

		<summary type="html">&lt;p&gt;S253734: Created page with &amp;quot;The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.  &amp;lt;CycloneDDS&amp;gt;    &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;      &amp;lt;General&amp;gt;        &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;        &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;      &amp;lt;/General&amp;gt;    &amp;lt;/Domain&amp;gt;  &amp;lt;/CycloneDDS&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.&lt;br /&gt;
 &amp;lt;CycloneDDS&amp;gt;&lt;br /&gt;
   &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;General&amp;gt;&lt;br /&gt;
       &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;&lt;br /&gt;
       &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;&lt;br /&gt;
     &amp;lt;/General&amp;gt;&lt;br /&gt;
   &amp;lt;/Domain&amp;gt;&lt;br /&gt;
 &amp;lt;/CycloneDDS&amp;gt;&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8908</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8908"/>
		<updated>2026-05-27T13:53:26Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration file]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The computer should then be able to discover and communicate with the ROS 2 nodes running on the Raspberry Pi units.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8907</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8907"/>
		<updated>2026-05-27T13:52:27Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration File]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
Then add the ROS 2 environment variables to the terminal setup file, for example .bashrc:&lt;br /&gt;
 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 export ROS_DOMAIN_ID=0&lt;br /&gt;
 export CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
After saving the file, reload the terminal:&lt;br /&gt;
 source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
The computer should then be able to discover and communicate with the ROS 2 nodes running on the Raspberry Pi units.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_File&amp;diff=8906</id>
		<title>CycloneDDS Configuration File</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_File&amp;diff=8906"/>
		<updated>2026-05-27T13:49:28Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;CycloneDDS&amp;gt;&lt;br /&gt;
    &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;General&amp;gt;&lt;br /&gt;
        &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;&lt;br /&gt;
        &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;&lt;br /&gt;
      &amp;lt;/General&amp;gt;&lt;br /&gt;
    &amp;lt;/Domain&amp;gt;&lt;br /&gt;
  &amp;lt;/CycloneDDS&amp;gt;&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_File&amp;diff=8905</id>
		<title>CycloneDDS Configuration File</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=CycloneDDS_Configuration_File&amp;diff=8905"/>
		<updated>2026-05-27T13:48:46Z</updated>

		<summary type="html">&lt;p&gt;S253734: Created page with &amp;quot;&amp;lt;CycloneDDS&amp;gt;   &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;     &amp;lt;General&amp;gt;       &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;       &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;     &amp;lt;/General&amp;gt;   &amp;lt;/Domain&amp;gt; &amp;lt;/CycloneDDS&amp;gt;  The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;CycloneDDS&amp;gt;&lt;br /&gt;
  &amp;lt;Domain id=&amp;quot;any&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;General&amp;gt;&lt;br /&gt;
      &amp;lt;NetworkInterfaceAddress&amp;gt;192.168.1.5&amp;lt;/NetworkInterfaceAddress&amp;gt;&lt;br /&gt;
      &amp;lt;AllowMulticast&amp;gt;true&amp;lt;/AllowMulticast&amp;gt;&lt;br /&gt;
    &amp;lt;/General&amp;gt;&lt;br /&gt;
  &amp;lt;/Domain&amp;gt;&lt;br /&gt;
&amp;lt;/CycloneDDS&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The IP address in NetworkInterfaceAddress must match the Ethernet IP address of the local computer.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8904</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8904"/>
		<updated>2026-05-27T13:48:05Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup on External Computer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in section above.&lt;br /&gt;
&lt;br /&gt;
The following [[CycloneDDS Configuration File]] must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Operating range (min–max): 0.6 m – 6 m&lt;br /&gt;
* Depth resolution &amp;amp; FPS: 1280×720 up to 90 FPS&lt;br /&gt;
* Depth field of view (HxV): 86° × 57°&lt;br /&gt;
* Components: RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* Module dimensions: 124 mm × 29 mm × 26 mm&lt;br /&gt;
* System interface type: USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8900</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8900"/>
		<updated>2026-05-27T13:45:31Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in [[Setup for External Computers]].&lt;br /&gt;
&lt;br /&gt;
The following CycloneDDS configuration must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The Intel RealSense Depth Camera D455 provides RGB‑D sensing used for mapping, localization and obstacle detection. It is supported by the &#039;&#039;realsense2_camera&#039;&#039; ROS driver and integrates directly with the mapping components in this workspace (RTAB‑Map expects the standard RealSense RGB‑D topics).&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* **Operating range (min–max):** 0.6 m – 6 m&lt;br /&gt;
* **Depth resolution &amp;amp; FPS:** 1280×720 up to 90 FPS&lt;br /&gt;
* **Depth field of view (HxV):** 86° × 57°&lt;br /&gt;
* **Components:** RGB sensor: Yes; Tracking module: Yes&lt;br /&gt;
* **Module dimensions:** 124 mm × 29 mm × 26 mm&lt;br /&gt;
* **System interface type:** USB 3.1&lt;br /&gt;
Product specifications and details: [https://www.intel.com/content/www/us/en/products/sku/205847/intel-realsense-depth-camera-d455/specifications.html Intel RealSense Depth Camera D455 - Specifications]&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8898</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8898"/>
		<updated>2026-05-27T13:44:36Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS 2 Network Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
=== Setup on External Computer ===&lt;br /&gt;
&lt;br /&gt;
To access ROS 2 topics from a local computer, the computer must be connected to the robot router through Ethernet.&lt;br /&gt;
&lt;br /&gt;
Configure the computer with a static IP address on the same subnet as the Raspberry Pi units as described in [[]].&lt;br /&gt;
&lt;br /&gt;
The following CycloneDDS configuration must be created on the local computer:&lt;br /&gt;
&lt;br /&gt;
File location:&lt;br /&gt;
 ~/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8897</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8897"/>
		<updated>2026-05-27T13:42:34Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* ROS 2 Network Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8896</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8896"/>
		<updated>2026-05-27T13:41:35Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Ethernet Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== ROS 2 Network Setup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ROS 2 network is configured so that the Raspberry Pi units and an external computer can communicate over the robot Ethernet network.&lt;br /&gt;
&lt;br /&gt;
The setup is already configured on the Raspberry Pi units. This includes:&lt;br /&gt;
&lt;br /&gt;
* Static Ethernet IP addresses&lt;br /&gt;
&lt;br /&gt;
* ROS 2 environment variables&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS as the selected RMW implementation&lt;br /&gt;
&lt;br /&gt;
* CycloneDDS network interface configuration&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi setup uses the following ROS 2 settings:&lt;br /&gt;
&lt;br /&gt;
 ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST&lt;br /&gt;
&lt;br /&gt;
 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp&lt;br /&gt;
&lt;br /&gt;
 ROS_DOMAIN_ID=0&lt;br /&gt;
&lt;br /&gt;
 CYCLONEDDS_URI=file://$HOME/.config/cyclonedds/cyclonedds.xml&lt;br /&gt;
&lt;br /&gt;
The CycloneDDS configuration binds ROS 2 communication to the Ethernet interface. This prevents ROS 2 from using the wrong network interface, such as Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The linear actuator used is a 12V DC actuator from Transmotec with a 10:1 gear ratio, 250 N maximum force, and a 150 mm stroke length.&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://transmotec.com/product/DLA-12-10-A-150-HS2-IP65/&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8889</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8889"/>
		<updated>2026-05-27T13:14:59Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* LD19 LiDAR Sensor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD19 LiDAR Sensor ===&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8888</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8888"/>
		<updated>2026-05-27T13:14:49Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* LD19 LiDAR Sensor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LD19 LiDAR Sensor ==&lt;br /&gt;
&lt;br /&gt;
The LD19 is a 2D DTOF LiDAR sensor used for obstacle detection, mapping, and localization in the Fejemis platform.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information and full documentation: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8887</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8887"/>
		<updated>2026-05-27T13:11:57Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
= Other features =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LD19 LiDAR Sensor ==&lt;br /&gt;
The LD19 is a compact 2D DTOF (Direct Time-of-Flight) LiDAR used on Fejemis for 360° environmental scanning. It is primarily used for obstacle detection, localization, and map generation in ROS 2.&lt;br /&gt;
&lt;br /&gt;
Technical specifications:&lt;br /&gt;
* Scanning range: 360°&lt;br /&gt;
* Scan frequency: 10 ± 0.1 Hz&lt;br /&gt;
* Sampling rate: 4500 measurements per second&lt;br /&gt;
* Communication interface: UART&lt;br /&gt;
* Baud rate: 230400 bit/s&lt;br /&gt;
* Supply voltage: 5V (4.5V–5.5V)&lt;br /&gt;
* Typical logic level: 3.3V&lt;br /&gt;
&lt;br /&gt;
More information can be acsess her: https://www.elecrow.com/download/product/SLD06360F/LD19_Development%20Manual_V2.3.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The Fejemis brush unit is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8879</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8879"/>
		<updated>2026-05-27T12:57:17Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis 2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
= Linear actuator =&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
= Lidar =&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
= Realsense D455 =&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8878</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8878"/>
		<updated>2026-05-27T12:56:34Z</updated>

		<summary type="html">&lt;p&gt;S253734: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[Fejemis_2026]]&lt;br /&gt;
&lt;br /&gt;
= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
= Ethernet Network =&lt;br /&gt;
&lt;br /&gt;
== Router ==&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
= Linear actuator =&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
= Lidar =&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
= Realsense D455 =&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
= Teensy Configuration =&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
= Teensy firmware =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
= Electrical =&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
= Battery control =&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8860</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8860"/>
		<updated>2026-05-27T12:25:01Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Raspberry Pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Pi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Pi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
=== System Architecture ===&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Pi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Pi uses an SD card, while the Aux Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8858</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8858"/>
		<updated>2026-05-27T12:24:04Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* System Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Raspi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Raspi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
== Hardware Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
=== System Architecture ===&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Raspi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Raspberry Pi uses an SD card, while the Aux Raspberry Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8857</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8857"/>
		<updated>2026-05-27T12:23:42Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Ethernet Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Raspi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Raspi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
== Hardware Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Raspi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Raspberry Pi uses an SD card, while the Aux Raspberry Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
* Router power supply: 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually. The following settings must be configured:&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8856</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8856"/>
		<updated>2026-05-27T12:22:29Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Ethernet Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Raspi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Raspi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
== Hardware Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Raspi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Raspberry Pi uses an SD card, while the Aux Raspberry Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
&lt;br /&gt;
Router power supply:&lt;br /&gt;
&lt;br /&gt;
* 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually.&lt;br /&gt;
&lt;br /&gt;
The following settings must be configured:&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note: 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8855</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8855"/>
		<updated>2026-05-27T12:21:16Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Network Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Raspi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Raspi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
== Hardware Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Raspi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Raspberry Pi uses an SD card, while the Aux Raspberry Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
&lt;br /&gt;
Router power supply:&lt;br /&gt;
&lt;br /&gt;
* 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
&lt;br /&gt;
* Network/CIDR: 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually.&lt;br /&gt;
&lt;br /&gt;
The following settings must be configured:&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
* 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
* Example valid addresses:&lt;br /&gt;
    ** 192.168.1.10&lt;br /&gt;
    ** 192.168.1.20&lt;br /&gt;
    ** 192.168.1.100&lt;br /&gt;
&lt;br /&gt;
After configuration, the computer should be able to communicate with both Raspberry Pi units over Ethernet.&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8853</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Electronics&amp;diff=8853"/>
		<updated>2026-05-27T12:20:30Z</updated>

		<summary type="html">&lt;p&gt;S253734: /* Setup for External Computers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
The robot uses two Raspberry Pi 5 units, referred to as the &amp;quot;Main&amp;quot; and &amp;quot;Aux&amp;quot; Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Main Raspi&amp;quot; is responsible for core robot functionality and launches the odometry, lifecycle management, and bridge-related ROS nodes.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Aux Raspi&amp;quot; handles the majority of the remaining ROS launch packages, including the computationally intensive perception and support nodes.&lt;br /&gt;
&lt;br /&gt;
== Hardware Specifications ==&lt;br /&gt;
&lt;br /&gt;
=== Main Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 16 GB RAM&lt;br /&gt;
* 60 GB storage (SD card)&lt;br /&gt;
&lt;br /&gt;
=== Aux Raspberry Pi ===&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi 5&lt;br /&gt;
* 8 GB RAM&lt;br /&gt;
* 512 GB external SSD storage&lt;br /&gt;
&lt;br /&gt;
== System Architecture ==&lt;br /&gt;
&lt;br /&gt;
During testing, it was observed that the Main Raspi could not reliably handle all ROS launch packages simultaneously. To improve stability and performance, most workloads were therefore moved to the Aux Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
One likely reason for this difference is the storage medium. The Main Raspberry Pi uses an SD card, while the Aux Raspberry Pi uses an external SSD, which provides significantly faster read/write performance and better handling of high I/O workloads generated by ROS 2 nodes, logging, and vision processing.&lt;br /&gt;
&lt;br /&gt;
This split architecture allows the robot to distribute computational load more effectively and improves overall system responsiveness and reliability.&lt;br /&gt;
&lt;br /&gt;
== Ethernet Network ==&lt;br /&gt;
&lt;br /&gt;
=== Router ===&lt;br /&gt;
The router is used to connect the Raspberry Pi units and external devices on the robot network. It allows communication between the onboard computers and provides Ethernet access for external computers during development, debugging, and monitoring.&lt;br /&gt;
&lt;br /&gt;
The router has a total of five Ethernet ports:&lt;br /&gt;
&lt;br /&gt;
* Two ports are currently occupied by the Main and Aux Raspberry Pi units&lt;br /&gt;
* The remaining ports can be used to connect external computers directly to the robot network&lt;br /&gt;
&lt;br /&gt;
Router power supply:&lt;br /&gt;
&lt;br /&gt;
* 5V / 0.6A&lt;br /&gt;
&lt;br /&gt;
=== Network Configuration ===&lt;br /&gt;
Network/CIDR:&lt;br /&gt;
&lt;br /&gt;
* 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
Subnet mask:&lt;br /&gt;
&lt;br /&gt;
* 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Ethernet IP Addresses ===&lt;br /&gt;
&lt;br /&gt;
* Main Raspberry Pi: 192.168.1.1&lt;br /&gt;
* Aux Raspberry Pi: 192.168.1.2&lt;br /&gt;
&lt;br /&gt;
=== Setup for External Computers ===&lt;br /&gt;
&lt;br /&gt;
To connect a computer to the robot network through Ethernet, configure the network interface manually.&lt;br /&gt;
&lt;br /&gt;
The following settings must be configured:&lt;br /&gt;
&lt;br /&gt;
* Subnet mask: 255.255.255.0&lt;br /&gt;
* Assign an available static IP address in the range 192.168.1.x&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
* 192.168.1.1 and 192.168.1.2 are already assigned to the Raspberry Pi units and must not be reused&lt;br /&gt;
* Example valid addresses:&lt;br /&gt;
    ** 192.168.1.10&lt;br /&gt;
    ** 192.168.1.20&lt;br /&gt;
    ** 192.168.1.100&lt;br /&gt;
&lt;br /&gt;
After configuration, the computer should be able to communicate with both Raspberry Pi units over Ethernet.&lt;br /&gt;
&lt;br /&gt;
=== Linear actuator ===&lt;br /&gt;
&lt;br /&gt;
The actuator is a ...&lt;br /&gt;
&lt;br /&gt;
=== Lidar ===&lt;br /&gt;
&lt;br /&gt;
The lidar is a ...&lt;br /&gt;
&lt;br /&gt;
=== Realsense D455 ===&lt;br /&gt;
&lt;br /&gt;
The camera is a ...&lt;br /&gt;
&lt;br /&gt;
=== Teensy Configuration ===&lt;br /&gt;
&lt;br /&gt;
[[File:teensy-configuration.png | 600px]]&lt;br /&gt;
&lt;br /&gt;
Figure: The main hardware blocks. Two Teensy processors are the interface to the hardware. The drive processor controls the drive motors, safety and battery system. The front processor controls the brush and the front wheel to lift the brush. A main PC integrates the functionality with additional sensors to allow autonomous operation.&lt;br /&gt;
&lt;br /&gt;
===== Teensy firmware =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis Teensy]] software is build using standard Arduino library configurations.&lt;br /&gt;
The interface to the main PC is organized as text-lines.&lt;br /&gt;
&lt;br /&gt;
===== Electrical =====&lt;br /&gt;
&lt;br /&gt;
[[Fejemis electrical]] wiring etc.&lt;br /&gt;
&lt;br /&gt;
=== Battery control ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis battery control]] is a 24V system (2x3cell LiPo 5Ah) with power on-off and measurement electronics. There is on-board chargers for all batteries.&lt;br /&gt;
&lt;br /&gt;
=== Brush unit ===&lt;br /&gt;
&lt;br /&gt;
The [[Fejemis brush unit]] is a commercial brush that comes with its own battery (12V), charger and motor control. The unit is slightly modified to to allow measurement and control from the software.&lt;/div&gt;</summary>
		<author><name>S253734</name></author>
	</entry>
</feed>