Revision d7c8e3b7
| client/java/pom.xml | ||
|---|---|---|
| 1 | 1 |
|
| 2 | 2 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| 3 |
<modelVersion>4.0.0</modelVersion>
|
|
| 4 |
<groupId>de.citec.csra</groupId>
|
|
| 5 |
<artifactId>hlrc-client</artifactId>
|
|
| 6 |
<version>0.2</version>
|
|
| 7 |
<packaging>jar</packaging>
|
|
| 8 |
<name>High Level Robot Control java client</name>
|
|
| 9 |
<url>http://maven.apache.org</url>
|
|
| 10 |
<build>
|
|
| 11 |
<plugins>
|
|
| 12 |
<plugin>
|
|
| 13 |
<groupId>org.apache.maven.plugins</groupId>
|
|
| 14 |
<artifactId>maven-compiler-plugin</artifactId>
|
|
| 15 |
<version>3.1</version>
|
|
| 16 |
<configuration>
|
|
| 17 |
<source>1.7</source>
|
|
| 18 |
<target>1.7</target>
|
|
| 19 |
<showDeprecation>true</showDeprecation>
|
|
| 20 |
</configuration>
|
|
| 21 |
</plugin>
|
|
| 22 |
<plugin>
|
|
| 23 |
<groupId>org.codehaus.mojo</groupId>
|
|
| 24 |
<artifactId>appassembler-maven-plugin</artifactId>
|
|
| 25 |
<version>1.8</version>
|
|
| 26 |
<configuration>
|
|
| 27 |
<programs>
|
|
| 28 |
<program>
|
|
| 29 |
<mainClass>de.uni-bielefeld.cit-ec.opensource.hlrc.main.Cmd</mainClass>
|
|
| 30 |
<id>hlrc-client</id>
|
|
| 3 |
<modelVersion>4.0.0</modelVersion>
|
|
| 4 |
<groupId>de.cit_ec.opensource.hlrc</groupId>
|
|
| 5 |
<artifactId>hlrc-client</artifactId>
|
|
| 6 |
<version>0.2</version>
|
|
| 7 |
<packaging>jar</packaging>
|
|
| 8 |
<name>High Level Robot Control java client</name>
|
|
| 9 |
<url>http://maven.apache.org</url>
|
|
| 10 |
<build>
|
|
| 11 |
<plugins>
|
|
| 12 |
<plugin>
|
|
| 13 |
<groupId>org.apache.maven.plugins</groupId>
|
|
| 14 |
<artifactId>maven-compiler-plugin</artifactId>
|
|
| 15 |
<version>3.1</version>
|
|
| 16 |
<configuration>
|
|
| 17 |
<source>1.7</source>
|
|
| 18 |
<target>1.7</target>
|
|
| 19 |
<showDeprecation>true</showDeprecation>
|
|
| 20 |
</configuration>
|
|
| 21 |
</plugin>
|
|
| 22 |
<plugin>
|
|
| 23 |
<groupId>org.codehaus.mojo</groupId>
|
|
| 24 |
<artifactId>appassembler-maven-plugin</artifactId>
|
|
| 25 |
<version>1.8</version>
|
|
| 26 |
<configuration>
|
|
| 27 |
<programs>
|
|
| 28 |
<program>
|
|
| 29 |
<mainClass>de.cit_ec.opensource.hlrc.main.Cmd</mainClass>
|
|
| 30 |
<id>hlrc-client</id>
|
|
| 31 | 31 |
|
| 32 |
</program> |
|
| 33 |
</programs> |
|
| 34 |
<!-- <assembleDirectory>${project.build.directory}/dist</assembleDirectory>
|
|
| 35 |
<repositoryName>lib</repositoryName> |
|
| 36 |
<repositoryLayout>flat</repositoryLayout>--> |
|
| 37 |
</configuration> |
|
| 38 |
<executions> |
|
| 39 |
<execution> |
|
| 40 |
<id>assemble</id> |
|
| 41 |
<goals> |
|
| 42 |
<goal>assemble</goal> |
|
| 43 |
</goals> |
|
| 44 |
</execution> |
|
| 45 |
</executions> |
|
| 46 |
</plugin> |
|
| 47 |
</plugins> |
|
| 48 |
</build> |
|
| 49 |
<licenses> |
|
| 50 |
<license> |
|
| 51 |
<name>GPLv3</name> |
|
| 52 |
<url>http://www.gnu.org/licenses/gpl.html</url> |
|
| 53 |
</license> |
|
| 54 |
</licenses> |
|
| 55 |
<organization> |
|
| 56 |
<name>Citec, Bielefeld University</name> |
|
| 57 |
<url>http://www.cit-ec.de/</url> |
|
| 58 |
</organization> |
|
| 59 |
<developers> |
|
| 60 |
<developer> |
|
| 61 |
<id>flier</id> |
|
| 62 |
<name>Florian Lier</name> |
|
| 63 |
<email>flier@techfak.uni-bielefeld.de</email> |
|
| 64 |
<url>https://www.cit-ec.de/de/users/flier</url> |
|
| 65 |
<roles> |
|
| 66 |
<role>architect</role> |
|
| 67 |
<role>developer</role> |
|
| 68 |
</roles> |
|
| 69 |
<timezone>+1</timezone> |
|
| 70 |
</developer> |
|
| 71 |
</developers> |
|
| 72 |
<properties> |
|
| 73 |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|
| 74 |
</properties> |
|
| 75 |
<dependencies> |
|
| 76 |
<dependency> |
|
| 77 |
<groupId>org.slf4j</groupId> |
|
| 78 |
<artifactId>slf4j-api</artifactId> |
|
| 79 |
<version>1.7.7</version> |
|
| 80 |
</dependency> |
|
| 81 |
<dependency> |
|
| 82 |
<groupId>org.slf4j</groupId> |
|
| 83 |
<artifactId>slf4j-simple</artifactId> |
|
| 84 |
<version>1.7.7</version> |
|
| 85 |
</dependency> |
|
| 86 |
<dependency> |
|
| 87 |
<groupId>junit</groupId> |
|
| 88 |
<artifactId>junit</artifactId> |
|
| 89 |
<version>4.11</version> |
|
| 90 |
<scope>test</scope> |
|
| 91 |
</dependency> |
|
| 92 |
<dependency> |
|
| 93 |
<groupId>rsb</groupId> |
|
| 94 |
<artifactId>rsb</artifactId> |
|
| 95 |
<version>[0.15.0,)</version> |
|
| 96 |
</dependency> |
|
| 97 |
<dependency> |
|
| 98 |
<groupId>rsb</groupId> |
|
| 99 |
<artifactId>rst</artifactId> |
|
| 100 |
<version>[0.15.0,)</version> |
|
| 101 |
</dependency> |
|
| 102 |
<dependency> |
|
| 103 |
<groupId>commons-cli</groupId> |
|
| 104 |
<artifactId>commons-cli</artifactId> |
|
| 105 |
<version>1.2</version> |
|
| 106 |
</dependency> |
|
| 107 |
<dependency> |
|
| 108 |
<groupId>commons-lang</groupId> |
|
| 109 |
<artifactId>commons-lang</artifactId> |
|
| 110 |
<version>2.6</version> |
|
| 111 |
</dependency> |
|
| 112 |
</dependencies> |
|
| 113 |
<distributionManagement> |
|
| 114 |
<repository> |
|
| 115 |
<id>citec</id> |
|
| 116 |
<name>CITEC Maven Repository Server</name> |
|
| 117 |
<url>https://repo.cit-ec.uni-bielefeld.de/content/repositories/releases/</url> |
|
| 118 |
<layout>default</layout> |
|
| 119 |
</repository> |
|
| 120 |
</distributionManagement> |
|
| 32 |
</program> |
|
| 33 |
</programs> |
|
| 34 |
<!-- <assembleDirectory>${project.build.directory}/dist</assembleDirectory>
|
|
| 35 |
<repositoryName>lib</repositoryName> |
|
| 36 |
<repositoryLayout>flat</repositoryLayout>--> |
|
| 37 |
</configuration> |
|
| 38 |
<executions> |
|
| 39 |
<execution> |
|
| 40 |
<id>assemble</id> |
|
| 41 |
<goals> |
|
| 42 |
<goal>assemble</goal> |
|
| 43 |
</goals> |
|
| 44 |
</execution> |
|
| 45 |
</executions> |
|
| 46 |
</plugin> |
|
| 47 |
</plugins> |
|
| 48 |
</build> |
|
| 49 |
<licenses> |
|
| 50 |
<license> |
|
| 51 |
<name>GPLv3</name> |
|
| 52 |
<url>http://www.gnu.org/licenses/gpl.html</url> |
|
| 53 |
</license> |
|
| 54 |
</licenses> |
|
| 55 |
<organization> |
|
| 56 |
<name>Citec, Bielefeld University</name> |
|
| 57 |
<url>http://www.cit-ec.de/</url> |
|
| 58 |
</organization> |
|
| 59 |
<developers> |
|
| 60 |
<developer> |
|
| 61 |
<id>flier</id> |
|
| 62 |
<name>Florian Lier</name> |
|
| 63 |
<email>flier@techfak.uni-bielefeld.de</email> |
|
| 64 |
<url>https://www.cit-ec.de/de/users/flier</url> |
|
| 65 |
<roles> |
|
| 66 |
<role>architect</role> |
|
| 67 |
<role>developer</role> |
|
| 68 |
</roles> |
|
| 69 |
<timezone>+1</timezone> |
|
| 70 |
</developer> |
|
| 71 |
</developers> |
|
| 72 |
<properties> |
|
| 73 |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|
| 74 |
</properties> |
|
| 75 |
<dependencies> |
|
| 76 |
<dependency> |
|
| 77 |
<groupId>org.slf4j</groupId> |
|
| 78 |
<artifactId>slf4j-api</artifactId> |
|
| 79 |
<version>1.7.7</version> |
|
| 80 |
</dependency> |
|
| 81 |
<dependency> |
|
| 82 |
<groupId>org.slf4j</groupId> |
|
| 83 |
<artifactId>slf4j-simple</artifactId> |
|
| 84 |
<version>1.7.7</version> |
|
| 85 |
</dependency> |
|
| 86 |
<dependency> |
|
| 87 |
<groupId>junit</groupId> |
|
| 88 |
<artifactId>junit</artifactId> |
|
| 89 |
<version>4.11</version> |
|
| 90 |
<scope>test</scope> |
|
| 91 |
</dependency> |
|
| 92 |
<dependency> |
|
| 93 |
<groupId>rsb</groupId> |
|
| 94 |
<artifactId>rsb</artifactId> |
|
| 95 |
<version>[0.15.0,)</version> |
|
| 96 |
</dependency> |
|
| 97 |
<dependency> |
|
| 98 |
<groupId>rsb</groupId> |
|
| 99 |
<artifactId>rst</artifactId> |
|
| 100 |
<version>[0.15.0,)</version> |
|
| 101 |
</dependency> |
|
| 102 |
<dependency> |
|
| 103 |
<groupId>commons-cli</groupId> |
|
| 104 |
<artifactId>commons-cli</artifactId> |
|
| 105 |
<version>1.2</version> |
|
| 106 |
</dependency> |
|
| 107 |
<dependency> |
|
| 108 |
<groupId>commons-lang</groupId> |
|
| 109 |
<artifactId>commons-lang</artifactId> |
|
| 110 |
<version>2.6</version> |
|
| 111 |
</dependency> |
|
| 112 |
</dependencies> |
|
| 113 |
<repositories> |
|
| 114 |
<repository> |
|
| 115 |
<id>citec-releases</id> |
|
| 116 |
<name>CITEC Maven Repository Server</name> |
|
| 117 |
<url>https://mvn.cit-ec.de/nexus/content/repositories/releases/</url> |
|
| 118 |
<layout>default</layout> |
|
| 119 |
<releases> |
|
| 120 |
<enabled>true</enabled> |
|
| 121 |
</releases> |
|
| 122 |
</repository> |
|
| 123 |
</repositories> |
|
| 121 | 124 |
</project> |
| client/java/src/main/java/de/cit_ec/opensource/hlrc/client/Emotions.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
|
|
| 7 |
package de.cit_ec.opensource.hlrc.client; |
|
| 8 |
|
|
| 9 |
public enum Emotions {
|
|
| 10 |
NEUTRAL, |
|
| 11 |
HAPPY, |
|
| 12 |
SAD, |
|
| 13 |
ANGRY, |
|
| 14 |
SURPRISED, |
|
| 15 |
FEAR |
|
| 16 |
} |
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/client/HeadAnimations.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
|
|
| 7 |
// TODO: Rename/refactor this package to somthing more self explantory |
|
| 8 |
|
|
| 9 |
package de.cit_ec.opensource.hlrc.client; |
|
| 10 |
|
|
| 11 |
public enum HeadAnimations {
|
|
| 12 |
IDLE, |
|
| 13 |
HEAD_NOD, |
|
| 14 |
HEAD_SHAKE, |
|
| 15 |
EYEBLINK_L, |
|
| 16 |
EYEBLINK_R, |
|
| 17 |
EYEBLINK_BOTH, |
|
| 18 |
EYEBROWS_RAISE, |
|
| 19 |
EYEBROWS_LOWER |
|
| 20 |
} |
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/client/MiddlewareRSB.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
package de.cit_ec.opensource.hlrc.client; |
|
| 7 |
|
|
| 8 |
import java.util.ArrayList; |
|
| 9 |
import java.util.HashMap; |
|
| 10 |
import java.util.Map; |
|
| 11 |
import java.util.concurrent.ExecutionException; |
|
| 12 |
import java.util.concurrent.TimeoutException; |
|
| 13 |
import java.util.logging.Level; |
|
| 14 |
import java.util.logging.Logger; |
|
| 15 |
|
|
| 16 |
import javax.sound.sampled.AudioFormat; |
|
| 17 |
import javax.sound.sampled.AudioFormat.Encoding; |
|
| 18 |
|
|
| 19 |
import rsb.RSBException; |
|
| 20 |
import rsb.converter.DefaultConverterRepository; |
|
| 21 |
import rsb.converter.ProtocolBufferConverter; |
|
| 22 |
import rsb.patterns.RemoteServer; |
|
| 23 |
|
|
| 24 |
import rst.audition.SoundChunkType.SoundChunk; |
|
| 25 |
import rst.audition.UtteranceType.Utterance; |
|
| 26 |
import rst.animation.HeadAnimationType.HeadAnimation; |
|
| 27 |
import rst.animation.EmotionExpressionType.EmotionExpression; |
|
| 28 |
import rst.animation.BinocularHeadGazeType.BinocularHeadGaze; |
|
| 29 |
|
|
| 30 |
import com.google.protobuf.ByteString; |
|
| 31 |
|
|
| 32 |
// Create _abstract_ middleware class and function _interface_ for |
|
| 33 |
// future integration of additional Middleware implementations... |
|
| 34 |
import rsb.Factory; |
|
| 35 |
import rsb.Informer; |
|
| 36 |
import rst.animation.EmotionExpressionType.EmotionExpression.Emotion; |
|
| 37 |
import rst.animation.HeadAnimationType.HeadAnimation.Animation; |
|
| 38 |
import rst.audition.PhonemeCollectionType.PhonemeCollection; |
|
| 39 |
import rst.audition.PhonemeType.Phoneme; |
|
| 40 |
import rst.geometry.SphericalDirectionFloatType.SphericalDirectionFloat; |
|
| 41 |
|
|
| 42 |
public class MiddlewareRSB {
|
|
| 43 |
|
|
| 44 |
final RemoteServer server; |
|
| 45 |
final String robotname; |
|
| 46 |
static Map<Emotions, Emotion> emo_map; |
|
| 47 |
static Map<HeadAnimations, Animation> han_map; |
|
| 48 |
|
|
| 49 |
public class RSBInformer {
|
|
| 50 |
|
|
| 51 |
final Factory factory; |
|
| 52 |
final Informer<Object> informer; |
|
| 53 |
|
|
| 54 |
public RSBInformer(String scope) throws Throwable {
|
|
| 55 |
|
|
| 56 |
// Get a factory instance to create RSB objects. |
|
| 57 |
factory = Factory.getInstance(); |
|
| 58 |
|
|
| 59 |
// Create an informer on scope "/exmaple/informer". |
|
| 60 |
informer = factory.createInformer(scope); |
|
| 61 |
|
|
| 62 |
// Activate the informer to be ready for work |
|
| 63 |
informer.activate(); |
|
| 64 |
|
|
| 65 |
} |
|
| 66 |
|
|
| 67 |
public void pushMsg() {
|
|
| 68 |
try {
|
|
| 69 |
// Send and event using a method that accepts the data and |
|
| 70 |
// automatically creates an appropriate event internally. |
|
| 71 |
this.informer.publish("TODO");
|
|
| 72 |
} catch (RSBException ex) {
|
|
| 73 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 74 |
} |
|
| 75 |
} |
|
| 76 |
|
|
| 77 |
public void closeInf() throws InterruptedException {
|
|
| 78 |
try {
|
|
| 79 |
// As there is no explicit removal model in java, always manually |
|
| 80 |
// deactivate the informer if it is not needed anymore |
|
| 81 |
this.informer.deactivate(); |
|
| 82 |
} catch (RSBException ex) {
|
|
| 83 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 84 |
} |
|
| 85 |
} |
|
| 86 |
|
|
| 87 |
} |
|
| 88 |
|
|
| 89 |
@SuppressWarnings("unchecked")
|
|
| 90 |
public MiddlewareRSB(String robotname) {
|
|
| 91 |
|
|
| 92 |
this.robotname = robotname; |
|
| 93 |
|
|
| 94 |
server = Factory.getInstance().createRemoteServer(this.robotname + "/set/"); |
|
| 95 |
System.out.println("--> Robot: Talking to " + this.robotname);
|
|
| 96 |
try {
|
|
| 97 |
server.activate(); |
|
| 98 |
} catch (RSBException ex) {
|
|
| 99 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 100 |
} |
|
| 101 |
|
|
| 102 |
{
|
|
| 103 |
final ProtocolBufferConverter<EmotionExpression> converter = new ProtocolBufferConverter<>(EmotionExpression.getDefaultInstance()); |
|
| 104 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 105 |
} |
|
| 106 |
{
|
|
| 107 |
final ProtocolBufferConverter<BinocularHeadGaze> converter = new ProtocolBufferConverter<>(BinocularHeadGaze.getDefaultInstance()); |
|
| 108 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 109 |
} |
|
| 110 |
{
|
|
| 111 |
final ProtocolBufferConverter<HeadAnimation> converter = new ProtocolBufferConverter<>(HeadAnimation.getDefaultInstance()); |
|
| 112 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 113 |
} |
|
| 114 |
{
|
|
| 115 |
final ProtocolBufferConverter<Utterance> converter = new ProtocolBufferConverter<>(Utterance.getDefaultInstance()); |
|
| 116 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 117 |
} |
|
| 118 |
{
|
|
| 119 |
final ProtocolBufferConverter<SoundChunk> converter = new ProtocolBufferConverter<>(SoundChunk.getDefaultInstance()); |
|
| 120 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 121 |
} |
|
| 122 |
{
|
|
| 123 |
final ProtocolBufferConverter<Phoneme> converter = new ProtocolBufferConverter<>(Phoneme.getDefaultInstance()); |
|
| 124 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 125 |
} |
|
| 126 |
|
|
| 127 |
emo_map = new HashMap(); |
|
| 128 |
emo_map.put(Emotions.SAD, Emotion.SAD); |
|
| 129 |
emo_map.put(Emotions.ANGRY, Emotion.ANGRY); |
|
| 130 |
emo_map.put(Emotions.FEAR, Emotion.FEAR); |
|
| 131 |
emo_map.put(Emotions.NEUTRAL, Emotion.NEUTRAL); |
|
| 132 |
emo_map.put(Emotions.SURPRISED, Emotion.SURPRISED); |
|
| 133 |
emo_map.put(Emotions.HAPPY, Emotion.HAPPY); |
|
| 134 |
|
|
| 135 |
han_map = new HashMap(); |
|
| 136 |
han_map.put(HeadAnimations.HEAD_NOD, Animation.HEAD_NOD); |
|
| 137 |
han_map.put(HeadAnimations.HEAD_SHAKE, Animation.HEAD_SHAKE); |
|
| 138 |
han_map.put(HeadAnimations.IDLE, Animation.IDLE); |
|
| 139 |
han_map.put(HeadAnimations.EYEBLINK_R, Animation.EYEBLINK_RIGHT); |
|
| 140 |
han_map.put(HeadAnimations.EYEBLINK_L, Animation.EYEBLINK_LEFT); |
|
| 141 |
han_map.put(HeadAnimations.EYEBLINK_BOTH, Animation.EYEBLINK_BOTH); |
|
| 142 |
han_map.put(HeadAnimations.EYEBROWS_LOWER, Animation.EYEBROWS_LOWER); |
|
| 143 |
han_map.put(HeadAnimations.EYEBROWS_RAISE, Animation.EYEBROWS_RAISE); |
|
| 144 |
} |
|
| 145 |
|
|
| 146 |
private SoundChunk compileSoundChunk(AudioFormat audio, byte[] data) {
|
|
| 147 |
SoundChunk.Builder sc = SoundChunk.newBuilder(); |
|
| 148 |
ByteString bs = ByteString.copyFrom(data); |
|
| 149 |
boolean isbig = audio.isBigEndian(); |
|
| 150 |
sc.setChannels(audio.getChannels()); |
|
| 151 |
sc.setData(bs); |
|
| 152 |
sc.setRate((int) audio.getSampleRate()); |
|
| 153 |
|
|
| 154 |
if (isbig) {
|
|
| 155 |
sc.setEndianness(SoundChunk.EndianNess.ENDIAN_BIG); |
|
| 156 |
} else {
|
|
| 157 |
sc.setEndianness(SoundChunk.EndianNess.ENDIAN_LITTLE); |
|
| 158 |
} |
|
| 159 |
|
|
| 160 |
sc.setSampleCount(data.length / audio.getFrameSize()); |
|
| 161 |
Encoding enc = audio.getEncoding(); |
|
| 162 |
|
|
| 163 |
if (enc.equals(Encoding.PCM_SIGNED)) {
|
|
| 164 |
int size = audio.getSampleSizeInBits(); |
|
| 165 |
if (size == 8) {
|
|
| 166 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S8); |
|
| 167 |
} else if (size == 16) {
|
|
| 168 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S16); |
|
| 169 |
} else if (size == 24) {
|
|
| 170 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S24); |
|
| 171 |
} else {
|
|
| 172 |
System.err.println("Audio Sample Size Not Valid");
|
|
| 173 |
} |
|
| 174 |
} else if (enc.equals(Encoding.PCM_UNSIGNED)) {
|
|
| 175 |
int size = audio.getSampleSizeInBits(); |
|
| 176 |
if (size == 8) {
|
|
| 177 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U8); |
|
| 178 |
} else if (size == 16) {
|
|
| 179 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U16); |
|
| 180 |
} else if (size == 24) {
|
|
| 181 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U24); |
|
| 182 |
} else {
|
|
| 183 |
System.err.println("Audio Sample Size Not Valid");
|
|
| 184 |
// This is too rigorous, maybe. |
|
| 185 |
// System.exit(-1); |
|
| 186 |
} |
|
| 187 |
} else {
|
|
| 188 |
System.err.println("Audio Encoding is invalid");
|
|
| 189 |
} |
|
| 190 |
return sc.build(); |
|
| 191 |
} |
|
| 192 |
|
|
| 193 |
public void deactivateServer() throws InterruptedException {
|
|
| 194 |
try {
|
|
| 195 |
this.server.deactivate(); |
|
| 196 |
} catch (RSBException ex) {
|
|
| 197 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 198 |
} |
|
| 199 |
} |
|
| 200 |
|
|
| 201 |
// OBSOLETE |
|
| 202 |
/* |
|
| 203 |
public MouthAnimation createMouthAnimationMessage(int duration, boolean active) {
|
|
| 204 |
MouthAnimation.Builder ma = MouthAnimation.newBuilder(); |
|
| 205 |
ma.setDuration(duration); |
|
| 206 |
ma.setActive(active); |
|
| 207 |
return ma.build(); |
|
| 208 |
} |
|
| 209 |
*/ |
|
| 210 |
public Utterance createSetSpeak(SoundChunk soundchunck, ArrayList tuList, String text) {
|
|
| 211 |
Utterance.Builder ut = Utterance.newBuilder(); |
|
| 212 |
ut.setAudio(soundchunck); |
|
| 213 |
Phoneme.Builder ph = Phoneme.newBuilder(); |
|
| 214 |
PhonemeCollection.Builder phCollection = PhonemeCollection.newBuilder(); |
|
| 215 |
|
|
| 216 |
for (Object tuList1 : tuList) {
|
|
| 217 |
Tuple t = (Tuple) tuList1; |
|
| 218 |
ph.setSymbol(t.s); |
|
| 219 |
ph.setDuration(t.d); |
|
| 220 |
phCollection.addElement(ph.build()); |
|
| 221 |
} |
|
| 222 |
ut.setPhonemes(phCollection); |
|
| 223 |
ut.setTextualRepresentation(text); |
|
| 224 |
return ut.build(); |
|
| 225 |
} |
|
| 226 |
|
|
| 227 |
public HeadAnimation createHeadAnimationMessage(HeadAnimations ani, int duration, int repetition, float scale) {
|
|
| 228 |
HeadAnimation.Builder ha = HeadAnimation.newBuilder(); |
|
| 229 |
ha.setRepetitions(repetition); |
|
| 230 |
ha.setAnimation(han_map.get(ani)); |
|
| 231 |
ha.setDurationEach(duration); |
|
| 232 |
ha.setEmphasisScale(scale); |
|
| 233 |
return ha.build(); |
|
| 234 |
} |
|
| 235 |
|
|
| 236 |
public EmotionExpression createEmotionMessage(Emotions emo, int duration) {
|
|
| 237 |
EmotionExpression.Builder es = EmotionExpression.newBuilder(); |
|
| 238 |
es.setDuration(duration); |
|
| 239 |
es.setEmotion(emo_map.get(emo)); |
|
| 240 |
return es.build(); |
|
| 241 |
} |
|
| 242 |
|
|
| 243 |
public EmotionExpression createDefaultEmotionMessage(Emotions emo) {
|
|
| 244 |
EmotionExpression.Builder es = EmotionExpression.newBuilder(); |
|
| 245 |
es.setEmotion(emo_map.get(emo)); |
|
| 246 |
return es.build(); |
|
| 247 |
} |
|
| 248 |
|
|
| 249 |
public BinocularHeadGaze createGazeTargetMessage(float pan, float tilt, float offsetPan, float offsetTilt) {
|
|
| 250 |
BinocularHeadGaze.Builder gt = BinocularHeadGaze.newBuilder(); |
|
| 251 |
SphericalDirectionFloat.Builder spBuilder = SphericalDirectionFloat.newBuilder(); |
|
| 252 |
spBuilder.setAzimuth(pan); |
|
| 253 |
spBuilder.setElevation(tilt); |
|
| 254 |
gt.setEyeVergence(0); |
|
| 255 |
gt.setTarget(spBuilder.build()); |
|
| 256 |
spBuilder.setAzimuth(offsetTilt); |
|
| 257 |
spBuilder.setElevation(offsetPan); |
|
| 258 |
gt.setOffset(spBuilder.build()); |
|
| 259 |
return gt.build(); |
|
| 260 |
} |
|
| 261 |
|
|
| 262 |
public BinocularHeadGaze createGazeTargetMessage(float pan, float tilt) {
|
|
| 263 |
return createGazeTargetMessage(pan, tilt, 0, 0); |
|
| 264 |
} |
|
| 265 |
|
|
| 266 |
public void setSpeak(AudioFormat audio, byte[] bs, ArrayList tu, String text, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 267 |
SoundChunk sc; |
|
| 268 |
sc = compileSoundChunk(audio, bs); |
|
| 269 |
if (blocking) {
|
|
| 270 |
try {
|
|
| 271 |
server.call("utterance", createSetSpeak(sc, tu, text));
|
|
| 272 |
// System.out.println("Server replied: " + server.call("utterance", createSetSpeak(sc, tu)));
|
|
| 273 |
} catch (RSBException ex) {
|
|
| 274 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 275 |
} catch (InterruptedException ex) {
|
|
| 276 |
Thread.currentThread().interrupt(); |
|
| 277 |
} |
|
| 278 |
} else {
|
|
| 279 |
try {
|
|
| 280 |
server.callAsync("utterance", createSetSpeak(sc, tu, text));
|
|
| 281 |
// System.out.println("Set Mouth Animation non-blocking, not wating for reply");
|
|
| 282 |
} catch (RSBException ex) {
|
|
| 283 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 284 |
} |
|
| 285 |
} |
|
| 286 |
} |
|
| 287 |
|
|
| 288 |
public void setEmotion(Emotions emo, int duration, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 289 |
try {
|
|
| 290 |
if (blocking) {
|
|
| 291 |
server.call("emotion", createEmotionMessage(emo, duration));
|
|
| 292 |
// System.out.println("Server replied: " + server.call("emotion", createEmotionMessage(emo, duration)));
|
|
| 293 |
} else {
|
|
| 294 |
server.callAsync("emotion", createEmotionMessage(emo, duration));
|
|
| 295 |
// System.out.println("Set Emotion non-blocking, not wating for reply");
|
|
| 296 |
} |
|
| 297 |
|
|
| 298 |
} catch (RSBException ex) {
|
|
| 299 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 300 |
} catch (InterruptedException ex) {
|
|
| 301 |
Thread.currentThread().interrupt(); |
|
| 302 |
} |
|
| 303 |
} |
|
| 304 |
|
|
| 305 |
public void setGazeTarget(float pan, float tilt, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 306 |
try {
|
|
| 307 |
if (blocking) {
|
|
| 308 |
server.call("gaze", createGazeTargetMessage(pan, tilt));
|
|
| 309 |
// System.out.println("Server replied: " + server.call("gaze", createGazeTargetMessage(pan, tilt, roll)));
|
|
| 310 |
} else {
|
|
| 311 |
server.callAsync("gaze", createGazeTargetMessage(pan, tilt));
|
|
| 312 |
// System.out.println("Set Gaze non-blocking, not wating for reply");
|
|
| 313 |
} |
|
| 314 |
} catch (RSBException ex) {
|
|
| 315 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 316 |
} catch (InterruptedException ex) {
|
|
| 317 |
Thread.currentThread().interrupt(); |
|
| 318 |
} |
|
| 319 |
} |
|
| 320 |
|
|
| 321 |
public void setGazeTarget(float pan, float tilt, float offsetPan, float offsetTilt, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 322 |
try {
|
|
| 323 |
if (blocking) {
|
|
| 324 |
server.call("gaze", createGazeTargetMessage(pan, tilt, offsetPan, offsetTilt));
|
|
| 325 |
// System.out.println("Server replied: " + server.call("gaze", createGazeTargetMessage(pan, tilt, roll)));
|
|
| 326 |
} else {
|
|
| 327 |
server.callAsync("gaze", createGazeTargetMessage(pan, tilt, offsetPan, offsetTilt));
|
|
| 328 |
// System.out.println("Set Gaze non-blocking, not wating for reply");
|
|
| 329 |
} |
|
| 330 |
} catch (RSBException ex) {
|
|
| 331 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 332 |
} catch (InterruptedException ex) {
|
|
| 333 |
Thread.currentThread().interrupt(); |
|
| 334 |
} |
|
| 335 |
} |
|
| 336 |
|
|
| 337 |
public void setDefaultEmotion(Emotions emo, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 338 |
try {
|
|
| 339 |
if (blocking) {
|
|
| 340 |
server.call("defaultEmotion", createDefaultEmotionMessage(emo));
|
|
| 341 |
// System.out.println("Server replied: " + server.call("defaultEmotion", createDefaultEmotionMessage(emo)));
|
|
| 342 |
} else {
|
|
| 343 |
server.callAsync("defaultEmotion", createDefaultEmotionMessage(emo));
|
|
| 344 |
// System.out.println("Set Default Emotion non-blocking, not wating for reply");
|
|
| 345 |
} |
|
| 346 |
} catch (RSBException ex) {
|
|
| 347 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 348 |
} catch (InterruptedException ex) {
|
|
| 349 |
Thread.currentThread().interrupt(); |
|
| 350 |
} |
|
| 351 |
} |
|
| 352 |
|
|
| 353 |
public void setHeadAnimation(HeadAnimations ani, int duration, int repetitions, float scale, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 354 |
try {
|
|
| 355 |
if (blocking) {
|
|
| 356 |
server.call("animation", createHeadAnimationMessage(ani, duration, repetitions, scale));
|
|
| 357 |
// System.out.println("Server replied: " + server.call("animation", createHeadAnimationMessage(ani, duration, repetitions, scale)));
|
|
| 358 |
} else {
|
|
| 359 |
server.callAsync("animation", createHeadAnimationMessage(ani, duration, repetitions, scale));
|
|
| 360 |
// System.out.println("Set Head Animation non-blocking, not wating for reply");
|
|
| 361 |
} |
|
| 362 |
} catch (RSBException ex) {
|
|
| 363 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 364 |
} catch (InterruptedException ex) {
|
|
| 365 |
Thread.currentThread().interrupt(); |
|
| 366 |
} |
|
| 367 |
} |
|
| 368 |
} |
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/client/Robot.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
|
|
| 7 |
package de.cit_ec.opensource.hlrc.client; |
|
| 8 |
|
|
| 9 |
import java.util.ArrayList; |
|
| 10 |
import java.util.concurrent.ExecutionException; |
|
| 11 |
import java.util.concurrent.TimeoutException; |
|
| 12 |
import java.util.logging.Level; |
|
| 13 |
import java.util.logging.Logger; |
|
| 14 |
import javax.sound.sampled.AudioFormat; |
|
| 15 |
|
|
| 16 |
public class Robot {
|
|
| 17 |
|
|
| 18 |
private final String name; |
|
| 19 |
private final String middlwarename; |
|
| 20 |
public final MiddlewareRSB mw; |
|
| 21 |
|
|
| 22 |
|
|
| 23 |
/** |
|
| 24 |
* |
|
| 25 |
* Create a new Robot |
|
| 26 |
* |
|
| 27 |
* @param name String robot name i.e. "/home/wardrobe/flobi", "/home/kitchen/flobi" |
|
| 28 |
* @param middleware String what Middleware Layer to use |
|
| 29 |
* |
|
| 30 |
*/ |
|
| 31 |
|
|
| 32 |
// TODO: Make the Robot Class a singleton |
|
| 33 |
public Robot(String name, String middleware) {
|
|
| 34 |
this.name = name; |
|
| 35 |
this.middlwarename = middleware; |
|
| 36 |
if (middleware.toUpperCase().equals("RSB")) {
|
|
| 37 |
System.out.println("--> New Robot: "+name+" using middleware: "+middleware+ " has been initialized");
|
|
| 38 |
this.mw = new MiddlewareRSB(this.name); |
|
| 39 |
} else {
|
|
| 40 |
System.out.println("Only RSB Supported for now. Sorry.");
|
|
| 41 |
this.mw = new MiddlewareRSB(this.name); |
|
| 42 |
} |
|
| 43 |
} |
|
| 44 |
|
|
| 45 |
/** |
|
| 46 |
* |
|
| 47 |
* Start the Robot's mouth animation |
|
| 48 |
* |
|
| 49 |
* @param audio Java std auto format |
|
| 50 |
* @param bytes Byte Array containing the actual audio stream |
|
| 51 |
* @param tuList A list of Tuple phoneme plus duration |
|
| 52 |
* @param blocking invoke the command blocking or non blocking TRUE/FALSE |
|
| 53 |
* |
|
| 54 |
*/ |
|
| 55 |
|
|
| 56 |
public void setSpeak(AudioFormat audio, byte[] bytes, ArrayList tuList, String text, boolean blocking) {
|
|
| 57 |
try {
|
|
| 58 |
// System.out.println(">> Sending Set Speak: Blocking: " + blocking);
|
|
| 59 |
mw.setSpeak(audio, bytes, tuList, text, blocking); |
|
| 60 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 61 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 62 |
} |
|
| 63 |
|
|
| 64 |
} |
|
| 65 |
|
|
| 66 |
/** |
|
| 67 |
* |
|
| 68 |
* Start the Robot's mouth animation |
|
| 69 |
* |
|
| 70 |
* @param emo set the desired EMOTION |
|
| 71 |
* @param duration the length of the animation in MILLISECONDS |
|
| 72 |
* @param blocking invoke the command blocking or non blocking TRUE/FALSE |
|
| 73 |
* |
|
| 74 |
*/ |
|
| 75 |
public void setEmotion(Emotions emo, int duration, boolean blocking) {
|
|
| 76 |
try {
|
|
| 77 |
// System.out.println(">> Sending Emotion: " + emo + " / duration: " + duration + " / Blocking: " + blocking);
|
|
| 78 |
mw.setEmotion(emo, duration, blocking); |
|
| 79 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 80 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 81 |
} |
|
| 82 |
} |
|
| 83 |
|
|
| 84 |
public void setGazeTarget(float pan, float tilt, boolean blocking) {
|
|
| 85 |
try {
|
|
| 86 |
// System.out.println(">> Sending Gaze: pan|tilt|roll: " + pan + " / " + tilt + " / " + roll + " / Blocking: " + blocking);
|
|
| 87 |
mw.setGazeTarget(pan, tilt, blocking); |
|
| 88 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 89 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 90 |
} |
|
| 91 |
} |
|
| 92 |
|
|
| 93 |
public void setGazeTarget(float pan, float tilt, float offsetPan, float offsetTilt, boolean blocking) {
|
|
| 94 |
try {
|
|
| 95 |
// System.out.println(">> Sending Gaze: pan|tilt|roll: " + pan + " / " + tilt + " / " + roll + " / Blocking: " + blocking);
|
|
| 96 |
mw.setGazeTarget(pan, tilt, blocking); |
|
| 97 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 98 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 99 |
} |
|
| 100 |
} |
|
| 101 |
|
|
| 102 |
public void setDefaultEmotion(Emotions emo, boolean blocking) {
|
|
| 103 |
try {
|
|
| 104 |
// System.out.println(">> Sending Default Emotion: " + emo + " / Blocking: " + blocking);
|
|
| 105 |
mw.setDefaultEmotion(emo, blocking); |
|
| 106 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 107 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 108 |
} |
|
| 109 |
} |
|
| 110 |
|
|
| 111 |
public void setHeadAnimation(HeadAnimations ani, int duration, int repetitions, float scale, boolean blocking) {
|
|
| 112 |
try {
|
|
| 113 |
// System.out.println(">> Sending Animation: " + ani + " / Duration: " + duration + " / Repetitions: " + repetitions + " / Blocking: " + blocking);
|
|
| 114 |
mw.setHeadAnimation(ani, duration, repetitions, scale, blocking); |
|
| 115 |
} catch (ExecutionException | TimeoutException ex) {
|
|
| 116 |
Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex); |
|
| 117 |
} |
|
| 118 |
} |
|
| 119 |
|
|
| 120 |
public void getMouthAnimation() {
|
|
| 121 |
System.out.println("Get Mouth Animation - Not implemented.");
|
|
| 122 |
} |
|
| 123 |
|
|
| 124 |
public void getEmotion() {
|
|
| 125 |
System.out.println("Get Emotion - Not implemented.");
|
|
| 126 |
} |
|
| 127 |
|
|
| 128 |
public void getGazeTarget() {
|
|
| 129 |
System.out.println("Get Gaze Target - Not implemented");
|
|
| 130 |
} |
|
| 131 |
|
|
| 132 |
public void getDefaultEmotion() {
|
|
| 133 |
System.out.println("Get Default Emotion - Not implemented");
|
|
| 134 |
} |
|
| 135 |
|
|
| 136 |
public void getHeadAnimation() {
|
|
| 137 |
System.out.println("Get Head Animation - Not implemented");
|
|
| 138 |
} |
|
| 139 |
|
|
| 140 |
public String getRobotName() {
|
|
| 141 |
return this.name; |
|
| 142 |
} |
|
| 143 |
|
|
| 144 |
public String getMiddleware() {
|
|
| 145 |
return this.middlwarename; |
|
| 146 |
} |
|
| 147 |
|
|
| 148 |
} |
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/client/Tuple.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
|
|
| 7 |
package de.cit_ec.opensource.hlrc.client; |
|
| 8 |
|
|
| 9 |
/** |
|
| 10 |
* |
|
| 11 |
* @param <Symbol> |
|
| 12 |
* @param <double> |
|
| 13 |
* |
|
| 14 |
*/ |
|
| 15 |
public class Tuple {
|
|
| 16 |
protected final String s; |
|
| 17 |
protected final int d; |
|
| 18 |
|
|
| 19 |
public Tuple(String phone, int d) {
|
|
| 20 |
this.s = phone; |
|
| 21 |
this.d = d; |
|
| 22 |
} |
|
| 23 |
|
|
| 24 |
} |
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/examples/SimpleExample.java | ||
|---|---|---|
| 1 |
package de.cit_ec.opensource.hlrc.examples; |
|
| 2 |
|
|
| 3 |
import de.cit_ec.opensource.hlrc.client.Emotions; |
|
| 4 |
import de.cit_ec.opensource.hlrc.client.Robot; |
|
| 5 |
|
|
| 6 |
/** |
|
| 7 |
* |
|
| 8 |
* @author flier |
|
| 9 |
*/ |
|
| 10 |
|
|
| 11 |
public class SimpleExample {
|
|
| 12 |
|
|
| 13 |
public SimpleExample(String robotname, String middleware) {
|
|
| 14 |
String name = robotname; |
|
| 15 |
String mw = middleware; |
|
| 16 |
// Create a new Robot |
|
| 17 |
Robot r = new Robot(name, mw); |
|
| 18 |
|
|
| 19 |
// Do something HIGH LEVEL with ease! |
|
| 20 |
r.setEmotion(Emotions.SAD, 1000, true); |
|
| 21 |
// r.setGazeTarget(70.0f, 50.0f, 40.0f, true); |
|
| 22 |
} |
|
| 23 |
|
|
| 24 |
public static void main(String [] args) {
|
|
| 25 |
SimpleExample se = new SimpleExample("/home/kitchen/flobi", "RSB");
|
|
| 26 |
} |
|
| 27 |
|
|
| 28 |
} |
|
| 29 |
|
|
| client/java/src/main/java/de/cit_ec/opensource/hlrc/main/Cmd.java | ||
|---|---|---|
| 1 |
/** |
|
| 2 |
* |
|
| 3 |
* @author flier@techfak.uni-bielefeld.de |
|
| 4 |
* |
|
| 5 |
*/ |
|
| 6 |
|
|
| 7 |
package de.cit_ec.opensource.hlrc.main; |
|
| 8 |
|
|
| 9 |
import de.cit_ec.opensource.hlrc.client.HeadAnimations; |
|
| 10 |
import de.cit_ec.opensource.hlrc.client.Emotions; |
|
| 11 |
import de.cit_ec.opensource.hlrc.client.Robot; |
|
| 12 |
|
|
| 13 |
|
|
| 14 |
import org.apache.commons.cli.BasicParser; |
|
| 15 |
import org.apache.commons.cli.CommandLine; |
|
| 16 |
import org.apache.commons.cli.CommandLineParser; |
|
| 17 |
import org.apache.commons.cli.HelpFormatter; |
|
| 18 |
import org.apache.commons.cli.Options; |
|
| 19 |
import org.apache.commons.cli.ParseException; |
|
| 20 |
|
|
| 21 |
import rsb.RSBException; |
|
| 22 |
|
|
| 23 |
public class Cmd {
|
|
| 24 |
|
|
| 25 |
public static void main(String[] args) throws RSBException {
|
|
| 26 |
|
|
| 27 |
try {
|
|
| 28 |
|
|
| 29 |
Robot robot; |
|
| 30 |
CommandLineParser parser = new BasicParser(); |
|
| 31 |
CommandLine line; |
|
| 32 |
|
|
| 33 |
Options lvOptions = new Options(); |
|
| 34 |
lvOptions.addOption("de", "default", false, "set the robot's default emotion");
|
|
| 35 |
lvOptions.addOption("ga", "gaze", false, "make the robot look somewhere");
|
|
| 36 |
lvOptions.addOption("rg", "resetgaze", false, "make the robot look towards you");
|
|
| 37 |
lvOptions.addOption("sa", "sad", false, "make robot look sad");
|
|
| 38 |
lvOptions.addOption("ha", "happy", false, "make robot look happy");
|
|
| 39 |
lvOptions.addOption("ne", "neutral", false, "make the robot look neutral");
|
|
| 40 |
lvOptions.addOption("an", "angry", false, "make the robot look angry");
|
|
| 41 |
lvOptions.addOption("su", "surprised", false, "make the robot look surprised");
|
|
| 42 |
lvOptions.addOption("fe", "fear", false, "make the robot look afraid");
|
|
| 43 |
lvOptions.addOption("id", "idle", false, "make robot look idle");
|
|
| 44 |
lvOptions.addOption("no", "nodding", false, "make the robot nodding his head");
|
|
| 45 |
lvOptions.addOption("he", "headshake", false, "make the robot shake his head");
|
|
| 46 |
lvOptions.addOption("er", "eyeblinkright", false, "make the robot's right eye blink");
|
|
| 47 |
lvOptions.addOption("el", "eyeblinkleft", false, "make the robot's left eye blink");
|
|
| 48 |
lvOptions.addOption("br", "eyebrowsraise", false, "make the robot's brows raise");
|
|
| 49 |
lvOptions.addOption("bl", "eyebrowslower", false, "make the robot's brows lower");
|
|
| 50 |
lvOptions.addOption("eb", "eyeblinkboth", false, "make both robot's eyes blink");
|
|
| 51 |
lvOptions.addOption("r", "robotname", true, "set the robot name i.e. /home/kitchen/flobi");
|
|
| 52 |
lvOptions.addOption("l", "length", true, "set the length for animations in milliseconds");
|
|
| 53 |
lvOptions.addOption("re", "repetitions", true, "set the number of repetitions for a movement");
|
|
| 54 |
lvOptions.addOption("s", "scale", true, "set the scale for a movement");
|
|
| 55 |
lvOptions.addOption("h", "help", false, "show help");
|
|
| 56 |
|
|
| 57 |
System.out.println("-- High Level Control Client successfully initialized --");
|
|
| 58 |
|
|
| 59 |
try {
|
|
| 60 |
line = parser.parse(lvOptions, args); |
|
| 61 |
} catch (ParseException ex) {
|
|
| 62 |
// Logger.getLogger(Cmd.class.getName()).log(Level.SEVERE, null, ex); |
|
| 63 |
System.out.println("--> Unrecognized Option. Exiting...");
|
|
| 64 |
return; |
|
| 65 |
} |
|
| 66 |
if (line.hasOption("help")) {
|
|
| 67 |
HelpFormatter lvFormater = new HelpFormatter(); |
|
| 68 |
lvFormater.printHelp("High Level Control Client", lvOptions);
|
|
| 69 |
return; |
|
| 70 |
} |
|
| 71 |
|
|
| 72 |
int duration = 1000; |
|
| 73 |
int repetitions = 1; |
|
| 74 |
float scale = 1.0f; |
|
| 75 |
|
|
| 76 |
if (line.getOptionValue("length") != null) {
|
|
| 77 |
duration = Integer.parseInt(line.getOptionValue("length"));
|
|
| 78 |
System.out.println("--> Animation Duration: "+duration+" milliseconds");
|
|
| 79 |
} else {
|
|
| 80 |
System.out.println("--> Animation Duration Default: "+duration+" milliseconds");
|
|
| 81 |
} |
|
| 82 |
|
|
| 83 |
if (line.getOptionValue("scale") != null) {
|
|
| 84 |
scale = Float.parseFloat(line.getOptionValue("length"));
|
|
| 85 |
System.out.println("--> Animation Scale: "+scale);
|
|
| 86 |
} else {
|
|
| 87 |
System.out.println("--> Animation Scale Default: "+scale);
|
|
| 88 |
} |
|
| 89 |
|
|
| 90 |
if (line.getOptionValue("repetitions") != null) {
|
|
| 91 |
repetitions = Integer.parseInt(line.getOptionValue("repetitions"));
|
|
| 92 |
System.out.println("--> Animation Repetitions: "+repetitions);
|
|
| 93 |
} else {
|
|
| 94 |
System.out.println("--> Animation Repetitions Default: "+repetitions);
|
|
| 95 |
} |
|
| 96 |
|
|
| 97 |
if (line.getOptionValue("robotname") != null) {
|
|
| 98 |
robot = new Robot(line.getOptionValue("robotname"), "RSB");
|
|
| 99 |
} else {
|
|
| 100 |
System.out.println("--> You need to provide a robot name, see --help");
|
|
| 101 |
return; |
|
| 102 |
} |
|
| 103 |
|
|
| 104 |
if (line.hasOption("gaze")) {
|
|
| 105 |
robot.setGazeTarget(35.0f, 20.0f, true); |
|
| 106 |
}else if (line.hasOption("resetgaze")) {
|
|
| 107 |
robot.setGazeTarget(0.0f, 0.0f, true); |
|
| 108 |
}else if (line.hasOption("idle")) {
|
|
| 109 |
robot.setHeadAnimation(HeadAnimations.IDLE, duration, repetitions, scale, true); |
|
| 110 |
}else if (line.hasOption("nodding")) {
|
|
| 111 |
robot.setHeadAnimation(HeadAnimations.HEAD_NOD, duration, repetitions, scale, true); |
|
| 112 |
} |
|
| 113 |
else if (line.hasOption("headshake")) {
|
|
| 114 |
robot.setHeadAnimation(HeadAnimations.HEAD_SHAKE, duration, repetitions, scale, true); |
|
| 115 |
} |
|
| 116 |
else if (line.hasOption("eyeblinkright")) {
|
|
| 117 |
robot.setHeadAnimation(HeadAnimations.EYEBLINK_R, duration, repetitions, scale, true); |
|
| 118 |
} |
|
| 119 |
else if (line.hasOption("eyeblinkleft")) {
|
|
| 120 |
robot.setHeadAnimation(HeadAnimations.EYEBLINK_L, duration, repetitions, scale, true); |
|
| 121 |
} |
|
| 122 |
else if (line.hasOption("eyeblinkboth")) {
|
|
| 123 |
robot.setHeadAnimation(HeadAnimations.EYEBLINK_BOTH, duration, repetitions, scale, true); |
|
| 124 |
} |
|
| 125 |
else if (line.hasOption("eyebrowsraise")) {
|
|
| 126 |
robot.setHeadAnimation(HeadAnimations.EYEBROWS_RAISE, duration, repetitions, scale, true); |
|
| 127 |
} |
|
| 128 |
else if (line.hasOption("eyebrowslower")) {
|
|
| 129 |
robot.setHeadAnimation(HeadAnimations.EYEBROWS_LOWER, duration, repetitions, scale, true); |
|
| 130 |
} |
|
| 131 |
else if (line.hasOption("default")) {
|
|
| 132 |
robot.setDefaultEmotion(Emotions.NEUTRAL, true); |
|
| 133 |
} |
|
| 134 |
else if (line.hasOption("sad")) {
|
|
| 135 |
robot.setEmotion(Emotions.SAD, duration, true); |
|
| 136 |
} |
|
| 137 |
else if (line.hasOption("happy")) {
|
|
| 138 |
robot.setEmotion(Emotions.HAPPY, duration, true); |
|
| 139 |
} |
|
| 140 |
else if (line.hasOption("neutral")) {
|
|
| 141 |
robot.setEmotion(Emotions.NEUTRAL, duration, true); |
|
| 142 |
} |
|
| 143 |
else if (line.hasOption("angry")) {
|
|
| 144 |
robot.setEmotion(Emotions.ANGRY, duration, true); |
|
| 145 |
} |
|
| 146 |
else if (line.hasOption("surprised")) {
|
|
| 147 |
robot.setEmotion(Emotions.SURPRISED, duration, true); |
|
| 148 |
} |
|
| 149 |
else if (line.hasOption("fear")) {
|
|
| 150 |
robot.setEmotion(Emotions.FEAR, duration, true); |
|
| 151 |
}else{
|
|
| 152 |
System.out.println("--> Invalid Command "+line.toString());
|
|
| 153 |
} |
|
| 154 |
|
|
| 155 |
// This is currently mandatory due to |
|
| 156 |
// the RSB RemoteServer implementation |
|
| 157 |
robot.mw.deactivateServer(); |
|
| 158 |
} catch (InterruptedException ex) {
|
|
| 159 |
// Logger.getLogger(Cmd.class.getName()).log(Level.SEVERE, null, ex); |
|
| 160 |
System.out.println("Unrecognized Option. Exiting...");
|
|
| 161 |
} |
|
| 162 |
} |
|
| 163 |
} |
|
| client/java/src/main/java/de/uni-bielefeld/cit-ec/opensource/hlrc/client/Emotions.java | ||
|---|---|---|
| 1 |
/* |
|
| 2 |
* This file is part of hlrc |
|
| 3 |
* |
|
| 4 |
* Copyright(c) {flier,sschulz} <AT> techfak.uni-bielefeld.de
|
|
| 5 |
* http://opensource.cit-ec.de/projects/hlrc |
|
| 6 |
* |
|
| 7 |
* This file may be licensed under the terms of the |
|
| 8 |
* GNU General Public License Version 3 (the ``GPL''), |
|
| 9 |
* or (at your option) any later version. |
|
| 10 |
* |
|
| 11 |
* Software distributed under the License is distributed |
|
| 12 |
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either |
|
| 13 |
* express or implied. See the GPL for the specific language |
|
| 14 |
* governing rights and limitations. |
|
| 15 |
* |
|
| 16 |
* You should have received a copy of the GPL along with this |
|
| 17 |
* program. If not, go to http://www.gnu.org/licenses/gpl.html |
|
| 18 |
* or write to the Free Software Foundation, Inc., |
|
| 19 |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 20 |
* |
|
| 21 |
* The development of this software was supported by the |
|
| 22 |
* Excellence Cluster EXC 277 Cognitive Interaction Technology. |
|
| 23 |
* The Excellence Cluster EXC 277 is a grant of the Deutsche |
|
| 24 |
* Forschungsgemeinschaft (DFG) in the context of the German |
|
| 25 |
* Excellence Initiative. |
|
| 26 |
* |
|
| 27 |
*/ |
|
| 28 |
|
|
| 29 |
package de.uni_bielefeld.cit_ec.opensource.hlrc.client; |
|
| 30 |
|
|
| 31 |
public enum Emotions {
|
|
| 32 |
NEUTRAL, |
|
| 33 |
HAPPY, |
|
| 34 |
SAD, |
|
| 35 |
ANGRY, |
|
| 36 |
SURPRISED, |
|
| 37 |
FEAR |
|
| 38 |
} |
|
| client/java/src/main/java/de/uni-bielefeld/cit-ec/opensource/hlrc/client/HeadAnimations.java | ||
|---|---|---|
| 1 |
/* |
|
| 2 |
* This file is part of hlrc |
|
| 3 |
* |
|
| 4 |
* Copyright(c) {flier,sschulz} <AT> techfak.uni-bielefeld.de
|
|
| 5 |
* http://opensource.cit-ec.de/projects/hlrc |
|
| 6 |
* |
|
| 7 |
* This file may be licensed under the terms of the |
|
| 8 |
* GNU General Public License Version 3 (the ``GPL''), |
|
| 9 |
* or (at your option) any later version. |
|
| 10 |
* |
|
| 11 |
* Software distributed under the License is distributed |
|
| 12 |
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either |
|
| 13 |
* express or implied. See the GPL for the specific language |
|
| 14 |
* governing rights and limitations. |
|
| 15 |
* |
|
| 16 |
* You should have received a copy of the GPL along with this |
|
| 17 |
* program. If not, go to http://www.gnu.org/licenses/gpl.html |
|
| 18 |
* or write to the Free Software Foundation, Inc., |
|
| 19 |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 20 |
* |
|
| 21 |
* The development of this software was supported by the |
|
| 22 |
* Excellence Cluster EXC 277 Cognitive Interaction Technology. |
|
| 23 |
* The Excellence Cluster EXC 277 is a grant of the Deutsche |
|
| 24 |
* Forschungsgemeinschaft (DFG) in the context of the German |
|
| 25 |
* Excellence Initiative. |
|
| 26 |
* |
|
| 27 |
*/ |
|
| 28 |
|
|
| 29 |
package de.uni_bielefeld.cit_ec.opensource.hlrc.client; |
|
| 30 |
|
|
| 31 |
public enum HeadAnimations {
|
|
| 32 |
IDLE, |
|
| 33 |
HEAD_NOD, |
|
| 34 |
HEAD_SHAKE, |
|
| 35 |
EYEBLINK_L, |
|
| 36 |
EYEBLINK_R, |
|
| 37 |
EYEBLINK_BOTH, |
|
| 38 |
EYEBROWS_RAISE, |
|
| 39 |
EYEBROWS_LOWER |
|
| 40 |
} |
|
| client/java/src/main/java/de/uni-bielefeld/cit-ec/opensource/hlrc/client/MiddlewareRSB.java | ||
|---|---|---|
| 1 |
/* |
|
| 2 |
* This file is part of hlrc |
|
| 3 |
* |
|
| 4 |
* Copyright(c) {flier,sschulz} <AT> techfak.uni-bielefeld.de
|
|
| 5 |
* http://opensource.cit-ec.de/projects/hlrc |
|
| 6 |
* |
|
| 7 |
* This file may be licensed under the terms of the |
|
| 8 |
* GNU General Public License Version 3 (the ``GPL''), |
|
| 9 |
* or (at your option) any later version. |
|
| 10 |
* |
|
| 11 |
* Software distributed under the License is distributed |
|
| 12 |
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either |
|
| 13 |
* express or implied. See the GPL for the specific language |
|
| 14 |
* governing rights and limitations. |
|
| 15 |
* |
|
| 16 |
* You should have received a copy of the GPL along with this |
|
| 17 |
* program. If not, go to http://www.gnu.org/licenses/gpl.html |
|
| 18 |
* or write to the Free Software Foundation, Inc., |
|
| 19 |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 20 |
* |
|
| 21 |
* The development of this software was supported by the |
|
| 22 |
* Excellence Cluster EXC 277 Cognitive Interaction Technology. |
|
| 23 |
* The Excellence Cluster EXC 277 is a grant of the Deutsche |
|
| 24 |
* Forschungsgemeinschaft (DFG) in the context of the German |
|
| 25 |
* Excellence Initiative. |
|
| 26 |
* |
|
| 27 |
*/ |
|
| 28 |
|
|
| 29 |
package de.uni_bielefeld.cit_ec.opensource.hlrc.client; |
|
| 30 |
|
|
| 31 |
import java.util.ArrayList; |
|
| 32 |
import java.util.HashMap; |
|
| 33 |
import java.util.Map; |
|
| 34 |
import java.util.concurrent.ExecutionException; |
|
| 35 |
import java.util.concurrent.TimeoutException; |
|
| 36 |
import java.util.logging.Level; |
|
| 37 |
import java.util.logging.Logger; |
|
| 38 |
|
|
| 39 |
import javax.sound.sampled.AudioFormat; |
|
| 40 |
import javax.sound.sampled.AudioFormat.Encoding; |
|
| 41 |
|
|
| 42 |
import rsb.Factory; |
|
| 43 |
import rsb.RSBException; |
|
| 44 |
import rsb.converter.DefaultConverterRepository; |
|
| 45 |
import rsb.converter.ProtocolBufferConverter; |
|
| 46 |
import rsb.patterns.RemoteServer; |
|
| 47 |
|
|
| 48 |
import rst.audition.PhonemeType.Phoneme; |
|
| 49 |
import rst.audition.SoundChunkType.SoundChunk; |
|
| 50 |
import rst.audition.UtteranceType.Utterance; |
|
| 51 |
import rst.robot.AnimationType.Animation; |
|
| 52 |
import rst.robot.AnimationType.Animation.AnimationType_t; |
|
| 53 |
import rst.robot.EmotionStateType.EmotionState; |
|
| 54 |
import rst.robot.EmotionStateType.EmotionState.EmotionType; |
|
| 55 |
import rst.robot.GazeTargetType.GazeTarget; |
|
| 56 |
|
|
| 57 |
import com.google.protobuf.ByteString; |
|
| 58 |
|
|
| 59 |
// Create _abstract_ middleware class and function _interface_ for |
|
| 60 |
// future integration of additional Middleware implementations... |
|
| 61 |
|
|
| 62 |
import rsb.Factory; |
|
| 63 |
import rsb.Informer; |
|
| 64 |
|
|
| 65 |
|
|
| 66 |
public class MiddlewareRSB {
|
|
| 67 |
|
|
| 68 |
final RemoteServer server; |
|
| 69 |
final String robotname; |
|
| 70 |
static Map<Emotions, EmotionType> emo_map; |
|
| 71 |
static Map<HeadAnimations, AnimationType_t> han_map; |
|
| 72 |
|
|
| 73 |
public class RSBInformer {
|
|
| 74 |
|
|
| 75 |
final Factory factory; |
|
| 76 |
final Informer<Object> informer; |
|
| 77 |
|
|
| 78 |
public RSBInformer(String scope) throws Throwable {
|
|
| 79 |
|
|
| 80 |
// Get a factory instance to create RSB objects. |
|
| 81 |
factory = Factory.getInstance(); |
|
| 82 |
|
|
| 83 |
// Create an informer on scope "/exmaple/informer". |
|
| 84 |
informer = factory.createInformer(scope); |
|
| 85 |
|
|
| 86 |
// Activate the informer to be ready for work |
|
| 87 |
informer.activate(); |
|
| 88 |
|
|
| 89 |
} |
|
| 90 |
|
|
| 91 |
public void pushMsg(){
|
|
| 92 |
try {
|
|
| 93 |
// Send and event using a method that accepts the data and |
|
| 94 |
// automatically creates an appropriate event internally. |
|
| 95 |
this.informer.send("TODO");
|
|
| 96 |
} catch (RSBException ex) {
|
|
| 97 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 98 |
} |
|
| 99 |
} |
|
| 100 |
|
|
| 101 |
public void closeInf() throws InterruptedException {
|
|
| 102 |
try {
|
|
| 103 |
// As there is no explicit removal model in java, always manually |
|
| 104 |
// deactivate the informer if it is not needed anymore |
|
| 105 |
this.informer.deactivate(); |
|
| 106 |
} catch (RSBException ex) {
|
|
| 107 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 108 |
} |
|
| 109 |
} |
|
| 110 |
|
|
| 111 |
} |
|
| 112 |
|
|
| 113 |
|
|
| 114 |
@SuppressWarnings("unchecked")
|
|
| 115 |
public MiddlewareRSB(String robotname) {
|
|
| 116 |
|
|
| 117 |
this.robotname = robotname; |
|
| 118 |
|
|
| 119 |
server = Factory.getInstance().createRemoteServer(this.robotname+"/set/"); |
|
| 120 |
System.out.println("--> Robot: Talking to "+this.robotname);
|
|
| 121 |
try {
|
|
| 122 |
server.activate(); |
|
| 123 |
} catch (RSBException ex) {
|
|
| 124 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 125 |
} |
|
| 126 |
|
|
| 127 |
{
|
|
| 128 |
final ProtocolBufferConverter<EmotionState> converter = new ProtocolBufferConverter<>(EmotionState.getDefaultInstance()); |
|
| 129 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 130 |
} |
|
| 131 |
{
|
|
| 132 |
final ProtocolBufferConverter<GazeTarget> converter = new ProtocolBufferConverter<>(GazeTarget.getDefaultInstance()); |
|
| 133 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 134 |
} |
|
| 135 |
{
|
|
| 136 |
final ProtocolBufferConverter<Animation> converter = new ProtocolBufferConverter<>(Animation.getDefaultInstance()); |
|
| 137 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 138 |
} |
|
| 139 |
{
|
|
| 140 |
final ProtocolBufferConverter<Utterance> converter = new ProtocolBufferConverter<>(Utterance.getDefaultInstance()); |
|
| 141 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 142 |
} |
|
| 143 |
{
|
|
| 144 |
final ProtocolBufferConverter<SoundChunk> converter = new ProtocolBufferConverter<>(SoundChunk.getDefaultInstance()); |
|
| 145 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 146 |
} |
|
| 147 |
{
|
|
| 148 |
final ProtocolBufferConverter<Phoneme> converter = new ProtocolBufferConverter<>(Phoneme.getDefaultInstance()); |
|
| 149 |
DefaultConverterRepository.getDefaultConverterRepository().addConverter(converter); |
|
| 150 |
} |
|
| 151 |
|
|
| 152 |
emo_map = new HashMap(); |
|
| 153 |
emo_map.put(Emotions.SAD, EmotionType.SAD); |
|
| 154 |
emo_map.put(Emotions.ANGRY, EmotionType.ANGRY); |
|
| 155 |
emo_map.put(Emotions.FEAR, EmotionType.FEAR); |
|
| 156 |
emo_map.put(Emotions.NEUTRAL, EmotionType.NEUTRAL); |
|
| 157 |
emo_map.put(Emotions.SURPRISED, EmotionType.SURPRISED); |
|
| 158 |
emo_map.put(Emotions.HAPPY, EmotionType.HAPPY); |
|
| 159 |
|
|
| 160 |
han_map = new HashMap(); |
|
| 161 |
han_map.put(HeadAnimations.HEAD_NOD, AnimationType_t.HEAD_NOD); |
|
| 162 |
han_map.put(HeadAnimations.HEAD_SHAKE, AnimationType_t.HEAD_SHAKE); |
|
| 163 |
han_map.put(HeadAnimations.IDLE, AnimationType_t.IDLE); |
|
| 164 |
han_map.put(HeadAnimations.EYEBLINK_R, AnimationType_t.EYEBLINK_R); |
|
| 165 |
han_map.put(HeadAnimations.EYEBLINK_L, AnimationType_t.EYEBLINK_L); |
|
| 166 |
han_map.put(HeadAnimations.EYEBLINK_BOTH, AnimationType_t.EYEBLINK_BOTH); |
|
| 167 |
han_map.put(HeadAnimations.EYEBROWS_LOWER, AnimationType_t.EYEBROWS_LOWER); |
|
| 168 |
han_map.put(HeadAnimations.EYEBROWS_RAISE, AnimationType_t.EYEBROWS_RAISE); |
|
| 169 |
} |
|
| 170 |
|
|
| 171 |
private SoundChunk compileSoundChunk(AudioFormat audio, byte[] data) {
|
|
| 172 |
SoundChunk.Builder sc = SoundChunk.newBuilder(); |
|
| 173 |
ByteString bs = ByteString.copyFrom(data); |
|
| 174 |
boolean isbig = audio.isBigEndian(); |
|
| 175 |
sc.setChannels(audio.getChannels()); |
|
| 176 |
sc.setData(bs); |
|
| 177 |
sc.setRate((int) audio.getSampleRate()); |
|
| 178 |
|
|
| 179 |
if (isbig) {
|
|
| 180 |
sc.setEndianness(SoundChunk.EndianNess.ENDIAN_BIG); |
|
| 181 |
} else {
|
|
| 182 |
sc.setEndianness(SoundChunk.EndianNess.ENDIAN_LITTLE); |
|
| 183 |
} |
|
| 184 |
|
|
| 185 |
sc.setSampleCount(data.length / audio.getFrameSize()); |
|
| 186 |
Encoding enc = audio.getEncoding(); |
|
| 187 |
|
|
| 188 |
if (enc.equals(Encoding.PCM_SIGNED)) {
|
|
| 189 |
int size = audio.getSampleSizeInBits(); |
|
| 190 |
if (size == 8) {
|
|
| 191 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S8); |
|
| 192 |
} else if (size == 16) {
|
|
| 193 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S16); |
|
| 194 |
} else if (size == 24) {
|
|
| 195 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_S24); |
|
| 196 |
} else {
|
|
| 197 |
System.err.println("Audio Sample Size Not Valid");
|
|
| 198 |
} |
|
| 199 |
} else if (enc.equals(Encoding.PCM_UNSIGNED)) {
|
|
| 200 |
int size = audio.getSampleSizeInBits(); |
|
| 201 |
if (size == 8) {
|
|
| 202 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U8); |
|
| 203 |
} else if (size == 16) {
|
|
| 204 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U16); |
|
| 205 |
} else if (size == 24) {
|
|
| 206 |
sc.setSampleType(SoundChunk.SampleType.SAMPLE_U24); |
|
| 207 |
} else {
|
|
| 208 |
System.err.println("Audio Sample Size not valid");
|
|
| 209 |
// This is too rigorous, maybe. |
|
| 210 |
// System.exit(-1); |
|
| 211 |
} |
|
| 212 |
} else {
|
|
| 213 |
System.err.println("Audio Encoding is invalid");
|
|
| 214 |
} |
|
| 215 |
return sc.build(); |
|
| 216 |
} |
|
| 217 |
|
|
| 218 |
public void deactivateServer() throws InterruptedException {
|
|
| 219 |
try {
|
|
| 220 |
this.server.deactivate(); |
|
| 221 |
} catch (RSBException ex) {
|
|
| 222 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 223 |
} |
|
| 224 |
} |
|
| 225 |
|
|
| 226 |
// OBSOLETE |
|
| 227 |
/* |
|
| 228 |
public MouthAnimation createMouthAnimationMessage(int duration, boolean active) {
|
|
| 229 |
MouthAnimation.Builder ma = MouthAnimation.newBuilder(); |
|
| 230 |
ma.setDuration(duration); |
|
| 231 |
ma.setActive(active); |
|
| 232 |
return ma.build(); |
|
| 233 |
} |
|
| 234 |
*/ |
|
| 235 |
|
|
| 236 |
public Utterance createSetSpeak(SoundChunk soundchunck, ArrayList tuList, String text) {
|
|
| 237 |
Utterance.Builder ut = Utterance.newBuilder(); |
|
| 238 |
ut.setAudio(soundchunck); |
|
| 239 |
for (int i=0; i< tuList.size();i++) {
|
|
| 240 |
Phoneme.Builder ph = Phoneme.newBuilder(); |
|
| 241 |
Tuple t = (Tuple) tuList.get(i); |
|
| 242 |
ph.setSymbol(t.s); |
|
| 243 |
ph.setDuration(t.d); |
|
| 244 |
ut.addPhonemes(i, ph); |
|
| 245 |
|
|
| 246 |
} |
|
| 247 |
System.out.println("Phonem count " + ut.getPhonemesCount() + " Phonem list " + ut.getPhonemesList());
|
|
| 248 |
ut.setText(text); |
|
| 249 |
return ut.build(); |
|
| 250 |
} |
|
| 251 |
|
|
| 252 |
public Animation createHeadAnimationMessage(HeadAnimations ani, int duration, int repetition, float scale) {
|
|
| 253 |
Animation.Builder ha = Animation.newBuilder(); |
|
| 254 |
ha.setRepetitions(repetition); |
|
| 255 |
ha.setTarget(han_map.get(ani)); |
|
| 256 |
ha.setDurationEach(duration); |
|
| 257 |
ha.setScale(scale); |
|
| 258 |
return ha.build(); |
|
| 259 |
} |
|
| 260 |
|
|
| 261 |
public EmotionState createCurrentEmotionMessage(Emotions emo, int duration) {
|
|
| 262 |
EmotionState.Builder es = EmotionState.newBuilder(); |
|
| 263 |
es.setDuration(duration); |
|
| 264 |
es.setValue(emo_map.get(emo)); |
|
| 265 |
return es.build(); |
|
| 266 |
} |
|
| 267 |
|
|
| 268 |
public EmotionState createDefaultEmotionMessage(Emotions emo) {
|
|
| 269 |
EmotionState.Builder es = EmotionState.newBuilder(); |
|
| 270 |
es.setValue(emo_map.get(emo)); |
|
| 271 |
return es.build(); |
|
| 272 |
} |
|
| 273 |
|
|
| 274 |
public GazeTarget createGazeTargetMessage(float pan, float tilt, float roll) {
|
|
| 275 |
GazeTarget.Builder gt = GazeTarget.newBuilder(); |
|
| 276 |
gt.setPan(pan); |
|
| 277 |
gt.setTilt(tilt); |
|
| 278 |
gt.setRoll(roll); |
|
| 279 |
return gt.build(); |
|
| 280 |
} |
|
| 281 |
|
|
| 282 |
public void setSpeak(AudioFormat audio, byte[] bs, ArrayList tu, String text, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 283 |
SoundChunk sc; |
|
| 284 |
sc = compileSoundChunk(audio, bs); |
|
| 285 |
if (blocking) {
|
|
| 286 |
try {
|
|
| 287 |
server.call("utterance", createSetSpeak(sc, tu, text));
|
|
| 288 |
// System.out.println("Server replied: " + server.call("utterance", createSetSpeak(sc, tu)));
|
|
| 289 |
} catch (RSBException ex) {
|
|
| 290 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 291 |
} |
|
| 292 |
} else {
|
|
| 293 |
try {
|
|
| 294 |
server.callAsync("utterance", createSetSpeak(sc, tu, text));
|
|
| 295 |
// System.out.println("Set Mouth Animation non-blocking, not wating for reply");
|
|
| 296 |
} catch (RSBException ex) {
|
|
| 297 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 298 |
} |
|
| 299 |
} |
|
| 300 |
} |
|
| 301 |
|
|
| 302 |
public void setCurrentEmotion(Emotions emo, int duration, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 303 |
try {
|
|
| 304 |
if (blocking) {
|
|
| 305 |
server.call("currentEmotion", createCurrentEmotionMessage(emo, duration));
|
|
| 306 |
// System.out.println("Server replied: " + server.call("currentEmotion", createEmotionMessage(emo, duration)));
|
|
| 307 |
} else {
|
|
| 308 |
server.callAsync("currentEmotion", createCurrentEmotionMessage(emo, duration));
|
|
| 309 |
// System.out.println("Set Emotion non-blocking, not wating for reply");
|
|
| 310 |
} |
|
| 311 |
|
|
| 312 |
} catch (RSBException ex) {
|
|
| 313 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 314 |
} |
|
| 315 |
} |
|
| 316 |
|
|
| 317 |
public void setGazeTarget(float pan, float tilt, float roll, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 318 |
try {
|
|
| 319 |
if (blocking) {
|
|
| 320 |
server.call("gaze", createGazeTargetMessage(pan, tilt, roll));
|
|
| 321 |
// System.out.println("Server replied: " + server.call("gaze", createGazeTargetMessage(pan, tilt, roll)));
|
|
| 322 |
} else {
|
|
| 323 |
server.callAsync("gaze", createGazeTargetMessage(pan, tilt, roll));
|
|
| 324 |
// System.out.println("Set Gaze non-blocking, not wating for reply");
|
|
| 325 |
} |
|
| 326 |
} catch (RSBException ex) {
|
|
| 327 |
Logger.getLogger(MiddlewareRSB.class.getName()).log(Level.SEVERE, null, ex); |
|
| 328 |
} |
|
| 329 |
} |
|
| 330 |
|
|
| 331 |
public void setDefaultEmotion(Emotions emo, boolean blocking) throws ExecutionException, TimeoutException {
|
|
| 332 |
try {
|
|
| 333 |
if (blocking) {
|
|
| 334 |
server.call("defaultEmotion", createDefaultEmotionMessage(emo));
|
|
| 335 |
// System.out.println("Server replied: " + server.call("defaultEmotion", createDefaultEmotionMessage(emo)));
|
|
| 336 |
} else {
|
|
| 337 |
server.callAsync("defaultEmotion", createDefaultEmotionMessage(emo));
|
|
| 338 |
// System.out.println("Set Default Emotion non-blocking, not wating for reply");
|
|
| 339 |
} |
|
| 340 |
} catch (RSBException ex) {
|
|
Also available in: Unified diff