

Main pcb
Imperial College London Department of Mechanical Engineering
- Size
- 30.2 × 50.1 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 43
- Nets
- 72
- Pads
- 198
- Tracks, vias
- 607, 78
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 5 (file 20171130)
- Created
- 16 Jan 2020
- Updated
- 9 Jun 2020
Overview
Main pcb is an open-source printed circuit board by Nickick-ICRS, from the Nickick-ICRS/PuLSAR repository on GitHub. It is a 2-layer board of 30.2 × 50.1 mm with 43 parts on 72 nets, routed with 607 tracks and 78 vias.
It is built around the ESP32-WROOM-32D, BMX055 and S-1170B33UC-OTSTFG, with the TCA9544APW among its other parts. Its parts include 18 resistors, 6 capacitors and 3 diodes. It belongs with the ESP32 boards of this library.
Main components
4ESP32-WROOM-32D
-- WiFi Modules ROHSEspressif SystemsWiFi ModulesBMX055
LGA-20(3x4.5)-40℃~+85℃ 12bit、16bit 2.4V~3.6V 62uA IMU (accelerometer + gyroscope) Motion event detection SPI、I2C X,Y,Z X,Y,Z ±16g ±2000dps LGA-20(3x4.5) Accelerometers ROHSBosch SensortecAccelerometersS-1170B33UC-OTSTFG
SOT-89-5-40℃~+85℃@(Ta) 1 120uV@(300mA) 3.3V 6.5V 70dB@(1.0kHz) 800mA 80uA Fixed Over Current Protection、Enable、Thermal Shutdown Positive SOT-89-5 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSABLICVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsTCA9544APW
TSSOP-20-40℃~+85℃ 1.65V~5.5V 10uA 1ns@50pF 2uA 7mA Level shifting、Hot-swap protection Single Supply TSSOP-20 Signal Switches, Multiplexers, Decoders ROHSTexas InstrumentsSignal Switches, Multiplexers, Decoders
README
README.mdPuLSAR - Probabilistic Localisation of SwArm Robots
ME4 Master's Project of Nick Hafner
Supervised by Dr Ravi Vaidyanathan
Imperial College London Department of Mechanical Engineering
Overview of repository
This repository contains the code to localise a swarm of PuLSARs. The code is research code and no liability can be taken for any losses owing to the direct or indirect usage of this code.
The repository also contains CAD files for the Kicad PCB and Solidworks models.
Example Usage
First follow the installation instructions below.
Running Gazebo
(In a new terminal) To launch a Gazebo-simulated swarm of 20 robots with the Group Motion state machine:
$ roslaunch pulsar_gazebo multiple_robots.launch num_robots:=20 state_machine_type:=group_target.
To launch a Gazebo-simulated swarm of 10 robots with no state machine running:
$ roslaunch pulsar_gazebo multiple_robots.launch num_robots:=10 run_state_machine:=false
Running Localisation Algorithms
(With Gazebo running, in a new terminal) To launch PSOSwarmPoseEstimator with a swarm of 20 robots:
$ roslaunch pulsar_localisation localisation.launch num_robots:=20 localiser:=pso robot_model:=scan_matching.
To launch AverageMCLSwarmPoseEstimator with a swarm of 10 robots and the odometry robot model:
$ roslaunch pulsar_localisation localisation.launch num_robots:=10 localiser:=average_swarm_mcl robot_model:=odometry.
To launch MCLSwarmPoseEstimator with a swarm of 5 robots and the scan matching robot model, debugging using Valgrind//KCacheGrind:
$roslaunch pulsar_localisation localisation.launch num_robots:=5 localiser:=mcl robot_model:=scan_matching valgrind:=true.
etc...
Changing Algorithm Parameters
Edit pulsar_localisation's localisation.launch file. See the package README or file comments for details on what parameters do.
Requirements
Building
This repository used Catkin to build the sub-components. This is installed along with ROS - this set of packages has been written to run with ROS Melodic on Ubuntu 18.04 with Bash. Please start by installing ROS Melodic before attempting to install any of these packages.
Create the following directory layout:
catkin_ws
-> srcRun
cd catkin_ws/src && catkin_init_workspace && cd .. && catkin_make
to generate the initial workspace. After this, clone this repository into the src folder:
cd src && git clone <this package url>
Install the required dependencies:
cd PuLSAR && ./install_dependencies.sh
Finally build the full set of packages:
cd ../.. && catkin_make
Package Layout
pulsar_cad
This package contains the CAD files needed to manufacture the PuLSAR robots. Solidworks and Kicad were used for mechanical and electrical design respectively. Kicad is free, however Solidworks will require a license to view files.
pulsar_description
This package contains the stl meshes and urdf files required for the robot description in the ROS ecosystem. URDF has been split up into multiple files, with urdf/pulsar.urdf.xacro the top level URDF file.
pulsar_gazebo
This package contains files relevant to simulating PuLSAR in the Gazebo robot simulator.
Launch
The launch folder contains the roslaunch files necessary to launch the simulation environment. one_robot.launch launches a single robot, while multiple_robots.launch will spawn multiple robots.
One Robot
This launch file spawns one pulsar robot with accompanying nodes (not localisation) in the Gazebo simulator, optionally starting the simulator. It is supposed to be called recursively from multiple_robots.launch, but exposes the following parameters if a user wishes to use it:
- robot_ns - The name(space) of the robot. String. Default is 'pulsar_0'.
- launch_gazebo - Whether to launch gazebo or not. Boolean. Default is true.
- start_x - The starting x position of the robot. Decimal. Default is 0.
- start_y - The starting y position of the robot. Decimal. Default is 0.
- start_yaw - The starting yaw position of the robot in radians. Decimal. Default is 0.
- start_z - The starting z height of the robot. Useful for preventing robots from clipping through the floor. Decimal. Default is 0.02.
- run_state_machine - Should the launch file spawn a state machine for the robot. Boolean. Default is true.
- state_machine_type - Which state machine should be spawned (see pulsar_state_machines). String. Default is "default". Options are:
- "default" - Random movement state machine.
- "group_target" - State machine which attempts to group with other robots and move towards a target point.
- map_file - Which map file to use. String. Default is "<location of pulsar_gazebo>/maps/map.yaml".
Multiple Robots
This launch file spawns a swarm of pulsar robots in the Gazebo simulator, and starts the simulator. The robots are spawned in random (valid) positions. It exposes the following parameters:
- num_robots - The numberof robots to spawn. Integer. Default is 5.
- run_state_machine - Should the launch file spawn a state machine for the robot. Boolean. Default is true.
- state_machine_type - Which state machine should be spawned (see pulsar_state_machines). String. Default is "default". Options are:
- "default" - Random movement state machine.
- "group_target" - State machine which attempts to group with other robots and move towards a target point.
- map_file - Which map file to use. String. Default is "<location of pulsar_gazebo>/maps/map.yaml".
pulsar_hardware
Contains code to be compiled for the ESP-32 on the robots. Note that due to the impacts of COVID-19 on the university and project, robots could not be tested. As such this package is unfinished and has been included for completion.
pulsar_lib
Contains custom libraries used both in simulation and in hardware such as EKF, PI controllers and Odometry.
pulsar_localisation
Contains the developed localisation algorithms and surrounding infrastructure. It also contains the localisation launch file.
Launch
The launch file will run one of the localisation algorithms developed as part of this project. This should only be launched once all the robots have successfully been loaded into Gazebo. It has the following command line parameters:
- num_robots - The number of robots to localise. Should match the multiple robots launchfile parameter of the same name. Integer. Default is 1.
- valgrind - Allows the node to be launched under Valgrind for intensive debugging (e.g. function call counts). Takes precedence over gdb. Boolean. Default is false.
- gdb - Allows the node to be launched in gdb for debugging with breakpoints etc. Boolean. Default is false.
- localiser - Which localisation algorithm to use. String. Default is "mcl". Options are:
- mcl - Runs the MCLSwarmPoseEstimator algorithm.
- average_swarm_mcl - Runs the AverageMCLSwarmPoseEstimator algorithm. This algorithm was found to perform best.
- pso - Runs the PSOSwarmPoseEstimator algorithm.
- robot_model - Picks which robot model to use. Note that PSO only supports scan_matching. String. Default is "odometry". Options are:
- odometry - The odometry motion model (variant of Thrun et al.'s (2010) odometry_motion_model). Found to perform best.
- scan_matching - The scan matching model.
For finer details on this launch file see the pulsar_localisation README.
pulsar_server
Contains code to connect to robots via TCP, effectively the bridge between ROS and individual robots. Unfinished due to COVID-19, but included for completion.
pulsar_state_machines
Contains robot state machines for swarm movement. Two state machines exist:
- Random Movement - move randomly
- Group Movement - form a group and move to a target
Node
The state_machine node runs a state machine for a given robot. It takes the following parameters:
- state_machine - Which state machine to use. String. Default is "default". Options are:
- default - The default, random movement state machine.
- group_target - The group motion state machine.
- robot_ns - The robot name(space). String. Default is "pulsar_0".
- update_freq - The state machine update frequency in Hz. Decimal. Default is 10.
- delay - Delay the start of state machine logic in seconds. Decimal. Default is 0.
Parts
43| Qty | Value | Footprint | References |
|---|---|---|---|
| 8 | 4k7 | Resistor_SMD:R_0805_2012Metric | R7, R8, R10, R11, R12, R13, R14, R15 |
| 4 | 100 | Resistor_SMD:R_0805_2012Metric | R3, R4, R5, R6 |
| 4 | 100n | Capacitor_SMD:C_0805_2012Metric | C1, C2, C3, C5 |
| 4 | Conn_01x01 | Connector_PinHeader_1.00mm:PinHeader_1x01_P1.00mm_Vertical | MTR_1A1, MTR_1B1, MTR_2A1, MTR_2B1 |
| 3 | 10k | Resistor_SMD:R_0805_2012Metric | R1, R2, R9 |
| 3 | 470 | Resistor_SMD:R_0805_2012Metric | R16, R17, R18 |
| 3 | Conn_02x03_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Horizontal | LASER1, LASER2, LASER3 |
| 3 | LED | Diode_SMD:D_0805_2012Metric | D1, D2, D3 |
| 2 | 10u | Capacitor_SMD:C_0805_2012Metric | C4, C6 |
| 2 | Conn_01x04 | RS_Downloads:Connector_Pad_4x2.0x2.0mm | ENC1, ENC2 |
| 1 | BMX055 | RS_Downloads:LGA_PACKAGE_20_PINS | IMU1 |
| 1 | Conn_01x02 | Connector_JST:JST_EH_B2B-EH-A_1x02_P2.50mm_Vertical | JST1 |
| 1 | Conn_01x08 | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | UART_PROG1 |
| 1 | DRV8847PWR | RS_Downloads:SOP65P640X120-16N | H-Bridge1 |
| 1 | ESP32-WROOM-32D | RF_Module:ESP32-WROOM-32 | ESP32 |
| 1 | S-1170B33UC-OTSTFG | Package_TO_SOT_SMD:SOT-89-5 | REG_3v3 |
| 1 | TCA9544A | Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm | MPLEX1 |
More from Nickick-ICRS/PuLSAR
2- 2 layers22.8 × 15.6 mm

- 2 layers11 × 16.2 mm

Laser range PCB
Nickick-ICRS/PuLSAR
Imperial College London Department of Mechanical Engineering
6 parts
Similar boards
- 4 layers345 × 213.3 mm

Boom-1-Top
jdotw/OpInst-Bass-1
Three-voice analog synth with a digital control surface using CEM3340, AS3320 and similar discrete analog components.
1,029 parts4 - 2 layers65 × 30 mm

WRO-2025-Future Engineers Canada
teostefan/WRO-2025-Future-Engineers-Canada
Main repository for the joint uOttawa-CarletonU team competing in the WRO Future Engineers 2025 competition.
36 parts2 - 8 layers65 × 52 mm

RouterCoreBaseRevA
botblox/RouterCoreCore-Baseboard-Designs
Open source design files for the breakout board (baseboard) for RouterCore.
127 partsMIT - 2 layers95.3 × 95.3 mm

- 2 layers20.6 × 54.8 mm

- 2 layers

- 2 layers95 × 95 mm

- 4 layers70 × 70 mm

Questions
How big is the Main pcb PCB?
It measures 30.2 × 50.1 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Main pcb use?
43 parts, built around the ESP32-WROOM-32D, BMX055, S-1170B33UC-OTSTFG and TCA9544APW. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Main pcb KiCad files?
From the Nickick-ICRS/PuLSAR repository on GitHub, at the commit this page was made from: the board is pulsar_cad/kicad/main_pcb/main_pcb.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Can I use the Main pcb design in my own project?
Its repository states no licence, so its author keeps all rights: ask Nickick-ICRS before reusing the design.