We aim to build an autonomous laboratory for manufacturing coin-cell batteries. This automated system accelerates the research process of discovering/testing new electrolytes by automatically assembling batches of CR2032 coin-cell batteries. It uses 3 robotic arms, a liquid dispensing module, a linear rail, multiple 3D printed parts, and several cameras to achieve automation.
Figure 1. The physical design of the autonomous BatteryLabWe assume that the hardware has been set up properly as illustrated in Figure 1. We will address the hardware requirement in the next section for users that want to build the system from scratch.
The code base can be separated to two parts.
The first part is the BatteryLab directory, which contains code that directly controls the robot, suction system, linear rail, and all the utility functions that rely purely on Python. Users should create a virtual environment with python -m venv lab_venv to install the Python dependencies. Do not use conda environment because they work poorly with ROS 2.
The second part is the ros2_ws directory, which contains several ROS 2 packages. ROS 2 is needed because we physically connect the cameras, linear rails, suction systems to different Raspberry Pis. They communicate with each other using ROS 2 services/topics. For instance, the assembly robot needs to use several cameras, controls the linear rail, and use the suction system to pick up battery components. The suction system and the arm camera is moving with the robotic arm while the fixed camera and linear rail control do not move with the robot. They have to be connected to different Raspberry Pis to avoid cable/pipe length problems.
You can install the Python dependencies with the following commands.
python -m venv lab_venv
source lab_venv/bin/activate
pip install -r requirements.txt
pip install -e .Then you can use the app.py in the root folder to test each of the robot to ensure they work properly individually.
Ensure ROS 2 Jazzy is properly installed in your system. To make things easier, we recommend installing Ubuntu 24.04 to all the Raspberry Pis. You should be able to build the packages by the following commands. Since we use the cv_bridge package to transfer image data among ROS 2 nodes, you may encounter a numpy compatibility issue as listed in Kown Issue 1.
source /opt/ros/jazzy/
cd ros2_ws
colcon buildYou can ssh into each Raspberry Pi to launch each ROS 2 node or use the launch file we prepared for you.
The launch file and the ROS 2 packages are still under development.
Start all the necessary ROS 2 services by running the following commands on specified machines. Note that each of them should be run on different Raspberry Pis.
# on the rail Raspberry Pi
ros2 launch battery_lab_bringup rail_rasp.launch.py
# on the board Raspberry Pi
ros2 launch battery_lab_bringup board_rasp.launch.py
# on the outside Raspberry Pi
ros2 launch battery_lab_bringup out_rasp.launch.pyThen you can start controlling the whole battery lab on any machines that supports ROS 2 and in the same network.
# to control the assembly robot
ros2 run assembly_robot assembly_robot
# to control the liquid handling robot
ros2 run assembly_robot liquid_robot
# to control the crimper robot
ros2 run assembly_robot crimper_robotAlternatively, you can run the general command-line app to run the whole assembly process with just one command.
ros2 run assembly_robot appWe plan to develop a web-based UI for easier control with a graphical interface.
We use the following hardware items. You do not need to use the identical items to achieve the same functionalities, but it would be easy to set up and apply our code if you use the same hardware.
- 2 Mecademic Meca500 robotic arms and 2 MEGP-25E grippers.
- 1 Dobot MG400 robotic arm.
- 1 1500mm Zaber linear rail X-LRT1500BL-E08C.
- 1 Sartorius 1-ch 200 $\mu l$ rLine dispensing module.
- 2 Newport optical breadboards M-PG-23-2-ML.
- 1 DIY suction system.
- 2 Raspberry Pi 5s and 1 Raspberry Pi 4.
- 1 TOB-DF-160 Battery Crimper.
- Many self-designed 3D printable parts.
The assembly robot is a Meca500 on the linear rail. We have a self-designed adaptor to mount a Raspberry Pi on the Zaber AP257-ENG4299 adaptor plate. The suction system can be mounted on top of the Raspberry Pi. There is a 8MP Arducam mounted to the MEGP-25 gripper. The customized gripper has two ending effects: (1) gripper to pick up the spring; (2) the suction cup to pick up other battery components.
Figure 2. The design of the assembly robot.The liquid handling robot is a Dobot MG400. We mount the Sartorius liquid dispening module to the flange with a customized adaptor. The robot needs adaptors to be mounted to the optical breadboard: the base has holes with M5 threads, and we designed 4 M5-M6 holders to mount it safely to the breadboard.
Figure 3. The design of the liquid handling robot.We use a second Meca500 to move the assembled battery to a crimper and then move it to the storage post. The gripper arm is self-designed. We also need a electronic crimper to the right of the robotic arm, which is not illustrated in the 3D design.
Figure 4. The design of the crimping & storage robot.We added a submodule to build the cv_bridge from source to fix this problem. You need to install the Boost Python library to build this package. The required packages can be installed by the following commands.
sudo apt update
sudo apt install libboost-all-devAnd because we have a submodule in the repo. You may need to fetch the submodules before running colcon build.
git submodule update --init --recursive


