Skip to content

Change Log


Getting Started

Support for Linux on ARM

On the PC, the B-Human system can now also be compiled and used on Linux for ARM, i.e. the architecture aarch64 is fully supported. Some compromises are made similar to the support for arm64 on macOS, i.e. our library CompiledNN is replaced by the ONNXruntime and x86 intrinsics are mapped to native instructions by the header-only library sse2neon.


Message Queues

Message queues are B-Human's means to transmit and store sequences of typed data (basically bags). They were reimplemented with a more compact interface, which is now based on iterators rather than message numbers. Some specialized functions were moved to the only places in our code that actually use them to keep the implementation of the message queue compact.

Log Player

The log player was rewritten as well. Log files mainly consist of a streamed message queue and some additional information. They can be rather big (> 3 gb for a typical half of a game). The new log player opens such a file as a memory mapped file to avoid that the whole log is read into memory all at once. Since our code uses some information that would usually require to read through the entire log to compute it, some indices are created when a log file is first opened and then appended to the log file. When the log file is opened again, the indices are read from the file, instead of recomputing them. Thus, instead of reading more then 3 gb, only less than 2 mb have to be read when opening a log file, which significantly speeds up the process.


Robot Detection

We trained a new CNN-based robot detector, which now uses colored images rather than grayscaled ones. A brief description can be found here.

CNN-Based Preprocessing on Lower Camera

A CNN predicts heatmaps for the ball, obstacles, and the penalty mark on the lower camera directly from 320x240 YUYV camera images, leaving the field line detection the only scanline-based method on the lower camera.

Behavior Control

To find the ball more quickly whenever its position is unknown, a new ball search was implemented.


Torso Orientation Estimation

The estimation for the robot torso orientation, which is implemented in the module InertialDataProvider, was improved, to better handle the rough walking. It often caused the estimation to deviate at lot up to a point, which resulted in a worse walking and worse world modeling. Especially the walking started to stumble multiple times in a row in such situations, which was no longer observed at the RoboCup competition.

Motion Control


The walking was improved to better handle worn-out robots, but also large diagonal and sidewards walking steps, which is further described in Walking.

Also the module FootSoleRotationCalibration and its calibration process became obsolet. It orginally corrected mistakes in the torso orientation estimation. Such correction is no longer necessary.

Technical Challenges

B-Human participated in all three technical challenges, more on which you can find here:



Our robotics simulator SimRobot got a graphical overhaul, in particular on macOS (see screenshot in this section). The support for floating windows was removed.

In addition, the library that connects SimRobot to B-Human's robot code was improved in several ways:

Data Views

Data views allow to display and edit data that is published by the macro MODIFY in our robot code. The appearance of these views was streamlined and they now only exchange data with the robot code when they are visible. This allowed to change their creation completely. In the past, they had to be manually added using the console command vd. The command was removed. Instead, views corresponding to all data made available through MODIFY macros in the code are immediately available under the category data of a robot in SimRobot's scene graph, grouped by the threads they are defined in. As the hierarchy suggest, the data is now shown per thread, i.e. there are different views available, e.g. for a BallPercept from the thread Upper and the one from the thread Lower.

Commands per Thread

This per-thread handling is now also available for console commands. The prefix command for allows to specify the threads a certain command is meant for. For instance, for Upper Lower mr BallPercept BallPerceptor defines that in both the threads Upper and Lower a module called BallPerceptor should provide a representation named BallPercept. Under certain conditions that vary between different commands, it is still possible to omit the command prefix for (see this section).

Message ID Mapping

When SimRobot is connected to a real NAO through a network connection, information is exchanged through message queues. While it was already possible to exchange data in the past if SimRobot and the robot code did not have exactly the same version, such a connection was not possible if the number of message ids (i.e. the constants that encode the message types in queues) differed. Now, the number of data message ids is exchanged between SimRobot and the NAO when the connection is established, which allows to map the relevant message ids correctly in most cases.

Deploy Dialog

In the past, B-Human had two different graphical frontends to deploy the code to the robots: On the one hand, a dialog could be displayed after having built for the NAO. It allowed to specify the parameters for the script deploy that actually copies the data to the robot. On the other hand, the B-Human User Shell (bush) could be used to deploy the code to a whole team of robots. However, the layout of the bush made it difficult to increase the maximum jersey number that could be deployed without making the window overly wide. In addition, the software structure was rather complex. Therefore, a new deploy dialog was developed, which replaces the bush and is integrated as part of the build process for the NAO. It is described in this section.

Changes in 2022 and Before

Starting 2023, we will use a public website for the documentation of our annual Code Release. Before, we published a PDF document to highlight changes and give an introduction to our framework. You can find the most recent versions here:

Last update: January 27, 2024