Picture of first iterations of Koke

Koke is the main hardware platform for the development of Schpin. It consists of 3D printed parts and off-the-shelf components.

The manual is in the BETA version. Please do read it properly before attempting to build it, not all information is present, and some of it has to be figured out on the spot.

Bill of materials

We have three categories of items - 3D printed, off the shelf, locally available.

All 3D printed parts are printable on Prusa i3 - style 3D printer with PLA material, and PLA worked for us just fine for now. The only exception is leg tips, which we recommend to print from _some_ sort of flexible material.

Off-the-shelf components like servo motors or Raspberry Pi can be bought on amazon, but there are alternative sources.

Locally available components, like screws, nuts, or wiring, should be available in your local store or in store based on the country you live in. Please do not buy them from cheap materials. We recommend higher grade screws, as the price difference is small, but the quality is much better.

We recommend that you buy more screws than necessary. We can’t ensure that each required screw is accounted for in the model. The same goes for the nuts. We only guarantee that each type of screw used is listed.

Our strategy is: Screws that have the count under 100, we buy either sets of 50 or 100. For screws that have the count over 100 we buy in multiples of 200.

count part
4 18650 battery
2 Bat PCB
28 Cylinder M2x12 screw
4 Cylinder M2x6 screw
145 Cylinder M2x8 screw
4 Cylinder M3x16 screw
8 Cylinder M3x5 screw
16 Cylinder M3x8 screw
12 LX15D servomotor
124 M2 nut
4 SCAD: LX15D_BU_body()
8 SCAD: LX15D_BU_plate()
12 SCAD: LX15D_U_body(T24)
12 SCAD: LX15D_U_plate(T24)
12 SCAD: LX15D_U_plate_cable(T24)
12 SCAD: LX15D_U_plate_cable_lock(T24,2.0,2.0)
8 SCAD: LX15D_cable_holder_B_body(part_i=0.0, z_offset=2.0, h=8.0, w=22.95, t=2.0, off=[30.0,0.0,14.75], screw_off=[28.0,0.0,14.75], screw_d=2.0, screw_y_offset=8.475)
8 SCAD: LX15D_cable_holder_B_body(part_i=1.0, z_offset=2.0, h=8.0, w=22.95, t=2.0, off=[30.0,0.0,14.75], screw_off=[28.0,0.0,14.75], screw_d=2.0, screw_y_offset=8.475)
8 SCAD: LX15D_cable_holder_C_body(t=2.0, s=2.0, w=29.5, harness_w=23.5)
8 SCAD: LX15D_cable_holder_C_lock(t=2.0, s=2.0, w=29.5, harness_w=23.5)
2 SCAD: bat_holder()
1 SCAD: bot_rpi_holder()
8 SCAD: femur_plate([95.0, 0.0, 30.0])
1 SCAD: spine()
4 SCAD: tile_H(T24,5.0,5.0,undef)
4 SCAD: tip()
1 SCAD: top_rpi_holder()
1 rpi4


We were able to fit in depth camera from Intel. Raspberry Pi was able to stream the dataset to a laptop, but we yet have to find a proper WiFi adapter that can handle it.

count part
1 Intel RealSense D415
2 Cylinder M3x8 screw
8 Cylinder M2x8 screw
4 M2 nut
1 SCAD: bracket()
1 SCAD: realsense_holder()

How to build

The only guidance for the assembly is this picture for now. We recommend you open the picture itself, which is rendered in high resolution.


Start by assembling the legs and body separately. For 3D printed parts, we recommend inserting nuts into parts as the first step. Keep in mind that they are not required for each slot available on the robot.


The wires that are present with the servomotors are not long enough to handle beta->gama connection. They are also thin, so I do not suggest using them for powering anything.

The servomotors are using 3-pin JST-PH2 connectors. There are two options to solve this: #. Buy the connectors and crimpt custom wires #. Buy better cables with these connectors (available on aliexpress, we tested them and they seem OK) and extend their wires

General wiring scheme is to connect servomotors for each leg in a chain and use parts to hold them in place. Do not expect the connectors to handle the stress - always attach the wire to something.

Base (alpha) joint of each leg should be connector into the USB->serial adapter board. (TODO: this in part list)

Optionally: We have custom PCB design for JST-PH2 connectors and XT30 connectors that serves as power distribution. (TODO: link!) The PCB makes it tidier, but is not necessary.

How to install

(NOTE: ansible moved to ROS2 recently, needs some manual help)

We use 64-bit Ubuntu 20.04 for Raspberry Pi 4.


This is required because this is only supported distro by ROS Foundation itself.

For simplification of software setup, we rely on Ansible for part of the setup.
  1. Install ubuntu on RPI
  2. Install and configure ssh daemon (we recommend to use ssh key login)
  3. Set a good host name for your robot
  4. Clone locally skeleton repo: git clone –recurse-submodules https://gitlab.fi.muni.cz/xkoniar/schpin-skeleton.git
  5. Fill in IP address of your Raspberry in inventory/hosts
  6. Run ansible-playbook main.yml to deploy
    1. Optionally use –ask-become-pass for sudo password
  7. Change inventory/hosts to <hostname>.local, this way, Ansible will always find your robot!
The Ansible setups these things:
  1. Installs ros-noetic-ros-base and additional packages for schpin
  2. Installs avahi - we use this to locate robot on network and communicate with it (also as ROS_HOSTNAME)
  3. Downloads schpin repositories and compiles them


Each servomotor has id 1. To reconfigure this use tool https://github.com/maximkulkin/lewansoul-lx16a and change the ID for each servomotor.

The general scheme we use is (IDs are from the base servo of the leg to the tip of the leg):

leg alfa beta gamma
front left 1 2 3
rear left 11 12 13
rear right 21 22 23
front right 31 32 33


The servomotors are not precise and basic calibration is necessary to center each axis. This is best done with the lewansoul-lx16a tool noted in Configuration.

rest TBD.