Skip to main content
Version: QTrobot V2

QTrobot recording new gesture

Overview

 Level:  Intermediate
 Goal:  learn how to record and play custom gesture with QTrobot Gesture interface
 Requirements:

In this tutorial you will learn how to record and play custom gesture with QTrobot Gesture interface using python.

Create a python project

First we create a python project for our tutorial. let's call it tutorial_qt_record and add the required python file:

cd ~/catkin_ws/src
catkin_create_pkg tutorial_qt_record rospy roscpp -D "Record new gestures"
cd tutorial_qt_record/src
touch tutorial_qt_record_node.py
chmod +x tutorial_qt_record_node.py

Code

Lets see how we can record and play a new gesture.

Open the tutorial_qt_record_node.py file and add the following code:

#!/usr/bin/env python
import sys
import rospy
from qt_robot_interface.srv import *
from qt_gesture_controller.srv import *
from qt_motors_controller.srv import *

if __name__ == '__main__':
rospy.init_node('my_tutorial_node')
rospy.loginfo("my_tutorial_node started!")

speechSay = rospy.ServiceProxy('/qt_robot/speech/say', speech_say)
gestureRecord = rospy.ServiceProxy('/qt_robot/gesture/record', gesture_record)
gestureSave = rospy.ServiceProxy('/qt_robot/gesture/save', gesture_save)
setControlMode = rospy.ServiceProxy('/qt_robot/motors/setControlMode', set_control_mode)
gesturePlay = rospy.ServiceProxy('/qt_robot/gesture/play', gesture_play)


try:
name = "my_gesture"
parts = ["left_arm"]
input('Press enter to START recording ...\n')
speechSay('Press enter to START recording.')
res = gestureRecord(parts, True, 0, 0)
if not res.status:
rospy.logfatal("Could not start recording gesture '%s' using '%s'." % (name, parts))
speechSay('When you want to STOP recording, just press enter again')
input('Press enter to STOP recording ...\n')
res = gestureSave(name, "")
if not res.status:
rospy.logfatal("Could not save gesture '%s'." % name)
else:
rospy.loginfo("Gesture '%s' was recorded." % name)
speechSay("Your gesture was recorded." % name)
res = setControlMode(parts, 1)
if not res.status:
rospy.logfatal("Could not set control mode of '%s'." % parts)
else:
speechSay("Let's see what did you record.")
gesturePlay(name, 0)

except KeyboardInterrupt:
pass

rospy.loginfo("finsihed!")

Explanation

Let's dissect the code. First we import all from qt_robot_interface.srv, because we need speech_say. We also import qt_gesture_controller.srv and qt_motors_controller.srv for all gesture and motor services.

We define all services that we need to use. We will need services for recording, saving and playing gestures. Also we will use speech service and control mode to set the mode of QTrobot motors.

speechSay = rospy.ServiceProxy('/qt_robot/speech/say', speech_say)
gestureRecord = rospy.ServiceProxy('/qt_robot/gesture/record', gesture_record)
gestureSave = rospy.ServiceProxy('/qt_robot/gesture/save', gesture_save)
setControlMode = rospy.ServiceProxy('/qt_robot/motors/setControlMode', set_control_mode)
gesturePlay = rospy.ServiceProxy('/qt_robot/gesture/play', gesture_play)

Next we name the gesture and in we select which body part we want to record. You can write ["left_arm","right_arm","head"] to record with entire QTrobot. In this tutorial we will use just left_arm.

name = "my_gesture"
parts = ["left_arm"]

Next we use speechSay service to let the user decide when to start the recording. After user pressed enter, With gestureRecord call we start recording the gesture with the parts that we selected. If there is any error on recording we print out and error message.

input('Press enter to START recording ...\n')
speechSay('Press enter to START recording.')
res = gestureRecord(parts, True, 0, 0)
if not res.status:
rospy.logfatal("Could not start recording gesture '%s' using '%s'." % (name, parts))

We use the same speech_say service for user interaction and when user decides to stop the recording we stop it using gestureSave, which saves the gesture with selected name on QTRP in folder ~/robot/data/gestures/.

speechSay('When you want to STOP recording, just press enter again')
input('Press enter to STOP recording ...\n')
res = gestureSave(name, "")
if not res.status:
rospy.logfatal("Could not save gesture '%s'." % name)
else:
rospy.loginfo("Gesture '%s' was recorded." % name)
speechSay("Your gesture was recorded." % name)

At the end we enable back the motors used for recording with setControlMode and if everything is ok we play the gesture that we recorded with gesturePlay.

res = setControlMode(parts, 1)
if not res.status:
rospy.logfatal("Could not set control mode of '%s'." % parts)
else:
speechSay("Let's see what did you record.")
gesturePlay(name, 0)