 Great. Thank you very much. Thank you, everyone for coming along with this talk. My name is Owen McAree. I am an education technical specialist at mathworks. I am an education technical specialist at mathworks. Why am I here at EMF to talk to you guys today? I want to talk to you about robotics and computer vision particularly using our Mablob and Simulink tools, Ond am fydd ei fod yn bwysig sy'n chi i gyd yn fyddwg ar hyn? Rwy'n cael ei wneud i gyd yn rhan o ran ffordd ychydig yn bwysig. Felly rwy'n cael ei fod yn swydd yn bwynt dod. Rwf wedrych yn gwybod gwудd dweud i gyd yn bwysig. Gwybod y symu? Rwy'n gwybod y cymunod am gyflym? Awr, mae'r gyd yn bwysig. Yn ymword. Felly os wedi cymryd o'r gweddyn ni wedi'i gyd-bwysig y mawr yw ni. ac beth dyna mor i adael eich ddweud i'n ddweud i ddweud. Rydym yn ei gyntaf sy'n gweithio ar ychydig i'r ddweud. Felly efallai ei yw'r un dyna, rwy'n gweithio eich bod yna yn ddweud i'r plasmas, felly mae gennym yn gweithio ar gyfer yr edrych, ac mae'r cymdeithio ar y dyma'r ddweud i'r ddweud i'r ddweud i ddweud, ac mae'r ddweud i'r ddweudio ar y cyfrannu. Mae'r ddweud i'r ddweud i'n ddweud i arweithio ar y ddweud, ... Maingotion Freedom... ... You show Sesame Link... ... and, how you do this guy here, ... I don't know if you can see him... he is a little self balancing Lego robot. You arels so I can hit him and he stays upright... I'll give him a break for now, ... will come to him later... What is Mat Lab? Since most of you seem to know anyway I will keep this pretty quick. So it is the leading environment for technical computing. yma, mae'n ddweud o'r ymddangosu yng Nghymru, yng Nghymru, ymddangosu arloch yng nghymru a'r ddweud i'r mall. Mae'n olygu'r platform yw bydd, ym olygu. Yn olygu'r cyhoeddwn, cyhoeddwn cyhoeddwn, ymwneud ar y cyhoeddwn. Yn olygu'r cyhoeddwn, ym olygu'r cyhoeddwn, ym olygu'r cyhoeddwn, ym olygu'r cyhoeddwn. Mae ymwneud ar y grwp hwnnw, yn ymwneud, yw i'n hoffi, ychydig yn ymwneud ar y Matlab. Felly, fe'n gwybod o'u gwneud y math labiaeth a'r cwestiwn ar gyfer y bwysig, ond ymchwil a'r argylchau cyfnodol. Wel, ymgylchio'n cyfan yw'r cyfan gyda'r ymwil. Ymgylchio'n cyfan cyfan cyfnodol, ac mae'n gweithio gyfnodol sy'n gweithio cyfnodol. Felly, mae'n gweithio'n gweithio gwahanol. Felly, ar y gweithio'n gweithio, yw'n gweithio'n gweithio gwahanol. Yn y gweithio'n gweithio, yn ymgylched o'i gwahanol, Dwi'n ei f甚麼, dwi'n ei fxelfigio'r data, ydw yw hyd yn edrych i ddamayernio, dwi'n fywyd yn y gyfrifetig sy'n gorfod gwahanol ac ydw'n gychydig yn yr oedd pethau hefyd! mae'n wneud fe ynddyn nhw'n dweud yr oedd cyd-dweithio wedi'i ddwy'r rhaid i'r bladdol gyfan yw'r cyd-dweithio. Byddwn i'r ddweud, dweud i'n oedd yn mynd i'r ddweithio gallwch cymryd peth wnaeth o'r popeth i'r cwm ymlaen, podcoptors onto various things, robots basically, as was the title of the talk. I was going to switch into MATLAB now and show what MATLAB looks like, but since most people seem to know, you'll see it very shortly anyway, so I'll skip that for now. We can focus a bit more on the robotics and stuff instead. Now, most people didn't raise their hand when I asked if people knew what Simulink was, so I'll spend a little bit more time on this. Again, it's one of these products that is within MATLAB, and it's the leading environment for modelling and simulating systems, and the important line on there really is implementing systems as well, implementing dynamic and embedded systems. By that, we mean actually generating code, compiling and downloading that code onto real world systems. This is just a small subset of people who use Simulink for that purpose, of everything from modelling these systems, so you've got helicopters on there, you've got buses, you've got diesel engines, mobile phones, you've got all kinds of stuff, that people will model using our tools, and then once they've done modelling and say, yeah, this system does pretty much what I expect it to do, let's put it on the actual hardware and let's see how it performs on the actual device, and then they go off and productionise that and sell millions of them. So that's kind of how Simulink gets used out in industry. I appreciate you guys here probably aren't all, some might be, aren't all out in industry, so I'll now kind of focus a bit more on how this is useful for you guys. So I'll start off actually just by showing you what Simulink looks like because a lot of the stuff I'm going to be doing from now on is in Simulink. I spoke to quite a few people over the course of this event. Really because I've been flying my quadcopter around outside my tent, I'm sure some of you have seen that, and everyone asked me what it does and my answer is it doesn't do much at the moment because it's quite new, it's quite a new system that hasn't been fully developed yet. So what I do have, instead of a fully developed autonomous quadcopter, I have a simulation of a fully developed autonomous quadcopter, and I'm going to use that to show you guys exactly what Simulink is, so I'm just loading that up now, that I'll just take a moment. But basically what this is, is this is a virtual reality simulation of what this little quadcopter will see in the real world. So what this project is, is it's a quadcopter that's got a camera on the bottom, it flies around, it sees landmarks on the ground and uses those landmarks to determine where it is in the real world. It's designed to fly around indoors, so you can't use GPS for that purpose. So it's a vision-based system. So this is what Simulink looks like, this is a fairly simple looking block diagram where you have a control system in the middle, hope you guys can all see my mouse all right, control system in the middle, the simulation is here on the right hand side, and I've got a scope here which is going to show me what's happening. What we're also going to see, because in this simulation there's actually quite a lot of detail, what we'll also see pop up are some virtual reality views where you can see the 3D world that this simulated quadcopter is flying around in. So this is just building and just running now. This is all running at the moment on my local computer. This is kind of where Simulink started as this simulation tool. So you can see this little window that's popped up here, I can't resize that one, but what I can do is go to this. So that's showing what the downward viewing camera on this quadcopter would be seeing, and you can see it's marking little crosses on these little targets that it's seeing. And those crosses mean that the quadcopter has positively identified that target and is currently using it to determine its own position. And if I go to the scopes here, these top two time history scopes, so just like oscilloscopes would look like, are currently showing zero and zero because the quadcopter is currently at the origin. I can go and change where I want the quadcopter to go until actually I want you to go forward in X. And you can see the top scope there representing the X position of the quadcopter is now increasing. So behind the scenes of all of this there's a lot of maths, there's a lot of physical modelling, there's lots of simulation tools. And what I want to show you now is that this is what Matlab and Simulink is. I've given you a very quick, very brief introduction to what is Matlab, what is Simulink. But actually, how can you use these to connect to Raspberry Pis, to, yep, Arduino's, oh no, Arduino's, to LEGO and things like that? And how can you actually use the power of these tools to programme these devices? So I'm going to switch back to Matlab now, now that you guys are all familiar with Simulink I hope. I'm going to show you, just go to the presentation to give you some context. So I'm going to talk about the different ways in which you can connect low cost hardware with Matlab and Simulink because if you look back at the previous slide you wouldn't call any of the things on that slide particularly low cost. So if you happen to own a helicopter you might be able to plug Matlab in and do something with it but I don't think most of you do. Phones is the only exception probably and we'll come back to that shortly. So if you've got Matlab and Simulink on your computer and you want to run it on a piece of hardware, well firstly you can go to our website and download hardware support packages which are freely available tools. Once you have Matlab and Simulink you can download these add-ons that are freely available for the specific hardware you want. So for example Raspberry Pi, LEGO Mindstorms, et cetera. We have quite a large number of these packages now. So once you've installed those you get two different approaches you can use. The first is Data Rio, so getting data in and out of Matlab from a device. This might be in this case I'm going to talk about today. When I'm designing the image processing algorithms I want to run on this quadcopter I want to see what the quadcopter is actually seeing. I want to get an image off of the Raspberry Pi camera and I want to see what it sees and I want to work with that real image because I can only do so much with my virtual reality because that's not real, that's not real data. So this allows me to develop all my algorithms in Matlab on my computer but using a real device to communicate with the world. Once I've actually got all my algorithms developed I probably want to disconnect it from my computer. I don't want to be dependent on Matlab running on my laptop constantly and have to chase my quadcopter around. I want it to be able to go off and just do its own thing and not rely on me anymore particularly as I'm trying to design an autonomous system here. So this is our second approach which is where we actually target the hardware. So out of Simulink press a couple of buttons and it just goes and creates some C code, compiles that, downloads it and runs it on your device. It really is quite a straightforward process so I'll show you both of these two approaches now. So I'm going to show you the Raspberry Pi support for Matlab or the Matlab support for Raspberry Pi as the slide says. This workflow is very similar for Arduino's, for LEGO, for all sorts of stuff. It's just to have a good example of the Raspberry Pi here today. So the support package that we provide gives you access to GPIOs, LEDs, all the things on that list there. The one I'm going to use, the one I'm going to show you is the camera because that's what my little quadcopter friend is doing here. So once again back to Matlab to make sure I'm connected to. So I'm just creating a wireless connection to the quadcopter. It's got a wireless access point running on board. So I need to be connected to that to actually interface with the hardware. For those of you not familiar with Matlab, this is Matlab code. It's pretty straightforward. I'm not expecting you to read every line of this as I go through. Just vaguely see what's happening. And the kind of main point I really want to get across is just how little code is needed to do these various things. So that first section of code, those first two lines that create my Pi and my cam, just do exactly that. So I've created a connection to the Raspberry Pi, which doesn't seem to be working. It was still running Simulink at the time. So here we go. So I've just pulled in an image straight off the Raspberry Pi camera to prove that that is a real image. I just turned that round so it's not running live. I just pulled a single image. We'll get to running live in a minute. But I've just turned it round slightly and you see now get another image in. Now what I want to do, this is the image processing algorithm I want to develop, I want to detect that blue object. And I want to see where it is in the image and what orientation it's at. So the first thing you might think, well, images are made up of red, green and blue. That's how they're represented in MATLAB as big matrices. So let's select out the red, green and blue channels and see what they look like. Now you can see from that, if you look at the blue channel, you can't really detect the object at all. And if you think about it, that's because white also has a lot of blue in it. I mean white is basically all red, green and blue. So we've just found very, very quickly, we haven't had to write a whole load of code to figure this out. We've just found out very quickly that the approach of just saying let's look at blue is not useful. So let's try implementing this equation here where we basically say we only want blue. So let's look at the blue channel and subtract red and green to get rid of white from our area of interest. And actually that shows us something a bit more interesting. I don't know what the contrast is like on your screen, but you can see a little grey object here, which is the blue that we want to detect. Now that will have certain values associated with the intensity of blue, which we can figure out just by clicking on this little data inspector here and saying, oh yeah, that has a blue value of 74, whatever that means. But actually we just want to know is it blue or is it not blue? We're not interested in is it 74 blues? We don't really care about that. So we can do that simply by picking a threshold and saying is it above a certain threshold. So I've got a threshold of 100 here, that's not going to work. So this image on the right says, no, there's nothing blue in that image. There's nothing with a blue of more than 100. So if I drop that to something a bit more reasonable, 50, there you go. So we've now identified that's not blue over there, but that is blue over here. So that hasn't taken much code to implement that really. That's, well, maybe 20 lines of code and half of that's actually visualising what's going on. But then the interesting bit is we can actually call one of the functions from our image processing toolbox, which we'll look at that, just get rid of that data thing there. So again, I don't know how good this is on your screens. Let me try making that a bit bigger. If you can see on this right hand image now, we've actually called a tool called the blob analysis tool, which allows us to look at binary image of ones and zeros and say, OK, where is the centre of the object in this image? Where is the centre of the ones in this image? And also, what angle is this at in the image? So what we've done now is everything that we wanted to do. We've now wanted to detect where this item is in the image, and we've done that. Now, that's one off. We've done that on a static image, so that's not particularly exciting. Let's try actually running this now continuously. So I'm running this in a loop. And if I pick the quadcopter up and move it around, you can see on the right hand side there, I'm plotting a graph of where the target is in the image. And if I rotate the quadcopter, so the angle of the quadcopter relative to the target is that large arrow as well. And you can see I'm doing all of this. I'm developing all of this code on my PC, but I'm interfacing with the actual real system with the real Raspberry Pi itself. So that is connection between MATLAB and Raspberry Pi. I'm just going to reset this guy, so he's ready for later on. So that's kind of shown you a quick example of this first workflow that I talked about of this. So of using MATLAB for data acquisition. I didn't show you actually doing any actuation. If you had GPIOs connected to the Raspberry Pi, you could turn LEDs on and things like that. Again, just using tools that we provide. What I'll talk through a bit now is actually how you target hardware. So how you actually take a Simulink model and download it and run it on a piece of hardware. So again, much like our MATLAB support, we have a huge number of targets that we support. You can get them as free add-ons within MATLAB. And the ones I'm going to show you today is, first of all, the Arduino Mega. It's not a very exciting demo. It's turning an LED on, but it's sufficiently simple that I can actually build the model in front of you and show you the actual process and quite how straightforward it is. And then something a little bit more complicated that I'm not going to talk through the detail of, but controlling a self-balancing LEGO Mindstorms robot. I've spoken to some people over the course of the event so far who've been playing around with LEGO NXT robots who were all slightly amazed that you can actually make a self-balancing robot because their experience with them was that you can't read the sensors fast enough or you can't connect to motors quick enough or whatever. But actually using Simulink to program it, you most certainly can. So I'll show you that towards the end. So let's get back into MATLAB. And the reason I've closed down MATLAB and opened it up from scratch is to show you that I'm not cheating here. I am going to create completely from scratch a new model that's going to run on this Raspberry Pi and show you some of the... Sorry, this isn't a Raspberry Pi. On this Arduino and show you some of the interesting things along the way. So this is the add-ons menu I spoke about before. You go click on add-ons, get hardware support packages, and you click through a few menus and you get a whole list of hardware that we can target. But I've already installed all those, so I'm not going to go through that because it takes about 10 minutes. So I'm just going to open up Simulink. And again, I showed you that Simulink model earlier where I opened a model that I'd already created. That was fairly complicated. It had virtual reality in it and all sorts of stuff. But this, I'm just going to create a new one. So it's empty. There's nothing in it. I can run that now and nothing will happen. When I ran the model before, and if I run this model now, it'll run on my PC. Now that's not what I want. So the first thing I have to do is tell it that I want to run it on some target hardware. And that target is an Arduino, so I have to tell it that. So that brings up a menu in a moment. There we go. So target hardware is currently none and therefore it will run on my local machine. I don't want to do that. I want to run it on an Arduino. You can see the list here of all the packages I've installed. There is a much bigger list. If you hit Get More, you'll get that same menu I showed you before. But I want to run it on an Arduino Mega. This is going to give me some additional options now where I can choose various default settings. So if anyone familiar with programming on Arduinos, you can set board rates and things. You can set your analog voltage and all this. But I'm just going to leave all of that as default. What you also get, rather than just that interesting little drop-down menu, is when you install the support package, you also get some additional tools that you can include in your model. So I showed you a model before. It had some scopes in. It had some constants in. It had some subsystems in that had lots of things that were connected. But to connect to an Arduino, you actually want to control pins on an Arduino or read data from an Arduino. So you need some specific blocks for that. So I'm going to use the digital input and digital output blocks. Again, you can see this is going to be a very simple example. Switch is on number seven and my LED is on number ten. So all I'm doing there is telling it what pins things are connected to. And I also want the model to run forever. By default, things only run for ten seconds because you're usually simulating a system that usually doesn't take very long. And I'm going to say, let's deploy that to my hardware. And this will take just a minute. It's now generating some C code, calling various parts of the Arduino IDE. And downloading and running this code on here. And you'll see when it runs that that was all very interesting. Impressive button and LED will come on when it's running. But there is something more interesting, which I can show you in a moment. That didn't work because I'm in the wrong folder. So, like I say, this is downloading C code and running on the Arduino. Which you can do, if you know C, or C++ it is, you can do from the Arduino IDE quite as easily as well to turn an LED on. The one thing that is very powerful about developing these kind of things within Simulink is actually, once I've downloaded and run my code on this Arduino, I can keep my Simulink model connected to the Arduino and modify certain aspects of that code while the code is running. So, you guys probably can't see, but when I press the button an LED comes on. Now, the fact that you can't see it is actually good because it means that I can demonstrate this next thing that I was just alluding to that. I can keep Simulink connected to my Arduino while the code is running. So, I can say, actually, OK, I want an LED to come on, but I also want to record over time how many times the button has been pressed or if somebody is currently holding the button down or something. Now, if I was to hit that button and deploy to the hardware again, that wouldn't help because there's no screen on here. There's no way of me physically seeing a scope, a time history. But what I can select from this little drop-down menu here is I select to run in external mode. And what external mode says is, OK, I'm going to do what you asked me to do before. I'm going to create a load of C code and download and run it on an Arduino. But in the case of an Arduino, I'm also going to build in a serial connection. And I'm not going to ask you any details on this. I'm just going to do it in the background. I'm going to build in a serial connection, which says, if you have any things in your model that represent interaction with a user, i.e. a scope in this case to show me what's happening, I'm going to request that the code that I build sends that data back constantly so that you can see it and interact with it in Simulink in the same way you would if your Simulink model was running on your desktop, like when I was showing you the virtual reality example before. So this is now running again. When I press the button, the LED comes on, as was very exciting before. But now I can also open up the scope, and you can see there, a little bit bigger for you. But when I press the button, you can see that signal going high to say, actually, he's holding the button down, now he's not, now he's holding the button down. And you can imagine you can do a lot more exciting things than just holding a button down. But this was just something that I could build very quickly and show you right here and there. So the final thing I want to show, as I alluded to, was not just something very simple running on an Arduino, something a little bit more complicated running on some LEGO. So I'll just navigate to this, get this loading up. So what I've already done on this LEGO is I've already downloaded some code in the way I did in the first instance with the Arduino, which will just run when I tell it to run. And it'll just run there in the background and balance my robot. But that's not connected to Simulink. So I've got some things in here that I can control. For example, I can tell it I want it to move forwards or I want it to turn. But these two are not currently connected because when I did that download, I didn't use external mode. So what I'm going to do now is actually download again with external mode selected. And the real benefit with the LEGO hardware is that built into this is a Bluetooth device. So the external mode connection when you use LEGO is not a USB cable. I'm using USB to download the model because that's much faster than using Bluetooth. It's not a USB connection to actually have the external mode feedback because that would be quite useless if you've got a little robot that you want to drive around. You don't want it to be connected to your laptop over USB. So once this model is downloaded and run, it'll actually be communicating over Bluetooth. And I'll be able to have it hopefully driving up and down the stage and probably falling off the end or something. I don't know. But there we go. This is almost downloaded now. So this is just connecting. OK. OK. So the first thing I need to do is calibrate the gyroscope just by pressing a button to tell it that's what I want to do and holding it upright. Now he's running. And I can come into here and show you this. So this is a scope again. I appreciate it might not be the easiest thing to see on your screens, but it's a time history so it shows overtime where the robot thinks he's at in terms of the angle. That the robot is sitting at. So that might be quite useful if you're trying to design a control system. It's quite useful to have this information available to you. But also it means I can take control of him. So I can say, right, I've got these two targets, these demands going into my control system here. So let's demand that he moves forwards. And off he goes. And I can make him go a bit faster. And he'll just keep driving. And then I can make him turn. I'll wait till he goes past a little thing so you can see him if you can see him. Off he goes over the bump. There we go. Now let's make him turn as well. So now he's going to jump off the front of the stage. So let's turn him back the other way. That's not going to go faster now. Oh, is it? Oh, it is. He's fine. Let's let him walk all the way around then and come back to me. So, go on, you can go a bit faster than that. No, you can't. But you get the idea. I could have been changing things that weren't just constants leading into a thing here. I wasn't going to go into the detail of this because I appreciate you guys are probably not all control systems designers. But we do this kind of thing at universities. We do these kind of workshops with control engineers. And we would get them to actually go in and optimise the controller on the device, which you can do in real time while the thing is running. You don't have to keep rebuilding and re-downloading your code, which is a really, really quite powerful system to have. So that's all the demos I wanted to show you. I'll just wrap up and then invite any questions. So why am I actually here talking to you guys at EMF? Well, for a long time, if you weren't a student, it was quite hard for you to get access to our products, to MATLAB. Because we had a price point that was aimed at students because we knew that every student would need to know it. If you've done an engineering course, it's probably why most of you know MATLAB because you've either done an engineering course or had some affiliation with somebody that had, because it is the tool that is used by engineers. So you've probably experienced it at university. But if you weren't a student, or if you'd finished being a student and gone into a different field, or if you just had an interest in doing some of these kind of things, we didn't have any way of giving you access. We now do. New for 2014, we brought out MATLAB Home, which is for £85, you can have all the capabilities of MATLAB for doing the various things that I've just been talking about here. And then all the different toolboxes you can get as add-ons to that. So you customize exactly what it is you need. So that's why I'm here talking to you guys because I do all this kind of stuff for fun anyway. And I know that I couldn't do half of this stuff without MATLAB and Simulink because coding half of this stuff by hand is just really difficult. So I know how powerful it can be. And I just want to make all of you guys aware that it's out there. You can use it. There's lots of resources as well that we have. We have this Maker Zone blog, which is aimed at students and makers. It's not aimed at the people in industry making planes and cars and all sorts of things. It's aimed at you guys building robots and stuff like that. I'm putting quite a lot of blog posts on there at the moment to do with my quadcopter and all of this. So I'll just wrap up there. What are MATLAB and Simulink? Well, you guys pretty much knew that anyway. Connecting them to hardware, you can get all of the benefits, all of the power of those tools into your hardware-based robotics, image processing, whatever the project may be. We've got this new MATLAB home for 2014. So if anything you've seen here is of interest, you can now go away and actually try this yourself. And there's Maker Zone. We have a whole website full of tutorials and all kinds of things. There's a lot of resources out there to get you up and running to get you started. So thank you for coming along. Thank you for putting up with various demos, half-working, and the poor screen and everything. And I'd like to invite any questions. Thanks. Wait for the mic. What does the £85 package not do that the full package does? The £85 is for MATLAB. So some of the image processing stuff that I showed you with the quadcopter and all of that, you could do some of that stuff. But if you want to use a lot of the features in the image processing toolbox, you want to do some really advanced stuff, that's a £25 add-on. Simulink is an add-on also. You have to pay £25 to get Simulink? OK. Because depending on what you're doing, if you're doing a statistics project, for example, you don't need Simulink. So if we included it all and priced it so it had everything in it, it would end up probably costing a bit more. So we give you the option to choose what you need. Anything else? So the badges that we have are essentially Arduino deweys. Yes. How hard is it to create a custom hardware, a custom target? We support the Arduino dewey. So you could code the badges from Simulink directly. You wouldn't have the RTOS there running in the back, and you'd be coding it simply as an Arduino. But like the add-on sensors and stuff like that? For adding on custom devices, I didn't include that in this talk because I wanted to get lots of demos across. But actually, if you've got some C code, then you can include that in your Simulink model relatively straightforward. And we do have a tutorial on our site for showing you how to do that. So, yeah. Yes. Making you run. Get my exercise for dinner. Hello. Hi. So what granularity can that go down to? So, for example, can you model magnetic fields and the probes for NMR spectroscopy? Does that work in industry? You could model anything. Anything. Anything that has some maths behind it, you can model. Brilliant. It's completely up to you. You can put anything in there at all, and that's in MATLAB or in Simulink, depending on how you want the system to be represented. And we have tools in a lot of areas that will help you model things, which just makes getting started a little bit easier. But even if we don't have a particular tool in a particular area, you might have to do a bit more work yourself. But all of the capability is there to model anything. OK. This might be a bit unrelated, but do you think adrinos or LEGO Mindstorms would be capable of doing emotional processing like facial recognition with MATLAB? I would say it's unlikely. Yeah. But certainly the new LEGO Mindstorms, the EV3, I'm not quite sure how you'd get an image onto it. I don't know if it has a camera capability. It has a USB port, so maybe. But that fundamentally is very similar hardware to a Raspberry Pi. So possibly, I would say, is the answer to that. Certainly you can put image processing things on it and see what happens. There's nothing in our tools that stop you doing that, whether it will run or not, whether it's got the memory and the CPU capacity to actually do it, I don't know. But you can certainly try it. Would there be any way to beam it back through telemetry or whatever to process it on your computer, or to produce a custom sort of hardware configuration on the quadcopter to process it? If you're deploying things to it using Simulink, you've got that external mode connection if you want to use that. But you can also build in your own connections. So, for example, for the support for the Raspberry Pi, we have blocks for sending data over Ethernet. And that can be wireless Ethernet or wired Ethernet or whatever. The same with the Arduino. Actually, if you've got an Ethernet shield for your Arduino, you can send data out over Ethernet to any other device that you might want to use. That could be MATLAB running on your laptop, or it could be another device. So you could have an Arduino acquiring some data and then actually processing it on a Raspberry Pi. That would work fine. And you could code all of that from Simulink. OK, excellent. Thanks. OK, great. One behind as well. How much image processing can you get away with on a Raspberry Pi? A surprising amount, but obviously not everything that you can do on a desktop machine. But you can do quite a bit. I mean, what I showed you there of detecting the angles and all of this sort of stuff, it'll run that, no problem. It'll run that at, I think we're running at 10 hertz, which is sufficient for outer loop control on a quad. If you just wanted to detect is there blue in the image or something much simpler like that, that could probably run at full rate at 30 frames a second or something. So, yeah. You can't do a huge amount, but that's a limitation of the hardware. And obviously, if you can drop the resolution, you can help things massively. What platforms are supported? It's a very long list. So, I see you're using Windows, but... Oh, sorry. I thought you meant hardware platforms. Different support packages are supported on different platforms. We do fundamentally support Linux, Mac and Windows. MATLAB will run on all those platforms. Whether the hardware support packages are available on all of those platforms, you'd have to look at individual packages. We can sometimes have staggered development of things where maybe we'll release something for Windows and then at the next release you'll get Mac and Linux support all the other way around or whatever. So, for the individual hardware support, it's all detailed on our website, but fundamentally MATLAB and Simulink run on the three major platforms. OK. I think that might be all. Cool. If there's no more questions. Big thank you. Thank you very much.