Skip to content

Software

naoqi_driver2

By ros-naoqi, from github.com/ros-naoqi/naoqi_driver2 (opens in a new tab)

  • Humanoids and robot learning
  • Driver or SDK
  • Apache-2.0

A ROS 2 node that bridges ROS 2 and NAOqiOS, letting ROS 2 control and read SoftBank/Aldebaran NAO and Pepper robots through libQi.

Facts

GitHub stars
21read on 6 Nov 2026
Last update
22 Jun 2026Newest commit on main
Maintenance
Maintaineda commit in the last 12 months
Difficulty
Intermediate
Hardware it needs, as the project states it
A robot running NAOqi (NAO or Pepper), or a virtual robot on the same machine; a ROS 2 installation. Meshes can only be built on x86(_64) platforms.

Checked on GitHub on 6 Nov 2026.

Licenses

Code
Apache-2.0 (opens in a new tab)

Read by Robotheca from LICENSE (opens in a new tab) (Apache-2.0) at commit 10c4ca9 (opens in a new tab), on 22 Oct 2026.

Commercial use
Yes

Overview

What it does: Robotheca's summary

  • Connects to a robot running NAOqi using libQi and exposes its functions to ROS 2.
  • Makes the robot speak, listen for words through an action, move its head, and drive around via cmd_vel.
  • Opens a public endpoint on a random port by default to support audio extraction; setting qi_listen_url disables audio.
  • Can be launched from a remote machine, from a Docker container, or directly on the robot.
  • Requires a password and switches to TLS on port 9503 for robots running NAOqi 2.9 or higher.
  • Depends on the naoqi_libqi, naoqi_libqicore and naoqi_bridge_msgs packages, with optional meshes for RViz.

Written by Robotheca from the project's README (opens in a new tab) at commit 10c4ca9, not by its creator.

The README

The creator's own README, copied as written: README.md by ros-naoqi, at commit 10c4ca9, under Apache-2.0 (opens in a new tab). The original on GitHub (opens in a new tab).

Read the README here

naoqi_driver2

This repo defines the naoqi_driver package for ROS2. The driver is in charge of providing bridging capabilities between ROS2 and NAOqiOS.

How it works

The naoqi_driver is a ROS node. It connects to a robot running NAOqi using libQi. To support audio extraction, naoqi_driver opens a public endpoint, on a random port by default.

You can set a local endpoint instead by setting the qi_listen_url argument, e.g. qi_listen_url:=tcp://127.0.0.1:12345. In turn, audio extraction will be disabled.

Installation
Dependencies

To run, the driver requires the naoqi_libqi (opens in a new tab), naoqi_libqicore (opens in a new tab) and naoqi_bridge_msgs (opens in a new tab) packages. Those can be installed using apt-get (if they have been released for your ROS distro) or from source. Additionally, pepper_meshes (opens in a new tab) and/or nao_meshes (opens in a new tab) can be useful to display the robot in RViz.

On Ubuntu, install them using:

sudo apt-get install ros-<distro>-naoqi-libqi ros-<distro>-naoqi-libqicore ros-<distro>-naoqi-bridge-msgs ros-<distro>-pepper-meshes ros-<distro>-nao-meshes
Installing from source

In your ROS2 workspace, clone the repo and its dependencies:

cd <ws>/src
git clone https://github.com/ros-naoqi/naoqi_driver2.git
vcs import < naoqi_driver2/dependencies.repos
cd <ws>
rosdep install --from-paths src --ignore-src --rosdistro <distro> -y

To install vcs: sudo apt-get install python3-vcstool

Then build the workspace:

cd <ws>
colcon build --symlink-install

Meshes can only be built on x86(_64) platforms. You can skip them by building with these arguments:

colcon build --packages-skip nao_meshes pepper_meshes
License of the meshes

