Skip to content

Instantly share code, notes, and snippets.

@show0k
Last active November 22, 2018 18:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save show0k/58a1d73f2723c9f4ddf86024f08c1d0f to your computer and use it in GitHub Desktop.
Save show0k/58a1d73f2723c9f4ddf86024f08c1d0f to your computer and use it in GitHub Desktop.
from __future__ import division
import time
import json
import cv2
from pypot.primitive import LoopPrimitive
import numpy as np
class ColorDetection(LoopPrimitive):
def __init__(self, robot, freq=5.):
"""Color represent a dict of hue min and max to filter"""
LoopPrimitive.__init__(self, robot, freq)
self._colors = {}
self._results = {}
def _get_hue_center_range(self, percentile=[25,75]):
"""Return the hue quartiles of a center square in the image"""
img = self.robot.camera.frame[100:300, 250:450]
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
return tuple(np.percentile(hsv[:, :, 0], percentile))
def add_color(self, name=None):
hsv_range = self._get_hue_center_range()
if hsv_range[1] - hsv_range[0] > 15:
msg = "Error: color is not aquired correctly. Put your object on the center of the camera"
return msg
else:
self._colors[name] = self._get_hue_center_range()
return self._colors
def add_color_by_hue_range(self, name=None, hue_low=None, hue_high=None):
self._colors[name] = (float(hue_low), float(hue_high))
return self._colors
def pop_color(self, name=None):
self._colors.pop(name, None)
self._results.pop(name, None)
return self._colors
def clear_colors(self):
self.stop()
self._colors = {}
self._results = {}
def filter_by_hue(self, hue_scopes=[(0,255)]):
img = self.robot.camera.frame
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
results = []
for hmin, hmax in hue_scopes:
hsv_mask = cv2.inRange(hsv, (hmin, 0, 0), (hmax, 255, 255))
mask = cv2.erode(hsv_mask, None, iterations=4)
results.append(cv2.countNonZero(mask)/(img.shape[0] * img.shape[1]))
return results
def update(self):
if self._colors:
self._get_centroid()
@property
def centroid(self):
return self._results
@property
def filters(self):
return self._colors
@property
def best_detected_color(self, threeshold=0.1):
"""Return best detected color"""
if not self.running:
self.start()
time.sleep(0.5)
try:
color = max(self._results, key=lambda key: self._results[key])
if self._results[color][0] > threeshold:
return color
except ValueError:
pass
return None
def get_centroid_color(self, name=None):
return json.dumps(self._results[name])
def _get_centroid(self):
"""return %of of detection of the blob, x position, y position """
img = self.robot.camera.frame
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for color, (hue_min, hue_max) in self._colors.items():
hue_threshold = (10 - (hue_max - hue_min)) if (10 - (hue_max - hue_min)) > 0 else 0
hsv_mask = cv2.inRange(hsv, (max(hue_min - hue_threshold, 0), 0, 0), (min(hue_max + hue_threshold, 255), 255, 255))
mask = cv2.erode(hsv_mask, None, iterations=3)
score = cv2.countNonZero(mask)/(img.shape[0] * img.shape[1])
moments = cv2.moments(mask, True)
try:
cx = moments['m10'] / moments['m00']
cy = moments['m01'] / moments['m00']
self._results[color] = (score, cx * 100 / img.shape[1], cy * 100 / img.shape[0])
except ZeroDivisionError:
self._results[color] = (0, 0, 0)
wget https://gist.githubusercontent.com/show0k/58a1d73f2723c9f4ddf86024f08c1d0f/raw/05acabde6fb3473b8e5a763a92bba1659649fced/color_detection.py -O /home/poppy/dev/poppy_ergo_jr/primitives/color_detection.py
wget https://gist.github.com/show0k/58a1d73f2723c9f4ddf86024f08c1d0f/raw/8f39a60717bf58094ecd17f79e1c1e5e90895ccb/poppy_ergo_jr.py -O /home/poppy/dev/poppy_ergo_jr/poppy_ergo_jr.py
wget https://gist.githubusercontent.com/show0k/58a1d73f2723c9f4ddf86024f08c1d0f/raw/4d798da8eb9f3d6256a569276d4e44d3f0955aad/poppy-basic-blocks.xml -O /home/poppy/dev/pypot/server/snap_projects/pypot-snap-blocks.xml
<project name="activité découverte - snap" app="Snap! 4.0, http://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAEm0lEQVR4nO3U8WvUdRzH8e9/EUn3m+6HiIJ+6UeR6of6oR9qgf0gSAr9sqEzGmTCqiFMcsJOa1Ns22ku21xz7bY52W6ou53LNe12eGfabSpb/RAoXLe77YavfpCsn9wqjlcezwe84X64H158ePINJCmdTmt4eFiDg4Nr3sULFzQxMVG2Gx4aUjQaVSwW0/z8vFDZglQqpXQ6rUwms+Yt3s5q4J0NmtnxlK7uLM/dqtuoXxYXlMlkNDU1pbm5OfcboYyCnp4eJZNJJZNJbdu2TW1tbYpEIjp+/Lg6OzvV0dGhLVu2KJlMarTvlOZrnlbp5iXlD7+h0s0JLV8+pVJ2Svnml7U8Flbp+qiWJzpUjO5Xob9BxZGDyjU8p9XslFZ+HNDqwqzyza8o31qtlZk+FcfCKp5v1srVfhV6PlCuPqRfF+4+2jQzM+N+I5RRcOLECU1PT2t6elr79u1TXV2damtrtXv3bjU1NammpkYHDhxQJpNR9OsvtbBrg4ojB1Uc3K/SjQsqpc5pdfG6Cqd3Kf/Fmyqlzmk5cVKluStaXUhp5Uq3fm98UcXzh1S69p1WfujV0rGtytWHtHKtX8WRZpWyU1r5/rRKP19Wrj6khTvzjzYRYGUL2tvbFY/HFY/HNTQ0pK6uLkUiEbW2turo0aOKRCJqbGxUKpVS/1fHtLBrg/Kt1cp9/LyKY2EVvtmj4mhY+WNbtdT5rpZHmlX4du/Dr9nejVpqe1tL7dtVHG1RofdDFccOq9BVq9xHm7R08j0tde5UMdqo4lCTltq3K1cf0u3srUebEomE+41QRsHk5KRisZjGx8fXvEujw/ptzzPK1YfKd3s36qcbGY2Pj+vs2bPKZDLuN0IZBZIUi8XU0tKicDi85p05c0bRaLRs193drXA4rCNHjmh2dtb9Piiz4M8fDx48+N8dKl+w9l+A8iFAWBEgrAgQVgQIKwKEFQHCigBhRYCwIkBYESCsCBBWBAgrAoQVAcKKAGFFgLAiQFgRIKwIEFYECCsChBUBwooAYUWAsCJAWBEgrAgQVgQIKwKEFQHCigBhRYCwIkBYESCsCBBWBAgrAoQVAcKKAGFFgLAiQFgRIKwIcJ3u37+vWPqie0bFIcB16u3t1bPXXnXPqDgEuE4N4U8VLFbps/jn7ikVhQAf4969e+rr61PDoU+0efAtBYtVCgZCKpVK7mkVgwAfYzx9SS/Mvv4wvL/djtE697SKQYDrcCjRqmAg9FeEdzdpcnLSPasiEOA6ra6uaufY+wrubFKwWKXNY9XuSRWBAP+hRCKhzbFqBYtVGs7G3HOeeAT4Lw1nx/TS6dfcM554BPgfxeNx94QnGgHCigBhRYCwIkBYESCsCBBWBAgrAoQVAcKKAGFFgLAiQFgRIKwIEFYECCsChBUBwooAYUWAsCJAWBEgrAgQVgQIKwKEFQHCigBhRYCwIkBYESCsCBBWBAgrAoQVAcKKAGFFgLAiQFgRIKwIEFYECCsChBUBwooAYUWAsCJAWBEgrAgQVgQIKwKEFQHCigBhRYCwIkBYESCsCBBWBAgrAoQVAcKKAGFFgLD6A1lGnVBTMR9SAAAAAElFTkSuQmCC</thumbnail><stage name="Stage" width="480" height="360" costume="0" tempo="60" threadsafe="false" lines="round" ternary="true" codify="false" inheritance="false" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAACtUlEQVR4nO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bo3+AAF/RMkcAAAAAElFTkSuQmCC</pentrails><costumes><list id="2"></list></costumes><sounds><list id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="connect" idx="4" x="24" y="-138.99999999999994" heading="135" scale="1" rotation="1" draggable="true" hidden="true" costume="0" color="4.6410000000000045,232.05,0" pen="tip" id="8"><costumes><list id="9"></list></costumes><sounds><list id="10"></list></sounds><variables></variables><blocks></blocks><scripts><script x="20" y="20"><custom-block s="set $robot host to %s"><l>poppy-2.local</l></custom-block></script><script x="20" y="59"><custom-block s="$robot test connection"></custom-block></script></scripts></sprite><sprite name="activité1" idx="1" x="0" y="5.684341886080802e-14" heading="135" scale="1" rotation="1" draggable="true" costume="0" color="0,230,38" pen="tip" id="17"><costumes><list id="18"></list></costumes><sounds><list id="19"></list></sounds><variables></variables><blocks></blocks><scripts><comment x="20" y="10" w="90" collapsed="true">1. Cliquez</comment><comment x="20" y="756.9999999999975" w="95" collapsed="true">6. Et le robot</comment><comment x="20" y="852.999999999997" w="95" collapsed="true">4. Agir</comment><script x="20" y="884.9999999999973"><custom-block s="$robot set color leds of motor(s) %s in %txt"><custom-block s="$robot all motors"></custom-block><l>green</l></custom-block><block s="doWait"><l>1</l></block><custom-block s="$robot set color leds of motor(s) %s in %txt"><custom-block s="$robot all motors"></custom-block><l>off</l></custom-block></script><comment x="20" y="972.0000000000005" w="95" collapsed="true">8. Capter</comment><script x="20" y="1004.0000000000016"><block s="doForever"><script><block s="doIf"><block s="reportKeyPressed"><l><option>space</option></l></block><script><custom-block s="$robot set color leds of motor(s) %s in %txt"><custom-block s="$robot all motors"></custom-block><l>green</l></custom-block><block s="doWait"><l>1</l></block></script></block><custom-block s="$robot set color leds of motor(s) %s in %txt"><custom-block s="$robot all motors"></custom-block><l>off</l></custom-block></script></block></script><comment x="20" y="1153.0000000000014" w="95" collapsed="true">9. Couleurs</comment><script x="20" y="1185.0000000000027"><custom-block s="$robot camera add color %s"><l>color_name</l></custom-block></script><script x="20" y="1224.0000000000032"><custom-block s="$robot camera all colors filters"></custom-block></script><script x="20" y="1256.0000000000036"><custom-block s="$robot camera remove color %s"><l>color_name</l></custom-block></script><script x="20" y="1295.000000000004"><custom-block s="$robot color %s is detected ?"><l>color_name</l></custom-block></script><comment x="20" y="1328.000000000004" w="95" collapsed="true">Le Défi</comment><script x="20" y="59.00000000000023"><block s="doResetTimer"></block></script><script x="145" y="62.00000000000023"><block s="getTimer"></block></script><script x="229" y="61.00000000000023"><block s="reportLessThan"><block s="getTimer"></block><l>10</l></block></script><comment x="19" y="109.00000000000057" w="90" collapsed="true">2. Déplacez</comment><script x="23" y="154.00000000000034"><block s="reportSum"><l>2</l><l>2</l></block></script><script x="19" y="195.00000000000045"><block s="reportEquals"><block s="reportEquals"><block s="reportSum"><l>2</l><l>2</l></block><l>5</l></block><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><comment x="20" y="247.00000000000063" w="90" collapsed="true">3. Assembler</comment><script x="21" y="287.00000000000045"><block s="down"></block><block s="setColor"><color>0,230,38,1</color></block><block s="turn"><l>15</l></block><block s="forward"><l>10</l></block></script><comment x="21" y="400.00000000000057" w="90" collapsed="true">4. Répéter</comment><script x="260" y="657.9999999999975"><block s="doIfElse"><l/><script></script><script></script></block></script><script x="259" y="596.9999999999978"><block s="doSayFor"><l>Hello!</l><l>2</l></block></script><script x="17" y="592.9999999999978"><block s="doSayFor"><l>faisont un test</l><l>1</l></block><block s="doIfElse"><block s="reportEquals"><block s="reportSum"><l>2</l><l>2</l></block><l>4</l></block><script><block s="doSayFor"><l>c&apos;est vrai !</l><l>1</l></block></script><script><block s="doSayFor"><l>c&apos;est faux !</l><l>1</l></block></script></block><block s="doSayFor"><l>essaie encore !</l><l>1</l></block></script><comment x="20" y="546.9999999999981" w="95" collapsed="true">5. Conditionner</comment><script x="18" y="801.9999999999973"><custom-block s="$robot test connection"></custom-block></script><script x="171" y="800.9999999999973"><custom-block s="$robot all motors"></custom-block></script><script x="139" y="155.00000000000034"><block s="reportEquals"><l></l><l>4</l></block></script><script x="183" y="326.0000000000002"><block s="clear"></block></script></scripts></sprite><sprite name="guirlande" idx="3" x="-181.00000000000023" y="-59.99999999999994" heading="135" scale="1" rotation="1" draggable="true" hidden="true" costume="0" color="137.70000000000002,107.406,0" pen="tip" id="123"><costumes><list id="124"></list></costumes><sounds><list id="125"></list></sounds><variables></variables><blocks></blocks><scripts><script x="20" y="117"><custom-block s="$robot set color leds of motor(s) %s in %txt"><l>motor_name</l><l>off</l></custom-block></script><script x="199" y="53"><block s="doWait"><l>1</l></block></script><script x="30" y="50"><block s="doRepeat"><l>10</l><script></script></block></script></scripts></sprite><sprite name="activité2" idx="2" x="0" y="5.684341886080802e-14" heading="135" scale="1" rotation="1" draggable="true" hidden="true" costume="0" color="163.20000000000002,9.79200000000001,0" pen="tip" id="137"><costumes><list id="138"></list></costumes><sounds><list id="139"></list></sounds><variables></variables><blocks></blocks><scripts><script x="24.06044725668869" y="10"><custom-block s="$robot set motor(s) %s %txt"><custom-block s="$robot all motors"></custom-block><l>stiff</l></custom-block></script><script x="24.19354838709677" y="64.71785718104479"><custom-block s="$robot set position(s) %n of motor(s) %s in %n seconds | wait ? %boolUE"><l>42</l><l>m5</l><l>1</l><l/></custom-block></script><script x="25.545370155488513" y="189.8508346700214"><custom-block s="$robot set position(s) %n of motor(s) %s in %n seconds | wait ? %boolUE"><l>-90</l><l>m6</l><l>2</l><l/></custom-block><custom-block s="$robot set position(s) %n of motor(s) %s in %n seconds | wait ? %boolUE"><l>-40</l><l>m5</l><l>2</l><block s="reportBoolean"><l><bool>true</bool></l></block></custom-block></script><script x="31" y="125"><custom-block s="$robot Start Position"></custom-block></script></scripts></sprite><watcher var="port" style="normal" x="0.0000023841856773287873" y="0.000007390976435317498" color="243,118,29" hidden="true"/><watcher var="host" style="normal" x="0.0004487037658691406" y="0.005495548248298121" color="243,118,29"/></sprites></stage><hidden></hidden><headers></headers><code><delim></delim><string>&lt;#1&gt;</string><parms_list>Context &gt;&gt; a CommandBlockMorph (&quot;script variables %scriptVars...&quot;) a VariableFrame {}</parms_list><tempvars_delim>Context &gt;&gt; a CommandBlockMorph (&quot;script variables %scriptVars...&quot;) a VariableFrame {}</tempvars_delim><doSetVar>Context &gt;&gt; a CommandBlockMorph (&quot;script variables %scriptVars...&quot;) a VariableFrame {}</doSetVar></code><blocks><block-definition s="$robot motors in group %&apos;alias&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="302" collapsed="false">Return a list of motors which are grouped in the input alias</comment><header></header><code></code><inputs><input type="%txt">group_name</input></inputs><script><block s="doDeclareVariables"><list><l>output</l></list></block><block s="doSetVar"><l>output</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/</l><block var="alias"/></list></block></block></block><block s="doIfElse"><block s="reportEquals"><block var="output"/><l></l></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Group &lt; </l><block var="alias"/><l> &gt; is not in the aivaible groups of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><custom-block s="$robot all motors groups"></custom-block></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doReport"><block s="reportTextSplit"><block var="output"/><l>/</l></block></block></script></block></script></block-definition><block-definition s="$robot all motors" type="reporter" category="sensing"><comment x="0" y="0" w="90" collapsed="false">Return a list of all available motors</comment><header></header><code></code><inputs></inputs><script><block s="doReport"><custom-block s="$robot motors in group %txt"><l>motors</l></custom-block></block></script></block-definition><block-definition s="$robot get all motors positions" type="reporter" category="sensing"><comment x="0" y="0" w="170" collapsed="false">Return a list of all motors present positions, in the order of &quot;$robot all motors&quot; block list.&#xD;&#xD;Usefull for some advanced programs.</comment><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/get/positions</l></list></block></block><l>;</l></block></block></script></block-definition><block-definition s="if %&apos;test&apos; then %&apos;true&apos; else %&apos;false&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doReport"><block s="evaluate"><block var="true"/><list></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="false"/><list></list></block></block></script></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>step</l><l>tester</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block var="start"/><block var="end"/></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportLessThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script><script><block s="doSetVar"><l>step</l><l>1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportGreaterThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script></block><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doUntil"><block s="evaluate"><block var="tester"/><list></list></block><script><block s="doRun"><block var="action"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="$robot get %&apos;register&apos; of motor(s) %&apos;motors&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Get a defined &lt;register&gt; &lt;value&gt; of one motor.&#xD;Example of some registers : torque_limit, angle_limit, present_temperature, present_position...&#xD;For more informations about registers, look at the online documentation : http://$robot-project.github.io/pypot/&#xD;</comment><header></header><code></code><inputs><input type="%s">present_position<options>position=present_position
speed=present_speed
load (force)=present_load
temperature=present_temperature
voltage=present_voltage</options></input><input type="%s">motor_name</input></inputs><script><block s="doDeclareVariables"><list><l>output</l><l>complete motor list</l></list></block><block s="doSetVar"><l>complete motor list</l><custom-block s="$robot all motors"></custom-block></block><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="motors"/><l><option>list</option></l></block></block><script><block s="doIfElse"><block s="reportOr"><block s="reportIsIdentical"><block var="motors"/><l>all</l></block><block s="reportIsIdentical"><block var="motors"/><l></l></block></block><script><block s="doSetVar"><l>motors</l><custom-block s="$robot all motors"></custom-block></block></script><script><block s="doSetVar"><l>motors</l><block s="reportTextSplit"><block var="motors"/><l><option>whitespace</option></l></block></block></script></block></script></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="motors"/><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block var="complete motor list"/><block var="m"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Motor &lt; </l><block var="m"/><l> &gt; is not in the available motors of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="complete motor list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script></block></script></custom-block><block s="doIfElse"><block s="reportEquals"><block s="reportListLength"><block var="motors"/></block><l>1</l></block><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/</l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><block var="motors"/></custom-block><l>/get/</l><block var="register"/></list></block></block></block></script><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/</l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><block var="motors"/></custom-block><l>/get/</l><block var="register"/></list></block></block><l>;</l></block></block></script></block></script></block-definition><block-definition s="$robot index of motor %&apos;motor&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="109" collapsed="false">Return the index of a motor name in the &quot;$robot all motors&quot; block list</comment><header></header><code></code><inputs><input type="%txt">motor_name</input></inputs><script><block s="doDeclareVariables"><list><l>i</l><l>complete motor list</l></list></block><block s="doSetVar"><l>complete motor list</l><custom-block s="$robot all motors"></custom-block></block><block s="doSetVar"><l>i</l><l>1</l></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="complete motor list"/><script><block s="doIf"><block s="reportEquals"><block var="m"/><block var="motor"/></block><script><block s="doReport"><block var="i"/></block></script></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></custom-block><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Motor &lt; </l><block var="motor"/><l>&gt; is not in the aivaible motors of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="complete motor list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script></block-definition><block-definition s="$robot robot URL" type="reporter" category="sensing"><comment x="0" y="0" w="117" collapsed="false">For internal use only</comment><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportJoinWords"><list><block var="host"/><l>:</l><block var="port"/></list></block></block></script></block-definition><block-definition s="$robot set motor(s) %&apos;motor&apos; %&apos;compliant&apos;" type="command" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Compliance property make motors activly become soft and movable.&#xD;You need to activate the compliance if you want to record a movement by demonstration.&#xD;&#xD;The motor(s) input can accept :&#xD;- string of a motor name&#xD;- string of many motors separed with spaces&#xD;- a Snap! list of motors like the reporter block &quot;$robot all motors&quot;</comment><header></header><code></code><inputs><input type="%s">motor_name</input><input type="%txt" readonly="true">compliant<options>compliant
stiff</options></input></inputs><script><block s="doDeclareVariables"><list><l>comp</l></list></block><block s="doSetVar"><l>comp</l><custom-block s="if %b then %anyUE else %anyUE"><block s="reportOr"><block s="reportEquals"><block var="compliant"/><l>compliant</l></block><block var="compliant"/></block><l>1</l><l>0</l></custom-block></block><custom-block s="$robot set %txt of motor(s) %s to %s"><l>compliant</l><block var="motor"/><block var="comp"/></custom-block></script></block-definition><block-definition s="$robot set position(s) %&apos;position&apos; of motor(s) %&apos;motors&apos; in %&apos;duration&apos; seconds | wait ? %&apos;wait&apos;" type="command" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">set motor to the desired position (angle) in the desired time.&#xD;&#xD;The motor(s) input can accept :&#xD;- string of a motor name&#xD;- string of many motors separed with spaces&#xD;- a Snap! list of motors like the reporter block &quot;$robot all motors&quot;</comment><header></header><code></code><inputs><input type="%n">0</input><input type="%s">motor_name</input><input type="%n">2</input><input type="%boolUE"></input></inputs><script><block s="doDeclareVariables"><list><l>output</l><l>complete motor list</l><l>i</l><l>mot_pos</l><l>querry_URL</l></list></block><block s="doSetVar"><l>mot_pos</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>i</l><l>1</l></block><block s="doSetVar"><l>complete motor list</l><custom-block s="$robot all motors"></custom-block></block><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="motors"/><l><option>list</option></l></block></block><script><block s="doIfElse"><block s="reportIsIdentical"><block var="motors"/><l></l></block><script><block s="doSetVar"><l>motors</l><custom-block s="$robot all motors"></custom-block></block></script><script><block s="doSetVar"><l>motors</l><block s="reportTextSplit"><block var="motors"/><l><option>whitespace</option></l></block></block></script></block></script></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="motors"/><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block var="complete motor list"/><block var="m"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Motor </l><block var="m"/><l> is not in the aivaible motors of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="complete motor list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="position"/><l><option>list</option></l></block><script><block s="doAddToList"><block s="reportJoinWords"><list><block var="m"/><l>:</l><block s="reportListItem"><block var="i"/><block var="position"/></block></list></block><block var="mot_pos"/></block></script><script><block s="doAddToList"><block s="reportJoinWords"><list><block var="m"/><l>:</l><block var="position"/></list></block><block var="mot_pos"/></block></script></block></script></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></custom-block><block s="doSetVar"><l>querry_URL</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/set/goto/</l><block s="reportJoinWords"><list><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>:</l><block var="duration"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><block var="mot_pos"/></custom-block><l>:</l><block var="duration"/></list></block></list></block></block></block><block s="doIfElse"><block s="evaluate"><block var="wait"/><list></list></block><script><block s="doRun"><block s="reifyReporter"><autolambda><block var="querry_URL"/></autolambda><list></list></block><list></list></block><block s="doWait"><block var="duration"/></block></script><script><block s="doReport"><block var="querry_URL"/></block></script></block></script></block-definition><block-definition s="$robot reset %&apos;simulation&apos;" type="command" category="control"><comment x="0" y="0" w="182" collapsed="false">Reset the simulation in V-rep.&#xD;It is usefull if you have connection issues with V-rep.</comment><header></header><code></code><inputs><input type="%s" readonly="true">robot<options>robot
simulation</options></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="simulation"/><l>robot</l></block><script><block s="fork"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reifyReporter"><autolambda><block s="reportURL"><block s="reportJoinWords"><list><block var="host"/><l>/services.php?python=restart</l></list></block></block></autolambda><list></list></block><list></list></block></autolambda><list></list></block><list></list></block><block s="fork"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reifyReporter"><autolambda><block s="reportURL"><block s="reportJoinWords"><list><block var="host"/><l>/reset</l></list></block></block></autolambda><list></list></block><list></list></block></autolambda><list></list></block><list></list></block></script><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/reset-simulation</l></list></block></block></block></script></block></script></block-definition><block-definition s="$robot all recorded moves" type="reporter" category="sensing"><comment x="0" y="0" w="164" collapsed="false">Return a list of all previous records filename.</comment><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MovePlayer</l></list></block></block><l>/</l></block></block></script></block-definition><block-definition s="append %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="287" collapsed="false">Take any number of input lists, and create a new list containing the items of the input lists. So&#xD; APPEND [A B] [C D]&#xD;where the [,,,] are lists reports the list&#xD; [A B C D]&#xD;not [[A B] [C D]].</comment><header></header><code></code><inputs><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="lists"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListLength"><block var="lists"/></block><l>1</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="lists"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="lists"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><custom-block s="append %mult%l"><block s="reportCDR"><block var="lists"/></block></custom-block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="lists"/></block></block><custom-block s="append %mult%l"><block s="reportCONS"><block s="reportCDR"><block s="reportListItem"><l>1</l><block var="lists"/></block></block><block s="reportCDR"><block var="lists"/></block></block></custom-block></block></block></script></block></script></block-definition><block-definition s="reverse %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="223" collapsed="false">Reports a new list containing the items of the input list, but in the opposite order.</comment><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>helper</l></list></block><block s="doSetVar"><l>helper</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="input"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="result"/></block></script></block><block s="doReport"><block s="evaluate"><block var="helper"/><list><block s="reportCDR"><block var="input"/></block><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="input"/></block><block var="result"/></block></list></block></block></script><list><l>input</l><l>result</l></list></block></block><block s="doWarp"><script><block s="doReport"><block s="evaluate"><block var="helper"/><list><block var="data"/><block s="reportNewList"><list></list></block></list></block></block></script></block></script></block-definition><block-definition s="remove duplicates from %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="209" collapsed="false">Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.</comment><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="reportListContainsItem"><block s="reportCDR"><block var="data"/></block><block s="reportListItem"><l>1</l><block var="data"/></block></block><script><block s="doReport"><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="remove duplicates from %l"><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script></block></script></block></script></block-definition><block-definition s="sort %&apos;data&apos; ordering with %&apos;function&apos;" type="reporter" category="lists"><comment x="0" y="0" w="204" collapsed="false">Reports a sorted version of the list in its first input slot, using the comparison function in the second input slot. For a list of numbers, using &lt; as the comparison function will sort from low to high; using &gt; will sort from high to low.</comment><header></header><code></code><inputs><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doDeclareVariables"><list><l>even items</l><l>odd items</l><l>merge</l></list></block><block s="doSetVar"><l>odd items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><l/></block><block s="evaluate"><block var="even items"/><list><block s="reportCDR"><l/></block></list></block></block></block></script><list></list></block></block><block s="doSetVar"><l>even items</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><l></l><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="evaluate"><block var="odd items"/><list><block s="reportCDR"><l/></block></list></block></block></script><list></list></block></block><block s="doSetVar"><l>merge</l><block s="reifyScript"><script><block s="doIf"><block s="reportEquals"><block var="#1"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#2"/></block></script></block><block s="doIf"><block s="reportEquals"><block var="#2"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="#1"/></block></script></block><block s="doIfElse"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>1</l><block var="#2"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="evaluate"><block var="merge"/><list><block s="reportCDR"><block var="#1"/></block><block var="#2"/></list></block></block></block></script><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="#2"/></block><block s="evaluate"><block var="merge"/><list><block var="#1"/><block s="reportCDR"><block var="#2"/></block></list></block></block></block></script></block></script><list><l>#1</l><l>#2</l></list></block></block><block s="doIf"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportCDR"><block var="data"/></block><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doReport"><block s="evaluate"><block var="merge"/><list><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="odd items"/><list><block var="data"/></list></block><block var="function"/></custom-block><custom-block s="sort %l ordering with %predRing"><block s="evaluate"><block var="even items"/><list><block var="data"/></list></block><block var="function"/></custom-block></list></block></block></script></block-definition><block-definition s="$robot set %&apos;register&apos; of motor(s) %&apos;motors&apos; to %&apos;value&apos;" type="command" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Set a defined &lt;value&gt; to a defined &lt;register&gt; of one or many motors.&#xD;Example of some registers : torque_limit, angle_limit, safe_compliant, compliant...&#xD;For more informations about registers, look at the online documentation : http://$robot-project.github.io/pypot/&#xD;&#xD;The motor(s) input can accept :&#xD;- string of a motor name&#xD;- string of many motors separed with spaces&#xD;- a Snap! list of motors like the reporter block &quot;$robot all motors&quot;</comment><header></header><code></code><inputs><input type="%txt"><options>position=goal_position
speed=moving_speed
max torque(%)=torque_limit
compliancy(True or False)=compliant</options></input><input type="%s">motor_name</input><input type="%s">value(s)</input></inputs><script><block s="doDeclareVariables"><list><l>output</l><l>complete motor list</l></list></block><block s="doSetVar"><l>complete motor list</l><custom-block s="$robot all motors"></custom-block></block><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="motors"/><l><option>list</option></l></block></block><script><block s="doIfElse"><block s="reportIsIdentical"><block var="motors"/><l>all</l></block><script><block s="doSetVar"><l>motors</l><custom-block s="$robot all motors"></custom-block></block></script><script><block s="doSetVar"><l>motors</l><block s="reportTextSplit"><block var="motors"/><l><option>whitespace</option></l></block></block></script></block></script></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="motors"/><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block var="complete motor list"/><block var="m"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Motor &lt; </l><block var="m"/><l> &gt; is not in the aivaible motors of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="complete motor list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script></block></script></custom-block><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/set/registers/</l><block s="reportJoinWords"><list><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>:</l><block var="register"/><l>:</l><block var="value"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><block var="motors"/></custom-block><l>:</l><block var="register"/><l>:</l><block var="value"/></list></block></list></block></block></block></script></block-definition><block-definition s="$robot get %&apos;running&apos; behaviours" type="reporter" category="sensing"><header></header><code></code><inputs><input type="%s" readonly="true">all<options>all
running</options></input></inputs><script><block s="doIfElse"><block s="reportIsIdentical"><block var="running"/><l>running</l></block><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitives/</l><l>running</l></list></block></block><l>/</l></block></block></script><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitives</l><l></l></list></block></block><l>/</l></block></block></script></block></script></block-definition><block-definition s="$robot play move %&apos;record_name&apos; | speed x %&apos;speed&apos;" type="reporter" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Play the movement of a previous recorded move. &#xD;&#xD;The &lt;record_name&gt; input is the name of a .record filename which should be in the same directory where you started the web server (with the command &quot;$robot-snap $robot-ergo&quot; for example).&#xD;&#xD;You can change the play speed with the &lt;speed&gt; input.</comment><header></header><code></code><inputs><input type="%txt">move_name</input><input type="%n">1</input></inputs><script><block s="doDeclareVariables"><list><l>time</l></list></block><block s="doDeclareVariables"><list><l>wait</l></list></block><block s="doSetVar"><l>wait</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doIfElse"><block s="reportListContainsItem"><custom-block s="$robot all recorded moves"></custom-block><block var="record_name"/></block><script><block s="doSetVar"><l>time</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MovePlayer/</l><block var="record_name"/><l>/start/</l><block var="speed"/></list></block></block></block><block s="doIf"><block var="wait"/><script><block s="doWait"><block var="time"/></block></script><comment w="90" collapsed="false">ugly wait to stop feature.&#xD;TODO : change with a looking at running primitive</comment></block></script><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Error : &lt;</l><block var="record_name"/><l>&gt; is not is the avaible records (look at the block $robot all records to see all recorded moves) </l><custom-block s="$robot all recorded moves"></custom-block></list></block></custom-block></script></block><block s="doReport"><block var="record_name"/></block></script></block-definition><block-definition s="$robot sequence %&apos;mov&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%mult%repRing"></input></inputs><script><block s="doDeclareVariables"><list><l>out</l></list></block><block s="doSetVar"><l>out</l><l></l></block><custom-block s="for each %upvar of %l %cs"><l>item</l><block var="mov"/><script><block s="doSetVar"><l>out</l><block s="reportJoinWords"><list><block s="reportCallCC"><block var="item"/></block><l>;</l><block var="out"/></list></block></block></script></custom-block><block s="doReport"><block var="out"/></block></script></block-definition><block-definition s="$robot concurrent %&apos;movements&apos;" type="reporter" category="control"><comment x="0" y="0" w="202" collapsed="false">All reports input are run concurently.&#xD;You can use this block to play concurently many recorded move</comment><header></header><code></code><inputs><input type="%mult%repRing"></input></inputs><script><block s="doDeclareVariables"><list><l>results</l><l>iterator</l></list></block><block s="doSetVar"><l>results</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>iterator</l><l>0</l></block><block s="doRepeat"><block s="reportListLength"><block var="movements"/></block><script><block s="fork"><block s="reifyScript"><script><block s="doAddToList"><block s="reportCallCC"><block s="reportListItem"><block var="iterator"/><block var="movements"/></block></block><block var="results"/></block></script><list></list></block><list></list></block><block s="doChangeVar"><l>iterator</l><l>1</l></block><custom-block s="yield"></custom-block></script></block><block s="doWaitUntil"><block s="reportEquals"><block s="reportListLength"><block var="movements"/></block><block s="reportListLength"><block var="results"/></block></block></block><block s="doReport"><block var="results"/></block></script></block-definition><block-definition s="map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block></list></block></block></block></script><list><l>data</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></list></block></block></block></script><list><l>data lists</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="combine with %&apos;function&apos; items of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="data"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block><block s="doReport"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="combine with %repRing items of %l"><block var="function"/><block s="reportCDR"><block var="data"/></block></custom-block></list></block></block></script></block></script></block-definition><block-definition s="join words %&apos;words&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="words"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="words"/></block><block s="reportJoinWords"><list><l> </l><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></autolambda><list></list></block><list></list></block></list></block></list></block></block></script></block></script></block-definition><block-definition s="list $arrowRight sentence %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="data"/></custom-block></block></script></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="text"/><l><option>whitespace</option></l></block></block></script></block></script></block-definition><block-definition s="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block></script></block-definition><block-definition s="word $arrowRight list %&apos;word&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="word"/><l><option>letter</option></l></block></block></script></block></script></block-definition><block-definition s="sum %&apos;nums&apos;" type="reporter" category="operators"><comment x="0" y="0" w="202" collapsed="false">Takes any number of numbers as inputs (use the left and right arrowheads to adjust the number of input slots) and reports the result of adding them all, so&#xD;ISUM (4) (100) (8))&#xD;reports 112.</comment><header></header><code></code><inputs><input type="%mult%n"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="nums"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><l>0</l></block></script></block><block s="doReport"><block s="reportSum"><block s="reportListItem"><l>1</l><block var="nums"/></block><custom-block s="sum %mult%n"><block s="reportCDR"><block var="nums"/></block></custom-block></block></block></script></block-definition><block-definition s="product %&apos;nums&apos;" type="reporter" category="operators"><comment x="0" y="0" w="205" collapsed="false">Takes any number of numbers as inputs (use the left and right arrowheads to adjust the number of input slots) and reports the result of multiplying them all, so&#xD;(PRODUCT (4) (100) (8))&#xD;reports 3200.</comment><header></header><code></code><inputs><input type="%mult%n"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="nums"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><l>1</l></block></script></block><block s="doReport"><block s="reportProduct"><block s="reportListItem"><l>1</l><block var="nums"/></block><custom-block s="product %mult%n"><block s="reportCDR"><block var="nums"/></block></custom-block></block></block></script></block-definition><block-definition s="all of %&apos;preds&apos;" type="predicate" category="operators"><comment x="0" y="0" w="247.99999999999997" collapsed="false">Takes any number of Boolean (true/false) inputs (use the left and right arrowheads to adjust the number of input slots) and reports TRUE only if all of the inputs are TRUE, otherwise FALSE. Like AND but for multiple inputs.</comment><header></header><code></code><inputs><input type="%mult%boolUE"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="preds"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><block s="doReport"><block s="reportAnd"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="preds"/></block><list></list></block><custom-block s="all of %mult%boolUE"><block s="reportCDR"><block var="preds"/></block></custom-block></block></block></script></block-definition><block-definition s="any of %&apos;preds&apos;" type="predicate" category="operators"><comment x="0" y="0" w="240" collapsed="false">Takes any number of Boolean (true/false) inputs (use the left and right arrowheads to adjust the number of input slots) and reports TRUE if at least one input is TRUE, otherwise FALSE.</comment><header></header><code></code><inputs><input type="%mult%boolUE"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="preds"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block><block s="doReport"><block s="reportOr"><block s="evaluate"><block s="reportListItem"><l>1</l><block var="preds"/></block><list></list></block><custom-block s="any of %mult%boolUE"><block s="reportCDR"><block var="preds"/></block></custom-block></block></block></script></block-definition><block-definition s="yield" type="command" category="other"><header></header><code></code><inputs></inputs><script><block s="doWait"><l>0.00000000000001</l></block></script></block-definition><block-definition s="$robot create &amp; start record move %&apos;record_name&apos; with motor(s) %&apos;motors input&apos;" type="command" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Create and start the record of a defininied move..&#xD;&#xD;The &lt;record_name&gt; input is used to store the recorded move. The move is stored in the directory where you started the web server (with the command &quot;$robot-snap $robot-ergo&quot; for example), and can be replayed even if you close Snap! &#xD; &#xD;The motor(s) input can accept :&#xD;- string of a motor name&#xD;- string of many motors separed with spaces&#xD;- a Snap! list of motors like the reporter block &quot;$robot all motors&quot;&#xD;&#xD;If the motor(s) input is empty, all motors will be recorded.</comment><header></header><code></code><inputs><input type="%s">move_name</input><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>motors_list</l><l>complete motor list</l><l>complete aliases list</l></list></block><block s="doSetVar"><l>motors_list</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>complete motor list</l><custom-block s="$robot all motors"></custom-block></block><block s="doIf"><block s="reportIsIdentical"><block var="record_name"/><l></l></block><script><custom-block s="$robot popup %txt"><l>Input error, record name must not be empty</l></custom-block><block s="doReport"><l></l></block></script></block><block s="doIfElse"><block s="reportEquals"><block var="motors input"/><l></l></block><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MoveRecorder/</l><block var="record_name"/><l>/start/</l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><custom-block s="$robot all motors"></custom-block></custom-block></list></block></block></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="motors input"/><l><option>list</option></l></block><script><block s="doSetVar"><l>motors_list</l><custom-block s="append %mult%l"><list><block var="motors_list"/><block var="motors input"/></list></custom-block></block></script><script><block s="doIfElse"><block s="reportOr"><block s="reportIsA"><block var="motors input"/><l><option>number</option></l></block><block s="reportIsA"><block var="motors input"/><l><option>text</option></l></block></block><script><block s="doSetVar"><l>motors_list</l><custom-block s="append %mult%l"><list><block var="motors_list"/><block s="reportTextSplit"><block var="motors input"/><l><option>whitespace</option></l></block></list></custom-block></block></script><script><custom-block s="$robot popup %txt"><l>Input error, you should look at help (right click on the bock)</l></custom-block></script></block></script></block></script></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="motors_list"/><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block var="complete motor list"/><block var="m"/></block></block><script><block s="doIf"><block s="reportEquals"><block var="complete aliases list"/><l>0</l><comment w="90" collapsed="false">Set all aliases here for optimisation issues</comment></block><script><block s="doSetVar"><l>complete aliases list</l><custom-block s="$robot all motors groups"></custom-block></block></script></block><block s="doIfElse"><block s="reportListContainsItem"><block var="complete aliases list"/><block var="m"/></block><script><block s="doSetVar"><l>motors_list</l><custom-block s="append %mult%l"><list><block var="motors_list"/><custom-block s="$robot motors in group %txt"><block var="m"/></custom-block></list></custom-block></block></script><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Motor </l><block var="m"/><l>does not exist in your robot. </l></list></block></custom-block><block s="doReport"><l></l></block></script></block></script></block></script></custom-block><custom-block s="$robot set motor(s) %s %txt"><block var="motors_list"/><l>compliant</l></custom-block><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MoveRecorder/</l><block var="record_name"/><l>/start/</l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><block var="#1"/><l>;</l><block var="#2"/></list></block></autolambda><list><l>#1</l><l>#2</l></list></block><block var="motors_list"/></custom-block></list></block></block></block></script></block-definition><block-definition s="$robot stop record &amp; save move %&apos;record_name&apos;" type="command" category="control"><comment x="0" y="0" w="489" collapsed="false">Stop recording the desired move record. &#xD;Be careful, you must have previously defined a move record with the &quot;create move ... with motor(s) ...&quot; block</comment><header></header><code></code><inputs><input type="%s">move_name</input></inputs><script><block s="doDeclareVariables"><list><l>motors</l></list></block><block s="doSetVar"><l>motors</l><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MoveRecorder/</l><block var="record_name"/><l>/get_motors</l></list></block></block><l>/</l></block></block><custom-block s="$robot set motor(s) %s %txt"><block var="motors"/><block s="reportBoolean"><l><bool>false</bool></l></block></custom-block><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MoveRecorder/</l><block var="record_name"/><l>/stop</l></list></block></block></block></script></block-definition><block-definition s="$robot stop move %&apos;record_name&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">move_name</input></inputs><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MovePlayer/</l><block var="record_name"/><l>/stop</l></list></block></block></block></script></block-definition><block-definition s="$robot popup %&apos;message&apos;" type="command" category="other"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>message</l></list><l>alert(message);</l></block><list><block var="message"/></list></block></script></block-definition><block-definition s="pool map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="204" collapsed="false">Works as the map block (see map help), but it proceeds iterations concurently.</comment><header></header><code></code><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doDeclareVariables"><list><l>results</l><l>iterator</l><l>input_list</l><l>list</l></list></block><block s="doSetVar"><l>results</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>iterator</l><l>0</l></block><block s="doRepeat"><block s="reportListLength"><block s="reportListItem"><l>1</l><block var="lists"/></block></block><script><block s="doChangeVar"><l>iterator</l><l>1</l></block><block s="doSetVar"><l>input_list</l><block s="reportNewList"><list></list></block></block><custom-block s="for each %upvar of %l %cs"><l>list</l><block var="lists"/><script><block s="doAddToList"><block s="reportListItem"><block var="iterator"/><block var="list"/></block><block var="input_list"/></block></script></custom-block><block s="fork"><block s="reifyScript"><script><block s="doAddToList"><block s="evaluate"><block var="function"/><block var="input_list"/></block><block var="results"/></block></script><list></list></block><list></list></block><custom-block s="yield"></custom-block></script></block><block s="doWaitUntil"><block s="reportEquals"><block s="reportListLength"><block var="results"/></block><block s="reportListLength"><block s="reportListItem"><l>1</l><block var="lists"/></block></block></block></block><block s="doReport"><block var="results"/></block></script></block-definition><block-definition s="$robot play concurently moves %&apos;inputs&apos;" type="reporter" category="control"><comment x="0" y="0" w="260" collapsed="false">Play previous recorded move concurently. Inputs can be : &#xD;* move name (string)&#xD;* many moves name separated by whitespace&#xD;* any reporter block, like sequential or play sequentialy</comment><header></header><code></code><inputs><input type="%mult%s"></input></inputs><script><block s="doDeclareVariables"><list><l>move_names</l><l>reporters</l><l>tmp_string</l><l>tmp_reporter</l></list></block><block s="doSetVar"><l>move_names</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>tmp_string</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>reporters</l><block s="reportNewList"><list></list></block></block><custom-block s="for each %upvar of %l %cs"><l>item</l><block var="inputs"/><script><block s="doIfElse"><block s="reportOr"><block s="reportIsA"><block var="item"/><l><option>text</option></l></block><block s="reportIsA"><block var="item"/><l><option>number</option></l></block></block><script><block s="doSetVar"><l>move_names</l><custom-block s="append %mult%l"><list><block var="move_names"/><block s="reportTextSplit"><block var="item"/><l>;</l></block></list></custom-block></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doSetVar"><l>move_names</l><custom-block s="append %mult%l"><list><block var="move_names"/><block var="item"/></list></custom-block></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>reporter</option></l></block><script><block s="doAddToList"><block var="item"/><block var="reporters"/></block></script><script><custom-block s="$robot popup %txt"><l>Input is not valid. See help (right click on the block)</l></custom-block></script></block></script></block></script></block></script></custom-block><custom-block s="for each %upvar of %l %cs"><l>item</l><block var="move_names"/><script><block s="fork"><block s="reifyScript"><script><block s="doAddToList"><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="$robot play move %txt | speed x %n"><l></l><l>1</l></custom-block></autolambda><list></list></block><list><block var="item"/></list></block><block var="tmp_string"/></block></script><list></list></block><list></list></block><custom-block s="yield"></custom-block></script></custom-block><block s="doSetVar"><l>tmp_reporter</l><custom-block s="$robot concurrent %mult%repRing"><list><block s="reifyReporter"><script></script><list></list></block></list></custom-block></block><block s="doWaitUntil"><block s="reportEquals"><block s="reportListLength"><block var="tmp_string"/></block><block s="reportListLength"><block var="move_names"/></block></block></block><block s="doReport"><custom-block s="append %mult%l"><list><block var="tmp_reporter"/><block var="tmp_string"/></list></custom-block></block></script><scripts><comment x="131" y="660.2" w="265" collapsed="false">TODO : understand why a sequential input blocks return items on a list rather than separated with whitespace</comment></scripts></block-definition><block-definition s="$robot play sequentially moves %&apos;inputs&apos;" type="reporter" category="control"><comment x="0" y="0" w="267" collapsed="false">Play previous recorded moves sequentialy. Inputs can be : &#xD;* move name (string)&#xD;* many moves name separated by whitespace&#xD;* any reporter block like concurent or play concurently</comment><header></header><code></code><inputs><input type="%mult%s"></input></inputs><script><block s="doDeclareVariables"><list><l>move_names</l><l>reporters</l><l>out</l></list></block><block s="doSetVar"><l>move_names</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>reporters</l><block s="reportNewList"><list></list></block></block><custom-block s="for each %upvar of %l %cs"><l>item</l><block var="inputs"/><script><block s="doIfElse"><block s="reportOr"><block s="reportIsA"><block var="item"/><l><option>text</option></l></block><block s="reportIsA"><block var="item"/><l><option>number</option></l></block></block><script><block s="doSetVar"><l>move_names</l><custom-block s="append %mult%l"><list><block var="move_names"/><block s="reportTextSplit"><block var="item"/><l>;</l></block></list></custom-block></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doSetVar"><l>move_names</l><custom-block s="append %mult%l"><list><block var="move_names"/><block var="item"/></list></custom-block></block></script><script><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>reporter</option></l></block><script><block s="doAddToList"><block var="item"/><block var="reporters"/></block></script><script><custom-block s="$robot popup %txt"><l>Input is not valid. See help (right click on the block)</l></custom-block></script></block></script></block></script></block></script></custom-block><block s="doReport"><custom-block s="join words %mult%txt"><list><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><custom-block s="$robot play move %txt | speed x %n"><l></l><l>1</l></custom-block></autolambda><list></list></block><list><block var="move_names"/></list></custom-block></custom-block><custom-block s="$robot sequence %mult%repRing"><list><block s="reifyReporter"><script></script><list></list></block></list></custom-block></list></custom-block></block></script></block-definition><block-definition s="$robot all motors groups" type="reporter" category="sensing"><comment x="0" y="0" w="171" collapsed="false">Return a list of all aliases.&#xD;Alias is a keyword for representing many motors at once. </comment><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/motors/</l><l>alias</l></list></block></block><l>/</l></block></block></script></block-definition><block-definition s="items %&apos;i&apos; to %&apos;j&apos; of %&apos;list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="146" collapsed="false">Return a sublist which contains items in the interval of 2 input numbers.&#xD;Original list is not modified.</comment><header></header><code></code><inputs><input type="%n"></input><input type="%n"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doIf"><block s="reportLessThan"><block var="i"/><l>0</l></block><script><block s="doSetVar"><l>i</l><block s="reportSum"><block s="reportListLength"><block var="list"/></block><block var="i"/></block></block></script></block><block s="doIf"><block s="reportLessThan"><block var="j"/><l>0</l></block><script><block s="doSetVar"><l>j</l><block s="reportSum"><block s="reportListLength"><block var="list"/></block><block var="j"/></block></block></script></block><custom-block s="for %upvar = %n to %n %cs"><l>elem</l><custom-block s="if %b then %anyUE else %anyUE"><block var="i"/><block var="i"/><l>1</l></custom-block><custom-block s="if %b then %anyUE else %anyUE"><block var="j"/><block var="j"/><block s="reportListLength"><block var="list"/></block></custom-block><script><block s="doAddToList"><block s="reportListItem"><block var="elem"/><block var="list"/></block><block var="result"/></block></script></custom-block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="$robot play move %&apos;record_name&apos; in reverse | speed x %&apos;speed&apos;" type="reporter" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Play in reverse the movement of a previous recorded move. &#xD;&#xD;The &lt;record_name&gt; input is the name of a .record filename which should be in the same directory where you started the web server (with the command &quot;$robot-snap $robot-ergo&quot; for example).&#xD;&#xD;You can change the play speed with the &lt;speed&gt; input.</comment><header></header><code></code><inputs><input type="%s">move_name</input><input type="%n">1</input></inputs><script><block s="doDeclareVariables"><list><l>time</l></list></block><block s="doDeclareVariables"><list><l>wait</l></list></block><block s="doSetVar"><l>wait</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doIfElse"><block s="reportListContainsItem"><custom-block s="$robot all recorded moves"></custom-block><block var="record_name"/></block><script><block s="doSetVar"><l>time</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MovePlayer/</l><block var="record_name"/><l>/start/</l><block var="speed"/><l>/backwards</l></list></block></block></block><block s="doIf"><block var="wait"/><script><block s="doWait"><block var="time"/></block></script><comment w="90" collapsed="false">ugly wait to stop feature.&#xD;TODO : change with a looking at running primitive</comment></block></script><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Error : &lt;</l><block var="record_name"/><l>&gt; is not is the avaible records (look at the block $robot all records to see all recorded moves) </l><custom-block s="$robot all recorded moves"></custom-block></list></block></custom-block></script></block><block s="doReport"><block var="record_name"/></block></script></block-definition><block-definition s="$robot test connection" type="reporter" category="sensing"><header></header><code></code><inputs></inputs><script><block s="doIfElse"><custom-block s="ping http:// %s"><custom-block s="$robot robot URL"></custom-block></custom-block><script><block s="doReport"><l>Connection ok!</l></block></script><script><block s="doReport"><l>You may have connection troubles. Check the host variable</l></block></script></block></script></block-definition><block-definition s="index of %&apos;var&apos; in %&apos;list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="194" collapsed="false">Return the index of a item in a list</comment><header></header><code></code><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>i</l></list></block><block s="doSetVar"><l>i</l><l>1</l></block><custom-block s="for each %upvar of %l %cs"><l>m</l><block var="list"/><script><block s="doIf"><block s="reportEquals"><block var="m"/><block var="var"/></block><script><block s="doReport"><block var="i"/></block></script></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></custom-block><block s="doReport"><l>0</l></block></script></block-definition><block-definition s="$robot http:// %&apos;input&apos;" type="reporter" category="other"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>output</l><l>timer_init</l></list></block><block s="doSetVar"><l>timer_init</l><block s="getTimer"></block></block><block s="doSetVar"><l>output</l><block s="reportNewList"><list></list></block></block><block s="fork"><block s="reifyScript"><script><block s="doAddToList"><block s="reportURL"><block var="input"/></block><block var="output"/></block></script><list></list></block><list></list></block><block s="doWaitUntil"><block s="reportOr"><block s="reportGreaterThan"><block s="reportDifference"><block s="getTimer"></block><block var="timer_init"/></block><l>3.5</l></block><block s="reportGreaterThan"><block s="reportListLength"><block var="output"/></block><l>0</l></block></block></block><block s="doIf"><block s="reportGreaterThan"><block s="reportDifference"><block s="getTimer"></block><block var="timer_init"/></block><l>3</l></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Robot is not connected to </l><block var="input"/></list></block></custom-block><block s="doReport"><l>error</l></block></script></block><block s="doReport"><block s="reportListItem"><l>1</l><block var="output"/></block></block></script><scripts><script x="452.9853535625002" y="75.0000070000001"><custom-block s="$robot all motors"></custom-block></script><script x="539.8916025624999" y="95.00000100000011"><block s="reportURL"><block var="input"/></block></script><script x="397.2265645" y="240.00000399999993"><block s="doSetVar"><l>output</l><l>0</l></block></script><script x="433" y="179.2"><block s="reportListLength"><l/></block></script><script x="701.5517588124999" y="139.00000500000004"><block s="reportStringSize"><l>world</l></block></script></scripts></block-definition><block-definition s="$robot %&apos;action&apos; behaviours %&apos;primitive&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%txt" readonly="true">start<options>start
stop
pause
resume</options></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>all primitives</l><l>keyword list</l></list></block><block s="doSetVar"><l>all primitives</l><custom-block s="$robot get %s behaviours"><l>all</l></custom-block></block><block s="doSetVar"><l>keyword list</l><block s="reportNewList"><list><l>start</l><l>stop</l><l>pause</l><l>resume</l></list></block></block><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block var="all primitives"/><block var="primitive"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Primitive &lt; </l><block var="primitive"/><l> &gt; is not in the aivaible primitives of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="all primitives"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block var="keyword list"/><block var="action"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Action &lt; </l><block var="action"/><l> &gt; is not valid : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="keyword list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/</l><block var="primitive"/><l>/</l><block var="action"/></list></block></block></block></script></block></script></block></script></block-definition><block-definition s="$robot get %&apos;input&apos; of behaviour %&apos;primitive&apos;" type="reporter" category="sensing"><header></header><code></code><inputs><input type="%s" readonly="true">methodes<options>methodes
properties</options></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>all primitives</l><l>keyword list</l></list></block><block s="doSetVar"><l>all primitives</l><custom-block s="$robot get %s behaviours"><l>all</l></custom-block></block><block s="doSetVar"><l>keyword list</l><block s="reportNewList"><list><l>properties</l><l>methodes</l></list></block></block><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block var="all primitives"/><block var="primitive"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Primitive </l><block var="primitive"/><l> is not in the aivaible primitives of your robot : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="all primitives"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doIfElse"><block s="reportNot"><block s="reportListContainsItem"><block var="keyword list"/><block var="input"/></block></block><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Input </l><block var="input"/><l> is not valid : </l><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="keyword list"/></custom-block></list></block></custom-block><block s="doReport"><l></l></block></script><script><block s="doReport"><block s="reportTextSplit"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/</l><block var="primitive"/><l>/</l><block var="input"/></list></block></block><l>/</l></block></block></script></block></script></block></script></block-definition><block-definition s="set $robot host to %&apos;hostname&apos;" type="command" category="variables"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doSetVar"><l>host</l><block var="hostname"/></block><block s="doDeclareVariables"><list><l>tmp_hostname</l></list></block><block s="doResetTimer"></block><block s="doUntil"><block s="reportGreaterThan"><block s="getTimer"></block><l>10</l></block><script><block s="doSetVar"><l>tmp_hostname</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/ip/</l></list></block></block></block><block s="doIf"><block s="reportGreaterThan"><block s="reportStringSize"><block var="tmp_hostname"/></block><l>1</l></block><script><block s="doSetVar"><l>host</l><block var="tmp_hostname"/></block><block s="bubble"><custom-block s="$robot test connection"></custom-block></block><block s="doReport"><l></l></block></script></block><block s="doWait"><l>0.1</l></block></script></block><custom-block s="$robot popup %txt"><l>Your robot host is unreacheble</l></custom-block></script></block-definition><block-definition s="ping http:// %&apos;url&apos;" type="predicate" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doResetTimer"></block><block s="doWaitUntil"><block s="reportOr"><block s="reportGreaterThan"><block s="getTimer"></block><l>5</l></block><block s="reportGreaterThan"><block s="reportStringSize"><block s="reportURL"><block var="url"/></block></block><l>1</l></block></block></block><block s="doIfElse"><block s="reportLessThan"><block s="getTimer"></block><l>5</l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></block-definition><block-definition s="play move %&apos;record_name&apos; | speed x %&apos;speed&apos;" type="command" category="control"><comment x="0" y="0" w="230.00000099999988" collapsed="false">Play the movement of a previous recorded move. &#xD;&#xD;The &lt;record_name&gt; input is the name of a .record filename which should be in the same directory where you started the web server (with the command &quot;$robot-snap $robot-ergo&quot; for example).&#xD;&#xD;You can change the play speed with the &lt;speed&gt; input.</comment><header></header><code></code><inputs><input type="%txt">move_name</input><input type="%n">1</input></inputs><script><block s="doDeclareVariables"><list><l>time</l></list></block><block s="doDeclareVariables"><list><l>wait</l></list></block><block s="doSetVar"><l>wait</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doIfElse"><block s="reportListContainsItem"><custom-block s="$robot all recorded moves"></custom-block><block var="record_name"/></block><script><block s="doSetVar"><l>time</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/MovePlayer/</l><block var="record_name"/><l>/start/</l><block var="speed"/></list></block></block></block><block s="doIf"><block var="wait"/><script><block s="doWait"><block var="time"/></block></script><comment w="90" collapsed="false">ugly wait to stop feature.&#xD;TODO : change with a looking at running primitive</comment></block></script><script><custom-block s="$robot popup %txt"><block s="reportJoinWords"><list><l>Error : &lt;</l><block var="record_name"/><l>&gt; is not is the avaible records (look at the block $robot all records to see all recorded moves) </l><custom-block s="$robot all recorded moves"></custom-block></list></block></custom-block></script></block><block s="doReport"><block var="record_name"/></block></script></block-definition><block-definition s="$robot set color leds of motor(s) %&apos;motor_name&apos; in %&apos;color&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">motor_name</input><input type="%txt">off<options>off
red
green
yellow
blue
pink
cyan
white</options></input></inputs><script><custom-block s="$robot set %txt of motor(s) %s to %s"><l>led</l><block var="motor_name"/><block var="color"/></custom-block></script></block-definition><block-definition s="$robot card %&apos;card&apos; is detected ?" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%txt">caribou<options>caribou
tetris
lapin</options></input></inputs><script><block s="doDeclareVariables"><list><l>output</l></list></block><block s="doSetVar"><l>output</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/detect/</l><block var="card"/></list></block></block></block><block s="doIfElse"><block s="reportEquals"><block var="output"/><l>True</l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></block-definition><block-definition s="$robot camera all colors filters" type="reporter" category="sensing"><header></header><code></code><inputs></inputs><script><block s="doReport"><custom-block s="listify %s"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/get/filters</l></list></block></block></custom-block></block></script></block-definition><block-definition s="$robot camera remove color %&apos;color&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>call/pop_color/name:</l><block var="color"/></list></block></block></block></script></block-definition><block-definition s="$robot camera add color %&apos;color&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">red</input></inputs><script><block s="doRun"><block s="reifyReporter"><autolambda><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/</l><l>color_detection</l><l>/</l><l>start</l></list></block></block></autolambda><list></list></block><list></list></block><block s="doDeclareVariables"><list><l>ouput</l></list></block><block s="doSetVar"><l>ouput</l><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>call/add_color/name:</l><block var="color"/></list></block></block></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><l>1</l><block var="ouput"/></block><l>{</l></block></block><script><custom-block s="$robot popup %txt"><block var="ouput"/></custom-block></script></block></script></block-definition><block-definition s="value at key %&apos;key&apos; of %&apos;lst&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>each item</l><block var="lst"/><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="each item"/></block><block var="key"/></block><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="each item"/></block></block></script></block></script></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="listify %&apos;jsonString&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>jsonString</l></list><l>return listify(JSON.parse(jsonString));&#xD;&#xD;function listify(jsonObject) {&#xD; if (jsonObject instanceof Array) {&#xD; return new List(jsonObject.map(function(eachElement) { return listify(eachElement)}));&#xD; } else if (jsonObject instanceof Object) {&#xD; return new List(Object.keys(jsonObject).map(function(eachKey) { return new List([eachKey,listify(jsonObject[eachKey])])} ))&#xD; } else {&#xD; return jsonObject&#xD; }&#xD;}</l></block><list><block var="jsonString"/></list></block></block></script></block-definition><block-definition s="$robot camera detected color" type="reporter" category="sensing"><header></header><code></code><inputs></inputs><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>get/best_detected_color</l></list></block></block></block></script></block-definition><block-definition s="$robot camera raw processing feedback" type="reporter" category="other"><header></header><code></code><inputs></inputs><script><block s="doReport"><custom-block s="listify %s"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>get/centroid</l></list></block></block></custom-block></block></script></block-definition><block-definition s="$robot camera position x y of color %&apos;color&apos;" type="reporter" category="sensing"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="items %n to %n of %l"><l>2</l><l>3</l><custom-block s="listify %s"><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>call/get_centroid_color/name:</l><block var="color"/></list></block></block></custom-block></custom-block></block></script></block-definition><block-definition s="$robot color %&apos;color&apos; is detected ?" type="predicate" category="sensing"><header></header><code></code><inputs><input type="%s">color_label</input></inputs><script><block s="doReport"><block s="reportEquals"><block var="color"/><custom-block s="$robot camera detected color"></custom-block></block></block></script></block-definition><block-definition s="$robot Start Position" type="command" category="control"><header></header><code></code><inputs></inputs><script><custom-block s="$robot set position(s) %n of motor(s) %s in %n seconds | wait ? %boolUE"><l>0</l><custom-block s="$robot all motors"></custom-block><l>2</l><block s="reportBoolean"><l><bool>true</bool></l></block></custom-block></script></block-definition><block-definition s="camera load color from list %&apos;list&apos;" type="command" category="other"><header></header><code></code><inputs><input type="%l"></input></inputs><script><custom-block s="for each %upvar of %l %cs"><l>color</l><block var="list"/><script><block s="doRun"><block s="reifyReporter"><autolambda><block s="reportURL"><block s="reportJoinWords"><list><custom-block s="$robot robot URL"></custom-block><l>/primitive/color_detection/</l><l>call/add_color_by_hue_range/name:</l><block s="reportListItem"><l>1</l><block var="color"/></block><l>;hue_low:</l><block s="reportListItem"><l>1</l><block s="reportListItem"><l>2</l><block var="color"/></block></block><l>;hue_high:</l><block s="reportListItem"><l>2</l><block s="reportListItem"><l>2</l><block var="color"/></block></block></list></block></block></autolambda><list></list></block><list></list></block></script></custom-block></script></block-definition></blocks><variables><variable name="host"><l>169.254.33.155</l></variable><variable name="port"><l>6969</l></variable></variables></project>
from numpy import sum
from functools import partial
from pypot.creatures import AbstractPoppyCreature
from pypot.creatures.ik import IKChain
from .primitives.dance import Dance
from .primitives.face_tracking import FaceTracking
from .primitives.tracking_feedback import TrackingFeedback
from .primitives.color_detection import ColorDetection
from .primitives.postures import (BasePosture, RestPosture,
CuriousPosture, TetrisPosture,
SafePowerUp)
class PoppyErgoJr(AbstractPoppyCreature):
@classmethod
def setup(cls, robot):
robot._primitive_manager._filter = partial(sum, axis=0)
c = IKChain.from_poppy_creature(robot,
motors=robot.motors,
passiv=[],
tip=[0, 0, -0.07])
robot.chain = c
robot.attach_primitive(SafePowerUp(robot), 'safe_power_up')
robot.attach_primitive(Dance(robot), 'dance')
robot.attach_primitive(BasePosture(robot, 2.), 'base_posture')
robot.attach_primitive(RestPosture(robot, 2.), 'rest_posture')
robot.attach_primitive(CuriousPosture(robot, 2.), 'curious_posture')
robot.attach_primitive(TetrisPosture(robot, 2.), 'tetris_posture')
if not robot.simulated and hasattr(robot, 'marker_detector'):
robot.attach_primitive(TrackingFeedback(robot, 25.),
'tracking_feedback')
robot.attach_primitive(ColorDetection(robot, 5.), 'color_detection')
for m in robot.motors:
m.pid = (4, 2, 0)
m.torque_limit = 70.
m.led = 'off'
if not robot.simulated and hasattr(robot, 'face_tracking'):
robot.attach_primitive(FaceTracking(robot, 10,
robot.face_detector),
'face_tracking')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment