obniz developer team
Published

Kids Project: Empathetic Panda ~Facial Imitation~

Let's make an empathetic panda imitating your facial expression!

BeginnerFull instructions provided449
Kids Project: Empathetic Panda ~Facial Imitation~

Things used in this project

Hardware components

obniz
Cambrian Robotics obniz
×1
ServoMotor SG5010
×2
Paper and Wires
×1

Story

Read more

Code

untitled_file-1.html

HTML
<html>
<head>
 <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
 <script src="https://unpkg.com/obniz@1.8.2/obniz.js"></script>
 <script src="https://rawgit.com/auduno/clmtrackr/dev/build/clmtrackr.js"></script>
 <script src="https://rawgit.com/auduno/clmtrackr/dev/models/model_pca_20_svm.js"></script>
 <script src="https://rawgit.com/auduno/clmtrackr/dev/examples/js/emotion_classifier.js"></script>
 <script src="https://rawgit.com/auduno/clmtrackr/dev/examples/js/emotionmodel.js"></script>
</head>
<body>
 <div id="obniz-debug"></div>
 <video id="video" width="400" height="300" autoplay></video>
 <canvas id="canvas" width="400" height="300"></canvas> 
 <div id="print"></div>
<script>
var speaker;
var obniz = new Obniz("OBNIZ_ID_HERE")
var servoR;
var servoL;
obniz.onconnect = async () => {
servoR = obniz.wired("ServoMotor", {signal:0,vcc:1, gnd:2});
servoL = obniz.wired("ServoMotor", {signal:9,vcc:10, gnd:11});
//servoR.angle(90);
//servoL.angle(90);
await startEmotion()
}
async function startEmotion() {
 var video = document.getElementById("video");
 var canvas = document.getElementById("canvas");
 var context = canvas.getContext("2d");
 var stream = await navigator.mediaDevices.getUserMedia({
   video: {facingMode: "user"},
   audio: false
 });
 video.srcObject = stream;
 video.onloadedmetadata = function(e) {
   video.play();
 };
 var tracker = new clm.tracker();
 tracker.init(pModel);
 tracker.start(video);
 var classifier = new emotionClassifier();
 classifier.init(emotionModel);
 function drawLoop() {
   requestAnimationFrame(drawLoop);
   var positions = tracker.getCurrentPosition();
   var parameters = tracker.getCurrentParameters();
   var emotion = classifier.meanPredict(parameters);   
   context.clearRect(0, 0, canvas.width, canvas.height);
   tracker.draw(canvas);
   var emotions = {};
   for (var i=0; i<emotion.length; i++) {
     emotions[emotion[i].emotion] = emotion[i].value;
   }
   $("#print").html("sad: " + emotions.sad +"happy: " + emotions.happy)
   var angleR = 90;
   var angleL = 90;
   if(emotions.happy > emotions.sad){
     angleR = (emotions.happy) * (120 - 90) / (1 - 0) + 90;
     servoR.angle(angleR);
     angleL = ((emotions.happy) * (60 - 90) / (1 - 0) + 90);
     servoL.angle(angleL);
     console.log("happy");
   } else if (emotions.happy < emotions.sad){
     angleR = (emotions.sad) * (30 - 90) / (0.8 - 0) + 90;
     servoR.angle(angleR);
     angleL = ((emotions.sad) * (150 - 90) / (0.8 - 0) + 90);
     servoL.angle(angleL);
     console.log("sad");
   }
   console.log("R=" + angleR + "\nL=" + angleL);
 }
 drawLoop();
}
</script>
</body>
</html> 

Credits

obniz developer team
80 projects • 36 followers
Development board "obniz" is controlled via the internet.

Comments