The source repositories include pepper_meshes2 (opens in a new tab) and nao_meshes2 (opens in a new tab), which require an interactive agreement to be provided. If you agree to their license terms ( CC BY-NC-ND 4.0 (opens in a new tab): pepper_meshes2 LICENSE (opens in a new tab), nao_meshes2 LICENSE (opens in a new tab)). you may skip the interactive prompt by setting the AGREE_TO_NAO_MESHES_LICENSE and I_AGREE_TO_PEPPER_MESHES_LICENSE environment variables:

I_AGREE_TO_NAO_MESHES_LICENSE=1 I_AGREE_TO_PEPPER_MESHES_LICENSE=1 colcon build --symlink-install

Automated jobs on non-interactive environments (DEBIAN_FRONTEND=noninteractive) defaults to agreeing to the licenses, assuming the author of the job has agreed to the license terms.

Launch
Avoid interference with autonomous life

To have full control of the robot with ROS, you may want to disable autonomous behaviors first:

ssh nao@<robot_host>
qicli call ALAutonomousLife.setState disabled
qicli call ALMotion.wakeUp
NAOqi 2.8 and lower

The driver can be launched from a remote machine this way:

source /opt/ros/<distro>/setup.bash # or source <ws>/install/setup.bash if built from source
ros2 launch naoqi_driver naoqi_driver.launch.py nao_ip:=<robot_host>
NAOqi 2.9 and higher

Username and password arguments are required for robots running NAOqi 2.9 or greater:

ros2 launch naoqi_driver naoqi_driver.launch.py nao_ip:=<robot_host> password:=<robot_password>

When password is set, the driver automatically switches TLS on, and switches to port 9503.

From a Docker container

It should work as usual from a Docker container, but to enable audio features, you will need to forward the port the driver listens to. In turn, you should specify the port libQi should listen, e.g. for port 56000:

source /opt/ros/<distro>/setup.bash # or source <ws>/install/setup.bash if built from source
ros2 launch naoqi_driver naoqi_driver.launch.py nao_ip:=<robot_host> qi_listen_url:=tcp://0.0.0.0:56000

Then you must expose (opens in a new tab) it from the container.

On the robot or on the same machine

If you run the driver directly from the robot (or your machine running a virtual robot), you can omit the options:

ros2 launch naoqi_driver naoqi_driver.launch.py
Check that the node is running correctly

Check that the driver is connected:

ros2 node info /naoqi_driver
Hello, world

Make the robot say hello:

ros2 topic pub --once /speech std_msgs/String "data: hello"
Listen to words

You can setup speech recognition and get one result.

ros2 action send_goal listen naoqi_bridge_msgs/action/Listen "expected: [\"hello\"]
language: \"en\""
Move the head

Check that you can move the head by publishing on /joint_angles:

ros2 topic pub --once /joint_angles naoqi_bridge_msgs/JointAnglesWithSpeed "{header: {stamp: now, frame_id: ''}, joint_names: ['HeadYaw', 'HeadPitch'], joint_angles: [0.5,0.1], speed: 0.1, relative: 0}"

You can see the published message with ros2 topic echo /joint_angles

Move around

Check that you can move the robot by publishing on cmd_vel to make the robot move:

ros2 topic pub --once /cmd_vel geometry_msgs/Twist "linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.785"

Make some room around the robot!

To stop the robot, you must send a new message with linear and angular velocities set to 0:

ros2 topic pub --once /cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"
Development

Check how to install the driver from source, or use docker compose to get a more reproducible dev environment:

ROS_DISTRO=iron docker compose up dev --build

To get all logs in live and build debuggable binaries, you may build with this command:

colcon build --event-handlers console_direct+ --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug

It works also when running tests:

colcon test --event-handlers console_direct+ --ctest-args tests
Build Status

Files and versions

Facts read at commit 10c4ca9

Robotheca never hosts the code: each link goes to the creator's own page.

Use it

How to install it, in the creator's words: The project's README (opens in a new tab)

Robotheca doesn't review code. Read it before running it.

Robotheca lists software as a reference: nothing is hosted or run here, and every fact links to where it was read.