Skip to main content

QTrobot Computation and networking

QTrobot comes with two computers: i) QTRP, a Raspberry Pi based computer to control the main hardware and ii) QTPC, an Intel® NUC i5/i7 PC to provide more computational power and to accelerate software development cycle. Both computers run on Ubuntu/Debian Linux operating systems and leverage ROS to offer easy-to-use yet very flexible software architecture. QTrobot's hardware is easily extendable via USB-C and USB adaptors, for example, to connect external monitor, keyboard and mouse and sensors.

display

As it is shown in the above diagram, QTRP (in QTrobot's head) is internally connected to QTPC (in QTrobot's body) via ethernet cable. All of the QTrobot devices such as display, speakers, microphone and motors are connected to QTRP except the 3D Camera which is connected directly to QTPC. The Wi-Fi of the QTRP is used to create the QTrobot hotspot with the same SSID as the robot’s serial number (e.g. QTRD000101).

Operating systems

The older versions of QTrobot came with Ubuntu 16. However, we have updated the operating system of both integrated QTrobot’s computers to the latest stable version of Linux. The Nuc PC (QTPC) comes with Ubuntu 20.04 LTS and the Raspberry Pi board (QTRP) at the head uses the latest version of Raspberry Pi OS (Debian Buster). Both computers are updated to latest stable version of ROS Noetic with Python 3 as default. The latest is particularly interesting because its opens accessing wider list of open-source software and libraries which use Python 3 such as recent machine and deep learning libraries, voice processing and recognition software.

Networking

One of the very interesting features of the recent QTrobots, is the new networking architecture. The following diagram demonstrates a common scenario where different devices (e.g., laptops) are connected to the QTrobot via its Wi-Fi hotspot. The Wi-Fi of RaspberryPi is setup to operate in AP/STA mode. That means the RaspberryPi's Wi-Fi can be connected to a home router (as Wi-Fi client) and at the same time operates as hotspot (access point). This has some distinct advantages: By connecting the Wi-Fi of RaspberryPi to the home/office router with the internet, Nuc PC and any other devices which are connected to the hotspot of the QTrobot also get access to the internet. Moreover, laptops and other devices which are in the same network as the home router, can be easily configured to access and control QTrobot via ROS.

Note

Due to Raspberry Pi's Wi-Fi AP/STA mode limitation, not more than two devices can simultaneously connect to QTrobot's hotspot. If you need to connect more than two devices to QTrobot, you can connect them via an external access point such as your home/office router. Please follow Connect QTrobot to a home network and Internet instruction, then connect your other devices (e.g. laptop) to the same router to access the same network as QTrobot.

ROS setup

The roscore runs on QTRP automatically at QTrobot boot time. The QTPC is setup with the correct ROS_MASTER_URI and ROS_IP to access the same ROS network as QTRP. Usually ROS master URI is set to 192.168.4.1 or 192.168.100.1 depending on the QTrobot's version. However, you can easily check it by looking into /home/qtrobot/.bash_aliases file on QTRP:

source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
ROBOT_IP=192.168.4.1
export ROS_MASTER_URI=http://${ROBOT_IP}:11311

The ROS environment is setup in different files on QTRP to make it available to other users (e.g. root user):

  • in /home/qtrobot/.bash_aliases
  • in /etc/environment
  • and in /etc/profile

Catkin workspace

For both QTRP and QTPC, the Catkin workspace is already set up and is accessible under /home/qtrobot/catkin_ws folder. The workspaces also contains some important ROS nodes for QTrobot interfaces such as qt_nuitrack_app, qt_vosk_app and etc. Indeed you can use the same catkin workspace for your own developments but be careful to not remove the src folder within catkin workspace.

Warning
  • You do not need and should not run another instance of roscore neither on QTPC nor QTRP nor any other machine which are in the ROS network of QTrobot.
  • Do not delete the default catkin_ws folders on QTRP nor on QTPC. These folder already used for running some default QTrobot interface nodes such as qt_nuitrack_app on QTPC or qt_vosk_app on QTRP.

QTrobot startup process

The following diagram depicts the default process of QTrobot's startup. Upon turning on the robot (either by plugin the power line or by pressing the power button), the QTRP will boot and set up the network for Lan, Wi-Fi hotspot and connecting to the home/office router (if set up). Then it runs the roscore and launch the QTrobot interfaces such as qt_motor, qt_robot_interface and etc. When the basic interfaces is up and running, it then turn on QTPC via wake-on-lan. QTPC then boot up and start the qt_nuitrack_app interface.

graph LR A(Power on <br/> QTrobot) --> B(turn on <br/> QTRP); B --> B1("Setup networks<br/>ROS environment") B1 --> C(Run motor, face <br/> and other interfaces) B1 --> D(turn on QTPC <br/> via Wake-On-Lan) D --> E(Run nuitrack interface) style A fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style B fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style B1 fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style C fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style D fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style E fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030

