Roz is a bioloid quad walker robot

Similar projects worth following
Roz is a bioloid quad walker robot I've been working on sporadically since 2010. I recently redid everything, and am working steadily on it now.

Roz is currently built with 16 AX-12 servos, a bunch of bioloid brackets, a lot of 3D printed parts, and a mix of off-the-shelf and custom made hardware & components. For sensing, Roz has five VL53L1X laser time-of-flight range finder sensors, an MPU-9250 based IMU, and a downward-facing Optical Flow sensor. Roz also has a camera in the nose, hooked up to a Raspberry pi zero w board.

The sensors (except the camera) are controlled by an ARM Cortex M4 board running MicroPython. This board is set up as a Bioloid device on the servo bus, so I can access all the sensors over the bus from the raspberry pi. Roz also has a custom power management board that has an ARM Cortex M4 chip on it, also running MicroPython. This is also on the bus, and manages switching from wall power to the 3S Lipo battery seamlessly.

You can see some videos of Roz (including much earlier ones) on my YouTube Channel, like this one:

  • Roz - Dead Reckoning and Navigation

    Jon Hylands01/27/2021 at 23:38 0 comments

    I wanted to give Roz the capability to (using dead reckoning) navigate to a waypoint. This is a small part of being able to navigate from one place to another, using a non-raster based map. Most robots these days use super-accurate scanning LIDARs and 3D cameras to build up reasonably accurate raster-based maps of the locations that the robot navigates through. I think this is a bad idea, because it simply isn't scalable. We certainly don't navigate that way as humans, and before everyone had GPS maps in their car we didn't navigate that way driving either.

    The way we navigate is to follow paths from one visual landmark to another. We only have a rough idea of where we are at any given point in time, certainly not down to the closest centimeter or even sometimes the closest meter. When you're trying to go from one room in a house to another, it doesn't matter if you're 4 meters from the door or 3 meters - you keep walking until you reach the door. When you go through the door, you follow another path that leads to the next landmark you are looking for, and so on. It doesn't matter exactly where the doorway is, because once you can see it you head towards it until you reach it. You can navigate through a house like that, or from one location to another thousands of kilometers away. It is a very scable navigation and mapping technique.

    For now, Roz will only be doing visual landmark recognition using fiducial tags on doorways and other interesting landmarks. Eventually, I would like Roz or a future version to be able to do sufficient real world landmark recognition with a camera to be able to do away with fiducial tags.

    To get started, however, doing dead reckoning from one location to another (given a heading and a rough distance) is a good place to start. Roz does odometry right now by estimating distance travelled by a combination of the gait speed and the compass heading from the IMU in his head. Its very crude, but for what I'm trying to accomplish I don't need super high accuracy.

    We start at the location (0, 0), and are given a compass heading and the number of mm we should travel. We calculate the (X, Y) end location, and then set up a PID loop, with constants that seem to give reasonably good results.

        self.start_location = self.robot.odometer.position
        radian_heading = math.radians(self.segment.heading)
        self.end_location = XYPoint(self.start_location.x, self.start_location.y)
        self.end_location.x += self.segment.distance * math.cos(radian_heading)
        self.end_location.y += self.segment.distance * math.sin(radian_heading)
        # we've reached the goal when we're less than 150mm from the end location
        self.reached_goal_distance = 150
        end = XYPoint(int(self.end_location.x), int(self.end_location.y))
        log('End location: {}'.format(end))
        self.delta_heading = 0 = 0.007 = 0
        self.kd = 0.0005
        log('Kp: {} Ki: {} Kd: {}'.format(,, self.kd)) = PID(,, self.kd, setpoint=self.delta_heading, output_limits=(-0.5,0.5))

    Once everything is set up, we run in a loop, grabbing the current heading, and calculating the heading offset, which we force to be between -180 and 180 degrees. We feed that delta heading into the PID loop, and get the output value, which is radians per step cycle, and feed that into the robot's inverse kinematics system to tell the robot to turn at that speed as it is walking forwards.

    We also do obstacle detection and avoidance, but I've removed that code from this example for clarity.

        heading = self.robot.imu_sensor.yaw
        heading_to_goal = self.robot.odometer.position.heading_to(self.end_location)
        self.delta_heading = heading_to_goal - heading
        # change delta_heading to be between -180 and 180
        if self.delta_heading < -180:
          self.delta_heading += 360
        elif self.delta_heading > 180:
          self.delta_heading -= 360
        new_r_speed =
        log('|R_Speed,{},{},{}'.format(new_r_speed, heading, self.delta_heading))
    Read more »


    Jon Hylands01/17/2021 at 14:39 0 comments

    I made a new video, that describes a lot about how Roz works, what parts go into the robot, and so on...


    Jon Hylands01/13/2021 at 13:30 0 comments

    Did some work last night on doing a LIDAR scan by rotating the head and using three of the VL53L1X sensors (left, front, and right-facing) to build up a 270 degree scan. Here's a short video showing the scan:

    The scan runs at a resolution of about 0.58 degrees, since that is a function of the servo rotation range (0-300 degrees) and the servo resolution (10 bits). I'm skipping the servo position by 2 to make it run in a reasonble amount of time, so I get 462 sensor readings over a 270 degree arc. As I mention in the video description, Roz only needs to rotate his head 90 degrees to get the full 270 sweep, since the sensors are spaced 90 degrees apart. I'm maxing the results at 1 meter, even though the sensor reads much further than that, because for obstacle avoidance I don't care about stuff farther than that right now.

    You can also see in the video how he shifts his body forward a bunch during the scan, so the side-facing sensors don't end up seeing the front legs at the extreme ends of the scan. This is done using the body IK, basically by adjusting a variable (forward body offset).

    Here's the output:

    Roz is supposed to end up pointing his head in the direction of the largest opening at the end, but I don't think that is quite working yet, since the largest opening is the one on the bottom right, and its not phsyically possible for him to turn his head that far. Regardless, he knows where it is, so he will be able to rotate himself in place to face that direction.

    I did something similar with an earlier version of Roz back in 2015, but I only had Sharp IR sensors, and I was only using the front one, so the resolution was pretty terrible. Same overall concept applies though, and I'm very happy with how this one turned out.

View all 3 project logs

Enjoy this project?



Jon Hylands wrote 01/15/2021 at 11:03 point

Roz when standing actually has 90mm of clearance under the head, which is where the sensor is. Right now I'm not using that sensor, because it takes a long time to get the data using the API I have in Micro Python (it varies, but sometimes upwards of 500ms). I have to take a much closer look at it to see what is happening. Right now the I think the head board has about 10ms free after hitting all the TOF sensors and the IMU, when I'm running it at 50Hz.

  Are you sure? yes | no

David Greenberg wrote 01/15/2021 at 06:09 point

How do you find the optical flow sensor to work? It looks like it's specced for a minimum clearance of 80mm, but it looks like Roz has a lower clearance than that.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates