"Internet of Things" to temat wiodący również na konferecji Google Cloud Next ’19. Postaram się wyjawić kilka szczegółów o tym, dlaczego i jak robotyka oraz IoT stają się na serio produkcyjnym standardem.
Wracając do IoT, zastanawiacie się pewnie, co ten temat robi na konferencji Google o chmurach? Rozjaśnię pytanie, w tym roku jeszcze nie rządzi :-)
Jak wiadomo powszechnie, wiele tematów jest wchłanianych przez Google, także temat zwany partnerstwem z największymi producentami Open Source i wielkimi firmami od spraw bankowych, logistycznych, magazynowych i baz danych. Google chce mieć konkurencję pod kontrolą, a wiadomo, że to jest w pewnym sensie win-win, bo partnerzy mogą sprzedawać swoje usługi w wersji "enterprise" w koloejnej z kilku największych chmur publicznych.
Aby nie umniejszać firmie Amazon, w chmurze AWS istnieje również taki market, na którym Ci sami partnerzy sprzedają swoje wersje płatne rozwiązań.
Następnym wchłanianym tematem jest nagłaśniany coraz bardziej aspekt dotyczący masowego zastosowania robotów w produkcji. Temu tematowi został poświęcony m. in. poniższy temat wystąpienia.
Connected Robots: IoT in the Warehouse (Cloud Next '19)
Jak się domyślacie magazynier, to jeden z pierwszych zawodów, który znika po ponad 150-latach z naszego rynku pracy. Na ten moment zastąpiony jest robotami w wielkich fabrykach, ale kwestią czasu jest zanim zawód magazynier to będzie historia. W opasłych centrach magazynownia już ludzie nie biegają za paczuszkami, a stanowią jedynie nadzorców procesów, sortują niewygodne dla manipulatorów w robotach detale, wspomagają roboty w ich masowej pracy. Celowo wytłuszczam wspomagają, bo tak na prawdę, to kwestia powstania w miarę uniwersalnego manipulatora i pozamiatane :-)
Wracając do wykładu, to przedstawia on dziedzinę magazynowania odnosząc się do IoT jako konieczność w tych czasach i naturalny kierunek rozwoju dla magazynów (ang. warehouses). Zaprezentowany jest jeden z przedstawicieli gatunku - robot wspomagający prace magazynowe. Przy okazji opowiadają, że do prototypowania i testowania nowych konceptów, nowego softu wspierają się też usługą Kubernates, gdyż jest wygodną formą stawiania infrastruktury na życzenie. Prowadzący wyjaśnia, że pokazany wyżej robot powstał w 9 miesięcy dzięki:
platformie NVIDIA Jetson
platformie ROS Open Source
platforma Google Cloud
Na powyższym diagramie prowadzący wyjaśnia, że dzięki robotom zawód magazyniera może doznać znaczącej poprawy wydajności i roboty wyraźnie przyspieszają pracę magazynu. Da się to zmierzyć i można powiedzieć, że każdy człowiek współpracujący z robotem na magazynie jest 2/3-razy wydajniejszy.
Efektywność jest określana przez dane i decyzje. Roboty, które pracują na magazynie mają bardzo wiele danych z czujników i ciągle podejmują decyzje o kolejnych zadaniach. Prowadzący wyjaśnia, że dzięki pojęciu inteligencji operacyjnej oraz złożonym zapytaniom w czasie rzeczywistym, możliwe jest działanie bez przerw i znaczących awarii. Zamyka się to w slajdzie Data Driven Decisions:
Bardzo ciekawe jest też podejście do diagnostyki sieci WiFi, która służy do komunikacji z farmą robotów. Posiadają dedykowane dashboardy do tego:
Bardzo ważne podczas budowania robotów przemysłowych jest śledzenie tego co robot robi. Mam na myśli, czym się zajmuje w większości czasu. Oto jak prowadzący prezentują nam ten temat i coś przewidywalnego w takim zastosowaniu - robot po prostu w ~50% czasu jeździ :-)
Idąc dalej za metrykami, które w takim magazynie są istotne będzie to efektywność pracy robota w magazynie. Co jest ciekawego w tym wystąpieniu? Okazuje się, że nie można uzyskać większej wydajności, kiedy zwiększamy prędkość przemieszczania się robotów w magazynie !!!
Z pomocą przychodzi AI i Machine Learning, dzięki któremu inżynierowie przygotowali/wytrenowali modele ML pozwalające uzyskać największą efektywność.
Poniższy slajd obrazuje na górze model podstawowy rozkładu prędkości jazdy, który nie zapewniał oczekiwanej efektywności i na dole, który zapewnia największą efektywność w pracy robotów CHUCK w magazynie. Jak widać model nie ma charakterystyki stałej w czasie (patrz na kolory), co tłumaczy fakt konieczności optymalizacji zależnie od miejsc, które przemierza robot.
Kolejnym zagadnieniem typowym dla powierzchni magazynowych jest orientacja w czasie rzeczywistym, gdzie i jak przemieszczają się zarówno roboty jak i ludzie po magazynie.
Dla prawidłowego działania magazynu niezbędny jest monitoring robotów, które mogą określone zadania. Niechcianym przypadkiem jest blokowanie drogi przez kilka robotów, które "zagubiły się" lub po prostu skończyło im się zasilanie. Monitoring pozycji w czasie rzeczywistym stanowi podstawę utrzymania infrastruktury magazynowej i zapewnia bezpieczeństwo ludziom.
Monitoring w czasie rzeczywistym jest związany z faktem działania magazynu produktowego przez 24h bez przerwy. Klienci oczekują dostawy w 2 dni, więc niezbędne okazują się metryki na temat tempa pracy maszyn i ich stanu. Co ciekawe monitorowanie odbywa się w znanej w świecie Internetu Rzeczy bazie serii czasowych InfluxDB, która spełnia właściwie swoją rolę.
Opowiadający wspomina, o tym, że monitoring CPU robotów jest super ważny, gdyż przegrzanie się procesorów na skutek uszkodzenia wiatraka to typowy przypadek i wówczas roboty zachowują się w nieprzewidywalny sposób.
Wspomina również o koncepcie Preventive Maintenence (PdM) (pol. konserwacja zapobiegawcza), zgodnie z którym można wymieniając w odpowiednich momentach części znając ich zużycie oszczędzić czas klientów. Jest to związane ze zmniejszeniem czasu potrzebnego na angażowanie inżynierów w utrzymanie. Po prostu w tym czasie programiści mogą wytworzyć kolejne ważne i cenne funkcjonalności.
Bardzo ważne okazują się dla utrzymania i weryfikowania optymalnych rozwiązań nagrania ścieżek jazdy robotów CHUCK. Do tego celu inżynierowie stworzyli specjalne archiwum zapisujące to jak "widzi trasę robot" i mogą w dowolnym momencie "spojrzeć jego oczami" bez konieczności przelotu osobiście samolotem do odległego o tysiące kilometrów magazynu.
Odważyłem się i postanowiłem naprawiać różne praktyczne rzeczy materialne i mniej materialne na oczach telewidzów YOUTUBE
NAPRAWIANIE NA KOLANIE - tak nazwałem serię odcinków typu FIX IT ! w moim wydaniu, gdzie prezentuję jak w warunkach amatorskich (domowych) można naprawić, dokonać przeglądu, zmienić i udoskonalić urządzenia codziennego użytku.
Pierwszy odcinek dedykuję użytkownikom iRobot Roomba 650 a szczególnie mojemy mentorowi w tematyce Agile/SCRUM/Kanban/XP. Pomyślałem, że zawsze kilka stówek w kieszeni :-) to nie problem, więc jak to polak z natury ciekawski naprawiam sobie z wizją i fonią zapisaną na youtube.
Problem jaki poruszam ww pierwszym odcinku to to stukanie podczas pracy i związane z tym zanieczyszczenie części mechanicznej (trybów) głównego modułu czyszczącego w iRobot Roomba.
Wiele osób kojarzy firmę iRobot , która wprowadziła wspaniały wynalazek na rynek jakim jest automatyczny "pseudo odkurzacz". Każdy chciałby go mieć, ale nie wszyscy sobie zdają sprawę, że trzeba go stosownie konserwować. Oczywiście, mam tutaj na myśli regularne czyszczenie, bo jak to w mechatronicznych urządzeniach bywa kurz i brud nie wspomagają automatu.
Miłego oglądania i oczywiście naprawiania robotów :-)
Jak większość ludzi z branży IT w tym również ja, nie przechodzę obojętnie obok robotów i tematów związanych z robotyką. Tym razem warto spojrzeć na platformę do oprogramowania robotów ROS.
Tak wiele jest przeróżnych amatorskich rozwiązań do zbudowania robotów w oparciu o OpenSource + Arduino + gotowe moduły, że każdy z Nas, po zbudowaniu kilku robotów i skopiowaniu/zmodyfikowaniu poprzedniej wersji kodu (udoskonaleniu lub zmianie algorytmów) przychodzi w stan refleksyjny z serii "co dalej...". Jak to była w inżynierii warto zastanowić się, jak daleko chcemy zajść w konstrukcjach robotycznych. Każda sklejanka bibliotek różnej maści, która działa i cieszy amatora konstruktora jest czymś pozytywnym i jak najbardziej odkrywczym. Jednak kiedy mamy plany dalekosiężne w budowanie robotów i chcemy odkrywać więcej ciekawych możliwości - i rozwijać się w oprogramowaniu ciekawszych - robotów przychodzi nam na myśl słowo framework. Najbardzej marzy się nam platforma do konstruowania robotów. Właściwą odpowiedzią an takie potrzeby będzie ROS (Robot Operating System), czyli projekt OpenSource, który doczekał się wersji produkcyjnej i w zagościł w laboratoriach wielu dużych graczy na rynku w konstrukowaniu nowoczesnych robotów.
Na wstępnie filmik pokazujący możliwości jakie na dzień dzisisejszy posiada ROS - miłego oglądania.
Spróbuję wyjaśnić pokrótce, dlaczego platformę ROS uważam za profesjonalny produkt OpenSource. Na wielu forach internetowych i w dyskusjach z ludźmi spotykam się z opiniami, że programiści oprogramowania robotów nie mają czasu poznać ROS, chociaż bardzo by chcieli. Jawi się im to jako zbyt duży system i niezbyt pasujący do ich np: samojezdnych robotów. Z drugiej strony wszelkie nowoczesne funkcjojnalności t.j. rozpoznawanie otoczenia przez robota, unikanie przeszkód, komunikacja intersystemowa, wizualizacja trasy w 3D, itp. chętnie by uruchomili na swoim robocie. Czas najwyraźniej zmienić sposóśb patrzenia na budowanego robota z zabawki na produkt. Jest wówczas spora szansa na uzyskanie wymienonych wyżej funkcjonalności niejako z paczki :-) Tak, dokładnie chodzi mi o "nie wymyślanie koła od nowo" i to daje programistom robotów platforma ROS.
Chciałbym przedstawić, co można zrobić w takiej platformie oprogramowania robotów Open Source jaką jest ROS. Przede wszystkim ROS to ekosystem, który składa się z:
niezależne od języka i systemu operacyjnego narzędzia do budowania rozproszonych robotów w oparciu o ROS
klientów napisanych dla języków: C/C++, Python, JavaScript i LISP
pakiety komunikujące się z ROS realizujące niezależne funkcjonalności w ramach platformy
gotowe obrazy systemów operacyjnych Linux pod Virtual Box, VMWare, z preinstalowanymi systemami, dla programistów a nie DevOpsów, aby w szybciej uruchomić sówj eksperyment
Na poniższym filmie widać, że ROS to nie tylko soft do robotów, ale również do prototypowania interfejsów bazujących na szkieletowych/szablonowych ruchach człowieka używanych do sterowania (w tym przypadku żółwiem)
Poniżej zamieszczam przykład użycia platformy ROS do eksperymentu z robotem, który porusza się w środowiksu i poznaje je, dzięki czemu prędkość robota zależy od wiedzy o otoczeniu a nie jest blokowana przez kolizję z otoczeniem. Bardzo kompleksowy eksperyment, który naświetla też, jak wybgląda zestaw narzędziowy ROS i jak elastycznie można się nim posługiwać.
Kolejny przykład to połączenie ROS i OpenCV, czyli biblioteki do rozpoznawania/przetwarzania obrazów. Jest to bardzo silny trend w kierunku AI w robotach, aby używając kamery rozpoznawać kształy, kolory, śledzić cele.
Symulacja i możliwości uruchomienia robota "na sucho" stanowi założenie platformy ROS, więc jeśli chcesz stworzyć coś ciekawego i używać ROS możesz rozpocząć od serii dostępnych tutoriali. Polecam, jest to dość przemyślana platforma robotyczna i dzięku dodatkom rozwiążemy najczęstsze zagadki z robotycznego świata sprawniej, bo użyjemy implementacji wartościowych algorytmów w wersji Open Source. Więc nie trać czasu na zastanawianie się, gdzie warto zacząć uczyć się systemu operacyjnego robotów ROS - poniżej załączam szybki start.
Warto wspomnieć tutaj o wbudowanym w platformę ROS symulatorze 3D o nazwie GAZEBO, dzięki któremu można przećwiczyć system operacyjny naszego robota w wirtualnej rzeczywistości. Tak, można poustawiać meble, przeszkody, ściany, labirynty i obejrzeć, co zrobi nasz robot ew. farma robotów. Najważniejsze jest to, że zdarzenia systemowe na kolejkach oraz zmienne wystawione z robota możemy róœeniż podglądać na bierząco, co pozwoli nam wychwycić wcześnie wady naszego oprogramowania i pozwoli zaoszczędzić cenny czas.
Ciekawostką jest, że otwarte API pozwala na programowanie przy pomocy języka Python - ciekawe czemu autorzy wybrali węża ... byćmoże na prostotę kodowania ;)
Przeraża cena jak na polskie realia :-) ok. 4500 PLN to dla wprawnego jednoosobowego elekronika / programisty / robotyka brzmi jak miesięczna pensja po 8 h dziennie w celu zbudowania kopii urządzenia ... pytanie, czy jest to możliwe pozostawiam czytelnikowi :-)
Pozwolę sobie zacytować tutaj informacje handlowe, które ogólnie charakteryzują robota: Sztuczna inteligencja
Zasłońmy sobie oczy i spróbujmy odkurzyć nieznane sobie mieszkanie. W takiej właśnie sytuacji znajduje się Roomba podczas pracy.
Algorytm sprzątania jest jedną z najbardziej strzeżonych tajemnic naukowców z firmy iRobot. Jest to wiedza zdobyta w czasie wypraw kosmicznych, w których uczestniczyły roboty skonstruowane przez twórców Roomby. Sygnał na Marsa biegnie kilka minut, więc ręczne sterowanie urządzeniem z Ziemi jest praktycznie niemożliwe. Robot w kosmosie musi radzić sobie sam. Nasze mieszkanie to dla Roomby nic innego jak nieznana przestrzeń Marsa dla wysłanych tam robotów. A jednak Roomba sprząta podłogi z dokładnością pokrycia powierzchni do 99,97%. Dla porównania człowiek tradycyjnym odkurzaczem w tym samym czasie sprząta niecałe 80% (badania Intertec). Roomba ma w sobie prawdziwy komputer pokładowy. To najinteligentniejsze urządzenie w naszych domach. Roomba zaczyna sprzątanie ruchem spiralnym, następnie jedzie wzdłuż ścian i wokół mebli. Sprząta pod łóżkami i meblami wyższymi niż 10 cm.
Czujniki
Roomba orientuje się w przestrzeni przy pomocy czujników dotykowych, podczerwieni oraz radiowych. Dzięki nim nie spada ze schodów, podąża wzdłuż ścian, objeżdża nogi od krzeseł, stołów i łóżek dokładnie wokół nich sprzątając. Roomba przy pomocy podczerwieni komunikuje się ze stacją dokującą i wirtualnymi latarniami, które prowadzą ją po domu. Roombę można programować na każdy dzień.
Zasilanie
Pomimo posiadania wielu niezależnych silników, Roomba zużywa podczas pracy jedynie 30 Wat, czyli kilkadziesiąt razy mniej energii niż tradycyjny odkurzacz. Zawdzięcza to oszczędnemu akumulatorowi, który po około 3 godzinnym ładowaniu potrafi pracować od 1 do 3 godzin, zależnie od rodzaju sprzątanej powierzchni oraz liczby mebli w pokoju. Roomba jest tak oszczędna i zarazem cicha, ponieważ posiada specjalnie dla niej zaprojektowany, niesłychanie wydajny 3-stopniowy system czyszczenia.
3-stopniowy system czyszczenia
Wirująca szczotka boczna wymiata brud wzdłuż ścian i z narożników. Dwie przeciwbieżnie obracające się szczotki główne (gumowa i z włosia) zbierają brud z podłogi i wykładzin. Najdrobniejszy kurzu zasysa podciśnieniem gumowa ssawa, która zużywa dużo mniej prądu niż tradycyjny odkurzacz. Roomba nie potrzebuje tak dużej siły ssania, ponieważ nie przepycha brudu przez długą rurę, tak jak zwykłe workowe odkurzacze. Posiadacze tradycyjnych odkurzaczy workowych doskonale znają nieprzyjemny zapach wydobywający się z urządzenia w czasie sprzątania. Temu zapachowi towarzyszy najdrobniejszy kurz, który wydostaje się poprzez otwory w workach i filtrach. W worku jest ciepło, ciemno i mnóstwo pożywienia dla roztoczy, bakterii i grzybów. Podczas sprzątania takim odkurzaczem zatruwamy powietrze w naszych domach najgroźniejszymi znanymi medycynie alergenami: odchodami roztoczy, zarodnikami grzybów i toksynami produkowanymi przez bakterie. Alergeny te są źródłem alergii, astmy i obniżenia odporności organizmu na inne choroby.
Szczotkowanie jest najlepszą metodą sprzątania, o czym przekonać się możemy obserwując maszyny czyszczące lotniska, supermarkety, czy ulice. Gdyby używały do sprzątania przepływu powietrza, to ludzi zasypywałaby grad drobnego piasku i kamieni w odległości kilkudziesięciu metrów za taką maszyną.
W wielu wymiarach mikroprocesorowych odkryć jest też taki, który powoduje, że głucha, cicha i stara zabawka leżąca w szuflkadzie jaką może być system mikroprocesorowy nagle ożywa i wydaje przeróżne - w tym niesamowite - dźwięki. Mam na myśli adaptacje Adruino w wersji MaxMSP.
Z materiału Arduino VS Max/MSP wynika, że najlepszym softem do zabawy będzie Maxduino. Zabawa może polegać na tym, że rozrysowujemy w aplikacji Max wykres działania / połączenia z systmem generatorem/syntezatorem dźwięku i uploadujemy program do naszej zabawki. Dodatkowe interfejsy mile widziane. Diody RGB, klawisze, czujniki natężenia światła i całą resztę można powiązać z syntezowaniem bitów, które sprawią, że na pozór cichy i bezduszny sprzęt nabierze niesamowitego wydźwięku i będzie w stanie nas zaskoczyć brzmieniem np: z gatunku ambient :-)
W jednym z klasycznych dzieł fantastyki i dodatkowo "fantastycznym", którego nazwa wymknęła mi się z pamięci jest wątek o tym, jak roboty budują roboty. Do tego stopnia potrafią się replikować, że tworzą całe stada różnych wielkości oraz rodzajów robotów. Ludzie na stacji kosmicznej znikają, bo roboty potrzebują "podzespołów" t.j. ludzkie oczy ... i wszystko byłoby fikcją, gdyby nie fakt, że jest sobie XXI wiek i możemy śmiało powiedzieć, że jest to początek historii, która może zakończyć się niebawem mało "fantastycznie".
Przedstawiam dziś bardzo kreatywny projekt. Robot, który w kilkudziesięciu procentach potrafi się zreplikować.
Jest to projekt Open Source i Open Hardware. Znajdziecie pod nazwą RepRap. Jest on jednym z zastosowań dla opisywanego na łamach wielu blogów modułu Arduino i w pełni wykorzystuje go jako swój bazowy podzespół.
Robota tego nazwać można też drukarką 3D, gdyż jego rola polega na tym, że potrafi drukować z dość dużą precyzją z topionego plastyku dowolne wymyślne trójwymiarowe twory. Otwiera nam wyobrażnię, bo jak dotąd żyliśmy wyłącznie w świecie kolorowych reklam i druków oraz form seryjnie produkowanych w fabrykach. Prototypowanie odbywało się na urządzeniach frezujących/skrawających CNC. Od teraz prototyp możesz zrobić sam w domu i to przy użyciu ogólnie dosŧępnego sprzętu t.j. PC + Linux + kilka silników krokowych + nieco łączników metalowych + oczywiście odpowiedni software :-)
Wracając pamięcią do zagadnienia z tematu tzn. reprodukcji chciałbym zauważyć, że o ile istnieją standardy do różnych zastosowań, w weilu dziedzinach, wiele norm opisuje techniczne aspekty konstrukcji, o tyle niekt jeszcze nie stworzył standardu do robotów a o samoreplikujących się robotach już nie wspomnę. Polecam ważny dla robotyki artykuł Robot wciaz bez standardu i zachęcam do dyskusji na ten zapomniany temat. Kręgi akademickie możliwe, że zarzucą mi, iż mało w życiu robotów widziałem ... cóż, widziałem ich nie wiele, ale wiele nieudanych prób napisania standardu do takich maszyn jak roboty widziałem dość wiele. Każda kończyła się prywatyzacją standardu i okrzykiwaniem, żę to jest właśnie ten. Chyba potrzeba silnej firmy - może Google - która narzuci przemyślany standard - może z KML - do definiowania robota oraz jego możliwości i zadań. Może powstanie jakiś nowy superobiektowy język opisu i programowania robotów z interfejsami do sztucznej inteligencji. Do tego rozproszone agenty, które podpisany jako pluginy naszego robota, które potrafią współdzielić w sieci neuronowej doświadczenie i mamy roboty samoreplikujące się, które będą w stanie upiec nam np: ciastko, że aż palce lizać, hahhaaa :-)
Oficjalnie dzisiaj nastąpiło otwarcie targów automatyki przemysłowej i pomiarów Automaticon® 2009. Od ponad kilkunastu lat przez pryzmat asortymentu oraz licznych technologii prezentowanych na targach możemy obserwować rozwój automatyzacji w polskim przemyśle. Z jednej strony producenci i ich przedstawiciele z drugiej strony konstruktorzy i ich dzieła. Jest to dość poważne zestawienie w branży automatyki, gdyż konkurencja, która czycha wszędzie może stanąc twarz w twarz ze swoimi autentycznymi rywalami i używając sztuczek marketingowych oraz swojej marki wypromować indywidualny bądź też powielony pomysł na biznes.
A w automatyce dzieje się wiele na codzień, jak łatwo się domyślić podobnie jak w elektronice - wszak automatyka jest w trwałym związku z elektroniką :) Automatyzacja procesów przemysłowych, ich monitoring, badania nad wytwarzaniem dóbr w sposób wydajniejszy jest to dość prężnie rozwijająca się dziedzina. Sam fakt obecności rokrocznie kilkuset wystawców na targach AUTOMATICON tego dowodzi, jak również zainteresowanie ze strony osób bezpośrednio związanych oraz z dziedzin postronnych (robotyki, informatyki, ekektroniki, miernictwa, etc...).
Niniejszym artykułem chciałbym zachęcić wszystkich zaintereowanych do dyskusji n.t. automatyki oraz nowych technologii, protokołów komunikacyjnych oraz wszelkich wynalazków, które zainspirowały ich podczas tegorocznych targów. Jednocześnie pozwolę sobie zamieścić fragmenty relacji z targów AUTOMATICON® 2008 oraz do galerii tagrów. Więcej znajdziecie w artykule Automaticon 2009. Zakres tematyczny oraz katalog wystawców znacząco ułatwią zapoznanie się z ofertą targową.
W tym tygodniu - 05.11.2008r - w auli wykładowej UAM w Poznaniu odbyła się prezentacja LEGO Maindstorms. Wykład był otwarty, więc aula gościła zainteresowanych wykładem dot. tematyki budowania robotów z klocków LEGO. Oto PLUGowa strona wykładu oraz udostępnione materiały.
Pozwolę sobie na przedstawienie w postaci materiałów wideo zastosowań LEGO Mindstorms, po czym wrócę do opisywanej prezentacji.
Sterowanie fabryką klocków samochodów z klocków LEGO
Pojazd typu Segway (z efektem odwróconego wahadła)
Układanie kostki rubika
Kusza z LEGO strzelająca piłkami
Kreatywne rozwiązania z LEGO Mindstorms
I najbardziej pocieszny przykład użcyia w prototypie podajnika papieru toaletowego
Marcin Bielak, architekt i programista biznesowych aplikacji internetowych. Stawia od początku na wysoką jakość produktu. W programowaniu wykorzystuje: Open Source, Linux, Python, Golang, ECMAScript/JavaScript.