Powering off QTrobot almost follows the reverse procedure of powering on. The QTrobot's power button is connected to Raspberry PI and trigs the power off procedure of QTRP. During the shut down process of QTRP, it also sends power off command to QTPC via SSH so that both computers turn off using a single power button. Below is an overview of the power-off process of QTrobot.

graph RL A(Power off <br/> QTrobot) --> B(start shuting down <br/> QTRP); B --> D(stop motor, face <br/> and other interfaces) B --> C("Shutdown QTPC <br/> via SSH command") C --> E(Stop nuitrack interface) style A fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style B fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style C fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style D fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style E fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030

What are autostart scripts?

QTrobot uses some startup scripts (i.e. autostart scripts) for both QTRP and QTPC to start and launch its software and drivers at boot time. Autostart scripts are simply some bash scripts which are executed at QTrobot startup time. There are different set of autostart scripts, one for QTRP and the other set for QTPC. Generally, these scripts prepare QTrobot network, setup ROS environment and launch specific ROS nodes on each machine. For example, autostart scripts of QTRP, run roscore and launch QTrobot motor and other important controllers. Moreover, as it can be inferred from QTrobot Architecture, one of the autostart scripts of QTPC is responsible to launch the qt_nuitrack_app node which provide ROS interface for Nuitrack skeleton tracking using 3D camera. Therefore, it is very important that you completely understand the purpose of each script before disabling or modifying the QTrobot autostart behavior.

For both QTRP and QTPC, the autostart scripts are located in ~/robot/autostart folder under qtrobot user. The scripts are run by Linux Cron job scheduler. In fact, a specific cron job is configured to run the autostart_screens.sh script at boot time. The other scripts are launched by autostart_screens.sh and their output are redirected to the corresponding log files.

flowchart LR; A(Cron job) --> B(autostart_screens.sh); B-->C(start_script_1.sh); B-->D(start_script_2.sh); B-->E(start_script_3.sh); style A fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style B fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style C fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style D fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030 style E fill:#f0f0f0,stroke:614b7f,stroke-width:2px,color:#303030

QTRP autostart scripts

the autostart_screens.sh script on QTRP is responsible for launching the roscore and some other QTRobot critical interfaces such as qt_motor, qt_robot_interface, etc. Please be careful to not disable any of these critical nodes. Here is the list and short descriptions of each autostart script on QTRP:

  • start_mDNS.sh : start mulitcast discovery service on QTrobot
  • start_roscore.sh : run the roscore
  • start_qtpc.sh : turn on QTPC via wake-on-lan
  • start_qt_motor.sh : launch qt_motor node (for motor, gesture interfaces and etc)
  • start_qt_robot_interface.sh : launch qt_robot_interface node (for robot facial emotion, speech, interfaces and etc.)
  • start_qt_rosbridge.sh : start a secure rosbridge server (used by tablet apps)
  • start_qt_vosk_app.sh : start vosk offline speech recogntion

QTPC autostart scripts

the autostart_screens.sh script on QTPC is mainly responsible for launching the qt_nuitrack_app interface. Here is the list and short descriptions of each autostart script on QTPC:

  • start_qt_nuitrack_app.sh : launch qt_nuitrack_app node (for skeleton tracking, facial feature, gesture recognition and etc.)

How to check the log files of autostart scripts

All programs/ROS nodes which are run by QTrobot autostart scripts redirect their standard output (info/war/error messages) to their corresponding log file. These log files can be found under ~/robot/autostart/logs folder.

How to run my own script at startup

For example, to run your custom script on QTPC at the startup, you need to first create a startup script file and call it from autostart_screens.sh. Do the following steps:

  • [Step 1] Create custom startup script

    open a terminal on QTPC and create a bash script file. Let's name it start_my_script.sh.

    nano ~/robot/autostart/start_my_script.sh

    with the following example content:

    # !/bin/bash
    source /home/qtrobot/robot/autostart/qt_robot.inc

    SCRIPT_NAME="start_my_script"
    LOG_FILE=$(prepare_logfile "$SCRIPT_NAME")

    {
    prepare_ros_environment
    wait_for_ros_node "/rosout" 60
    # ...
    # add your main code here
    /usr/bin/echo "This is my script!"
    # ...
    } &>> ${LOG_FILE}
  • [Step 2] Add it to autostart_screens.sh

    Carefully edit the autostart_screens.sh:

    nano ~/robot/autostart/autostart_screens.sh

    To add your own script (e.g. start_my_script.sh) you can simply add the following line to the buttom of autostart_screens.sh right before the } &>> ${LOG_FILE} line. The autostart_screens.sh should look like the following:

    {
    wait_for_network
    ...
    ...
    run_script "start_my_script.sh"
    } &>> ${LOG_FILE}
  • [Step 3] Reboot and check Reboot the QTrobot. After reboot, your script should be executed on startup of QTPC. You can now check the log file of your script:

    cat ~/robot/austostart/logs/start_my_script.log