{"id":3666,"date":"2026-06-10T10:20:17","date_gmt":"2026-06-10T09:20:17","guid":{"rendered":"https:\/\/www.macerobotics.com\/?p=3666"},"modified":"2026-06-10T10:27:21","modified_gmt":"2026-06-10T09:27:21","slug":"ia-neurone-artificiel-avec-le-robot-mr25-partie-1","status":"publish","type":"post","link":"http:\/\/www.macerobotics.com\/?p=3666","title":{"rendered":"IA &#8211; Neurone artificiel avec le robot MR25 (Partie 1)"},"content":{"rendered":"<h1 style=\"text-align: center;\"><\/h1>\n<h2>Pr\u00e9sentation<\/h2>\n<p>Dans cet article nous allons apprendre au robot MR25 \u00e0 \u00e9viter les obstacles en utilisant un neurone perception. Le <strong data-start=\"3\" data-end=\"17\">perceptron<\/strong> est le neurone artificiel le plus simple, mod\u00e8le de neurone biologique, il a \u00e9t\u00e9 invent\u00e9 en 1957 par Frank Rosenblatt au laboratoire d&#8217;a\u00e9ronautique de l&#8217;universit\u00e9 Cornell. Ce neurone re\u00e7oit plusieurs entr\u00e9es, les combine avec des poids, puis prend une d\u00e9cision binaire.<\/p>\n<h2 style=\"text-align: center;\"><span style=\"color: #339966;\"><strong>Intelligence artificielle avec le robot MR25<\/strong><\/span><\/h2>\n<p data-start=\"0\" data-end=\"106\">Voici un exemple simple de neurone perceptron \u00e0 2 entr\u00e9es utilisant les capteurs de proximit\u00e9 n\u00b02 et n\u00b04 du MR25.<\/p>\n<p data-start=\"0\" data-end=\"106\"><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-203250.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3954 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-203250.png\" alt=\"\" width=\"465\" height=\"186\" \/><\/a><\/p>\n<p data-start=\"108\" data-end=\"118\">Voici le principe de fonctionnement :<\/p>\n<p><strong>Entr\u00e9es du neurone (capteurs de proximit\u00e9) :<\/strong><\/p>\n<ul>\n<li>\n<ul>\n<li data-section-id=\"3nx91h\" data-start=\"120\" data-end=\"181\">x1 = proxSensor(2)<\/li>\n<li data-section-id=\"3nx91h\" data-start=\"120\" data-end=\"181\">x2 = proxSensor(4)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Sortie du neurone :<\/strong><\/p>\n<ul>\n<li>\n<ul>\n<li>\n<ul data-start=\"195\" data-end=\"243\">\n<li data-section-id=\"227rhc\" data-start=\"195\" data-end=\"217\">0 \u2192 arr\u00eat du robot<\/li>\n<li data-section-id=\"1ay71ls\" data-start=\"220\" data-end=\"243\">1 \u2192 avance du robot<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-start=\"344\" data-end=\"383\">Le calcul effectu\u00e9 par le neurone est :<\/p>\n<p data-start=\"385\" data-end=\"422\"><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-201929.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3949 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-201929.png\" alt=\"\" width=\"247\" height=\"38\" \/><\/a><\/p>\n<p data-start=\"385\" data-end=\"422\"><strong>Avec :<\/strong><\/p>\n<ul>\n<li data-section-id=\"1d10o2j\" data-start=\"430\" data-end=\"461\"><em><span class=\"katex\"><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"mord\"><span class=\"mord mathnormal\">x<\/span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\"><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1<\/span><\/span><\/span><span class=\"vlist-s\">\u200b<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/em> : valeur du capteur 2<\/li>\n<li data-section-id=\"f9a3a6\" data-start=\"462\" data-end=\"493\"><em><span class=\"katex\"><span class=\"katex-mathml\">x2 <\/span><\/span><\/em>: valeur du capteur 4<\/li>\n<li data-section-id=\"vzykw4\" data-start=\"494\" data-end=\"532\"><span class=\"katex\"><em><span class=\"katex-mathml\">w1<\/span><\/em><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"mord\"><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist-s\">\u200b<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> : poids associ\u00e9 au capteur 2<\/li>\n<li data-section-id=\"1419crl\" data-start=\"533\" data-end=\"571\"><span class=\"katex\"><em><span class=\"katex-mathml\">w2<\/span><\/em><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"mord\"><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist-s\">\u200b<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span> : poids associ\u00e9 au capteur 4<\/li>\n<li data-section-id=\"2gep2w\" data-start=\"572\" data-end=\"598\"><em><span class=\"katex\"><span class=\"katex-mathml\">b<\/span><\/span><\/em>\u00a0: biais du neurone<\/li>\n<li data-section-id=\"1e0yk2j\" data-start=\"599\" data-end=\"623\"><em><span class=\"katex\"><span class=\"katex-mathml\">s<\/span><\/span><\/em>\u00a0: somme pond\u00e9r\u00e9e<\/li>\n<\/ul>\n<p>Ensuite, une fonction d&#8217;activation \u00e0 seuil d\u00e9cide de la sortie du neurone :<\/p>\n<p><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-202151.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3950 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-202151.png\" alt=\"\" width=\"216\" height=\"92\" \/><\/a><\/p>\n<p data-start=\"246\" data-end=\"297\">Le perceptron est entra\u00een\u00e9 avec quelques exemples :<\/p>\n<ul data-start=\"300\" data-end=\"351\">\n<li data-section-id=\"qzpen4\" data-start=\"300\" data-end=\"324\">obstacle proche \u2192 stop le robot<\/li>\n<li data-section-id=\"1199xl3\" data-start=\"327\" data-end=\"351\">espace libre \u2192 avancer le robot<\/li>\n<\/ul>\n<p>-&gt; Si les deux capteurs d\u00e9tectent un espace libre (valeurs \u00e9lev\u00e9es), la somme est grande alors le robot avance.<\/p>\n<p>-&gt; Si un obstacle est proche (valeur faible), la somme diminue \u2192 le robot MR25 s&#8217;arr\u00eate.<\/p>\n<p><a href=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2026\/06\/DSC03235-removebg-preview.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3669 aligncenter\" src=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2026\/06\/DSC03235-removebg-preview.png\" alt=\"\" width=\"430\" height=\"242\" srcset=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2026\/06\/DSC03235-removebg-preview.png 666w, http:\/\/www.macerobotics.com\/wp-content\/uploads\/2026\/06\/DSC03235-removebg-preview-300x169.png 300w, http:\/\/www.macerobotics.com\/wp-content\/uploads\/2026\/06\/DSC03235-removebg-preview-600x338.png 600w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/a><\/p>\n<h2>Le Programme<\/h2>\n<div class=\"code-embed-wrapper\"> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\"># Mac\u00e9 Robotics<br\/>#<br\/>#!\/usr\/bin\/python3<br\/>import MR25<br\/>import time<br\/><br\/># -----------------------------<br\/># Fonctions du perceptron<br\/># -----------------------------<br\/><br\/>def activation(x):<br\/>    &quot;&quot;&quot;<br\/>    Fonction d&#039;activation de type seuil (step function).<br\/>    Retourne 1 si x &gt;= 0 (avancer), sinon 0 (stopper).<br\/>    &quot;&quot;&quot;<br\/>    if x &gt;= 0:<br\/>        return 1<br\/>    return 0<br\/><br\/># -----------------------------<br\/># Initialisation des poids et biais<br\/># -----------------------------<br\/># w1 : poids associ\u00e9 au capteur 2 (x1)<br\/># w2 : poids associ\u00e9 au capteur 4 (x2)<br\/># b  : biais du perceptron (d\u00e9calage du seuil de d\u00e9cision)<br\/>w1 = 0.0<br\/>w2 = 0.0<br\/>b = 0.0<br\/><br\/># Taux d&#039;apprentissage : contr\u00f4le la vitesse de correction des poids<br\/># Une valeur trop grande peut rendre l&#039;apprentissage instable<br\/>eta = 0.1<br\/><br\/># -----------------------------<br\/># Jeu d&#039;apprentissage (donn\u00e9es d&#039;entra\u00eenement)<br\/># -----------------------------<br\/>#<br\/># x1 = capteur de proximit\u00e9 2 (distance normalis\u00e9e entre 0 et 1)<br\/># x2 = capteur de proximit\u00e9 4 (distance normalis\u00e9e entre 0 et 1)<br\/>#<br\/># Normalisation : 0 = obstacle tr\u00e8s proche, 1 = espace libre<br\/>#<br\/># Sortie attendue :<br\/>#   0 = STOP  (obstacle d\u00e9tect\u00e9, distances faibles)<br\/>#   1 = AVANCE (voie libre, distances \u00e9lev\u00e9es)<br\/>training_data = [<br\/>    ([0.1, 0.1], 0),  # Obstacle tr\u00e8s proche sur les deux capteurs \u2192 STOP<br\/>    ([0.2, 0.3], 0),  # Obstacle proche \u2192 STOP<br\/>    ([0.3, 0.2], 0),  # Obstacle proche \u2192 STOP<br\/>    ([0.8, 0.8], 1),  # Espace libre sur les deux capteurs \u2192 AVANCE<br\/>    ([0.7, 0.9], 1),  # Espace majoritairement libre \u2192 AVANCE<br\/>    ([0.9, 0.7], 1),  # Espace majoritairement libre \u2192 AVANCE<br\/>]<br\/><br\/># -----------------------------<br\/># Phase d&#039;apprentissage (entra\u00eenement du perceptron)<br\/># -----------------------------<br\/># On r\u00e9p\u00e8te jusqu&#039;\u00e0 100 \u00e9poques (passages complets sur le jeu d&#039;entra\u00eenement)<br\/># L&#039;apprentissage s&#039;arr\u00eate pr\u00e9matur\u00e9ment si tous les exemples sont bien class\u00e9s<br\/>for epoch in range(100):<br\/>    erreur_totale = 0  # Compteur d&#039;erreurs pour cette \u00e9poque<br\/><br\/>    for inputs, target in training_data:<br\/>        x1, x2 = inputs<br\/><br\/>        # Calcul de la sortie du perceptron : combinaison lin\u00e9aire + activation<br\/>        y = activation(w1*x1 + w2*x2 + b)<br\/>        print(&quot;Y = &quot;, y)<br\/><br\/>        # Calcul de l&#039;erreur : diff\u00e9rence entre la sortie attendue et la sortie calcul\u00e9e<br\/>        erreur = target - y<br\/><br\/>        # Mise \u00e0 jour des poids selon la r\u00e8gle d&#039;apprentissage du perceptron<br\/>        # Si erreur = 0 : pas de modification<br\/>        # Si erreur = +1 : poids augment\u00e9s (le perceptron devait dire 1)<br\/>        # Si erreur = -1 : poids diminu\u00e9s (le perceptron devait dire 0)<br\/>        w1 += eta * erreur * x1<br\/>        w2 += eta * erreur * x2<br\/>        b  += eta * erreur  # Le biais est mis \u00e0 jour sans facteur d&#039;entr\u00e9e<br\/>        print(&quot;w1, w2 = &quot;, w1, w2)<br\/><br\/>        # Accumulation de l&#039;erreur absolue sur cette \u00e9poque<br\/>        erreur_totale += abs(erreur)<br\/>        print(&quot;Erreur totale = &quot;, erreur_totale)<br\/><br\/>    # Convergence atteinte : tous les exemples sont correctement class\u00e9s<br\/>    if erreur_totale == 0:<br\/>        break<br\/><br\/># Affichage des poids finaux apr\u00e8s l&#039;apprentissage<br\/>print(&quot;Apprentissage termin\u00e9&quot;)<br\/>print(&quot;w1 =&quot;, w1)<br\/>print(&quot;w2 =&quot;, w2)<br\/>print(&quot;b =&quot;, b)<br\/><br\/># Pause avant de d\u00e9marrer le pilotage (laisse le temps de lire les r\u00e9sultats)<br\/>time.sleep(5)<br\/><br\/># -----------------------------<br\/># Pilotage du robot MR25 en temps r\u00e9el<br\/># -----------------------------<br\/><br\/># Distance maximale prise en compte (en mm)<br\/># Au-del\u00e0 de SEUIL_MAX, la distance est consid\u00e9r\u00e9e comme maximale (voie libre)<br\/>SEUIL_MAX = 80.0  # mm<br\/><br\/>try:<br\/>    while True:<br\/>        # --- Lecture des capteurs de proximit\u00e9 ---<br\/>        # proxSensor retourne une distance en mm<br\/>        x1 = MR25.proxSensor(2)  # Capteur 2<br\/>        x2 = MR25.proxSensor(4)  # Capteur 4<br\/><br\/>        # --- Normalisation des distances dans l&#039;intervalle [0, 1] ---<br\/>        # min(x, SEUIL_MAX) \u00e9cr\u00eate les valeurs sup\u00e9rieures au seuil<br\/>        # La division ram\u00e8ne la valeur entre 0 et 1<br\/>        x1 = min(x1, SEUIL_MAX) \/ SEUIL_MAX<br\/>        x2 = min(x2, SEUIL_MAX) \/ SEUIL_MAX<br\/><br\/>        # --- Inf\u00e9rence : d\u00e9cision du perceptron ---<br\/>        # Utilise les poids appris pour d\u00e9cider d&#039;avancer ou de s&#039;arr\u00eater<br\/>        sortie = activation(w1*x1 + w2*x2 + b)<br\/><br\/>        # --- Ex\u00e9cution de la commande moteur ---<br\/>        if sortie == 1:<br\/>            MR25.forward(40)  # Avance \u00e0 40% de vitesse<br\/>            print(&quot;AVANCE&quot;)<br\/>        else:<br\/>            MR25.stop()       # Arr\u00eat imm\u00e9diat<br\/>            print(&quot;STOP&quot;)<br\/><br\/>        # Fr\u00e9quence de rafra\u00eechissement : 10 Hz (une d\u00e9cision toutes les 100 ms)<br\/>        time.sleep(0.1)<br\/><br\/>except KeyboardInterrupt:<br\/>    # Arr\u00eat propre du robot lors d&#039;une interruption clavier (Ctrl+C)<br\/>    MR25.stop()<br\/><br\/># end of file<\/code><\/pre> <div class=\"code-embed-infos\"> <\/div> <\/div>\n<p>Ce neurone perceptron constitue la base des r\u00e9seaux de neurones : un r\u00e9seau plus complexe n&#8217;est qu&#8217;un assemblage de nombreux perceptrons connect\u00e9s entre eux.<\/p>\n<h2>Les am\u00e9liorations<\/h2>\n<p>Le perceptron \u00e0 2 entr\u00e9es est un bon point de d\u00e9part, mais pour ce robot il existe plusieurs am\u00e9liorations possibles. Voici quelques id\u00e9es :<\/p>\n<ul>\n<li><strong>Ajouter les autres capteurs n\u00b01, 3 et 5<\/strong><\/li>\n<\/ul>\n<p>Un neurone \u00e0 5 entr\u00e9es permettrait une meilleure perception :<\/p>\n<p><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-214329.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3958 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-214329.png\" alt=\"\" width=\"477\" height=\"35\" \/><\/a><\/p>\n<ul>\n<li><strong>Ajouter les d\u00e9placements comme tourner \u00e0 droite ou \u00e0 gauche.<\/strong><\/li>\n<\/ul>\n<p data-start=\"589\" data-end=\"602\">Par exemple :<\/p>\n<ul data-start=\"604\" data-end=\"704\">\n<li data-section-id=\"n59rsy\" data-start=\"604\" data-end=\"642\">Si obstacle \u00e0 droite \u2192 Alors tourner \u00e0 gauche<\/li>\n<li data-section-id=\"1anpchu\" data-start=\"643\" data-end=\"681\">Si obstacle \u00e0 gauche \u2192 Alors tourner \u00e0 droite<\/li>\n<li data-section-id=\"suq0mr\" data-start=\"682\" data-end=\"704\">Si voie libre \u2192 Alors avancer<\/li>\n<\/ul>\n<ul>\n<li><strong>Ajouter la valeur r\u00e9els des capteurs\u00a0<\/strong><\/li>\n<\/ul>\n<p>L&#8217;exemple pr\u00e9c\u00e9dent utilise un simple seul binaire qui fait perdre beaucoup d&#8217;information.<\/p>\n<p>On peux faire d\u00e9pendre la vitesse du robot de la sortie du neurone :<\/p>\n<div class=\"code-embed-wrapper\"> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">vitesse = int(sortie * 50)<br\/>MR25.forward(vitesse)<\/code><\/pre> <div class=\"code-embed-infos\"> <\/div> <\/div>\n<p>Le robot MR25 ralentit lorsqu&#8217;il y a un obstacle.<\/p>\n<ul>\n<li><strong>Utiliser une fonction sigmoide comme fonction d&#8217;activation<\/strong><\/li>\n<\/ul>\n<p>La fonction d&#8217;activation pr\u00e9c\u00e9dent permet d&#8217;avoir une sortie binaire.<\/p>\n<p><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-215206.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3961\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-215206.png\" alt=\"\" width=\"209\" height=\"194\" \/><\/a><\/p>\n<p>Avec cette fonction on obtient une probabilit\u00e9 en sortie du neurone :<\/p>\n<p><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-215259.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3962 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-02-215259.png\" alt=\"\" width=\"183\" height=\"85\" \/><\/a><\/p>\n<p>Les d\u00e9placements du robot devient beaucoup plus fluide.<\/p>\n<ul>\n<li><strong>Utiliser un petit r\u00e9seau de neurone<\/strong><\/li>\n<\/ul>\n<p>Au lieu d&#8217;utiliser un seul neurone, utiliser :<\/p>\n<ul>\n<li data-section-id=\"1nq04qf\" data-start=\"2155\" data-end=\"2186\">neurone 1 : obstacle \u00e0 gauche<\/li>\n<li data-section-id=\"115womd\" data-start=\"2187\" data-end=\"2216\">neurone 2 : obstacle devant<\/li>\n<li data-section-id=\"1pap9xl\" data-start=\"2217\" data-end=\"2248\">neurone 3 : obstacle \u00e0 droite<\/li>\n<\/ul>\n<p>Puis un neurone de d\u00e9cision choisit l&#8217;action :<\/p>\n<ul>\n<li>Avancer<\/li>\n<li>Tourner gauche<\/li>\n<li>Tourner droite<\/li>\n<li>Stop<\/li>\n<\/ul>\n<p>Pour le MR25 \u00e9quip\u00e9 de 5 capteurs de proximit\u00e9, l&#8217;am\u00e9lioration la plus efficace est g\u00e9n\u00e9ralement : 5 entr\u00e9es + 3 sorties (gauche, avance, droite) + apprentissage automatique des poids. Cela permet d\u00e9j\u00e0 d&#8217;obtenir un v\u00e9ritable comportement d&#8217;\u00e9vitement d&#8217;obstacles bas\u00e9 sur un r\u00e9seau neuronal simple.<\/p>\n<p><em>A vous de jouez !<\/em><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation Dans cet article nous allons apprendre au robot MR25 \u00e0 \u00e9viter les obstacles en utilisant un neurone perception. Le perceptron est le neurone artificiel le plus simple, mod\u00e8le de neurone biologique, il a \u00e9t\u00e9 invent\u00e9 en 1957 par Frank Rosenblatt au laboratoire d&#8217;a\u00e9ronautique de l&#8217;universit\u00e9 Cornell. Ce neurone re\u00e7oit plusieurs entr\u00e9es, les combine avec &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[107,7],"class_list":["post-3666","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-ia","tag-robot"],"_links":{"self":[{"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3666"}],"version-history":[{"count":4,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3666\/revisions"}],"predecessor-version":[{"id":3671,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3666\/revisions\/3671"}],"wp:attachment":[{"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3666"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}