WEBVTT 00:00.000 --> 00:18.680 So, hello again, now we'll have the Gium Bine, there's going to talk to us about Copa Rres, 00:18.680 --> 00:26.660 Opposen Trost, something for robotics, thank you so much, welcome everyone, welcome on 00:26.700 --> 00:35.660 this stream too. So, yeah, I'm Gium, I'm the author of like a Copa Rres, like a Rust engine for 00:35.660 --> 00:41.780 robotics. So, probably most of you read that, oh yeah, I know they'll do that just like 00:41.780 --> 00:48.660 takes to something, we'll watch it in the rest, come on, they're another spin of it, no, let me give me a chance. 00:48.660 --> 01:03.660 So, yeah, that doesn't work. Right, so the stuff to wear engine for robots, I have a good 01:03.660 --> 01:11.660 like way of kind of having a grown Copa Rres in what happened in another industry, which is the 01:11.660 --> 01:20.660 gaming industry, anyway, it's me. So, for those all enough to remember, okay, who knows what's 01:20.660 --> 01:27.660 the game on the left-hand side? Wow, nice, oh my god, like the geek, the geek dumb is here. 01:27.660 --> 01:32.660 Friends of Persia, that's the dude, I don't remember, he's never actually took his son, 01:32.660 --> 01:38.660 he's like a roto-friend thing to actually make the animations of a feast game, everything 01:38.660 --> 01:44.660 that was anchored with assembly language. And it was amazing, like back then you looked at that, 01:44.660 --> 01:50.660 I don't know, I'm gonna get up at Apple 2, it was absolutely incredible. It completely 01:50.660 --> 01:56.660 changed the way you see animations in the game, that something was like striking, it's like everything 01:56.660 --> 02:04.660 was really anchored for that game. Nothing was ever used from that implementation, but something 02:04.660 --> 02:09.060 something happening in the 90s, probably everybody knows this one in the middle, but 02:09.060 --> 02:13.780 and this one has been bought for on every single platform's ever. Let's do my 02:13.780 --> 02:19.940 doom, basically created what we call the now a game engine. And there will 02:19.940 --> 02:24.980 have something back then when they make that engine, is that a little bit lacking 02:24.980 --> 02:32.740 on a robot, you, you don't, I mean people working on a codebase and assets of 02:32.740 --> 02:37.700 a game, they are not coming from the same place. Some of them are, yeah, 02:37.700 --> 02:42.340 hardcore developers that are making algorithms, but you have like a 02:42.340 --> 02:47.140 people specialized in sounds, people specialized in 3D graphics and so on. 02:47.140 --> 02:51.380 Like in robotics, you have people that are coming from a mechanical engineering 02:51.380 --> 02:56.980 or like controls or like physics and, and the EE and so you have a lot of people 02:56.980 --> 03:04.420 that are actually working around a robot. And the industry can kind of match 03:04.420 --> 03:08.180 your from that point on. And you have like all the games today, you have triple 03:08.180 --> 03:14.260 games, you see like full studios of people that, yeah, just have like a specific view 03:14.260 --> 03:17.380 of their own games or their own like development or 03:17.380 --> 03:20.660 contributions to the game depending on where they are coming from. And you see 03:20.740 --> 03:26.820 all those games where you have today. So, compared to that page, 03:26.820 --> 03:35.940 out of the of that story and really try to really from scratch like two years ago, 03:35.940 --> 03:42.660 when I spent like 10 years really trying to to support like like robotics engineers 03:42.660 --> 03:49.940 or what he says, trying to to think what would be the best tool today. So those people 03:50.020 --> 03:54.500 can all work together on a robot efficiently and not shooting themselves in the 03:54.500 --> 04:01.940 university in the process. So what's wrong with was, that's going to be my first question 04:01.940 --> 04:12.020 for that, that you would ask. So things like Ross is amazing in it. I mean, I've seen 04:12.020 --> 04:17.380 so many students going to, I don't know, you've a university of austine or other universities 04:17.380 --> 04:23.780 here and so on. Look, look at what they can do with like so little, just few Python scripts 04:24.420 --> 04:29.060 scrap together, they have like those, they have their components, they can actually 04:29.060 --> 04:35.380 log on their on their system. But it has like, it has like, it has like, 04:35.380 --> 04:41.300 say I use flows for me when you try to get that from like a prototype to a natural product. 04:41.300 --> 04:47.060 It's actually fighting you a lot. One of the key reasons is, it is completely asynchronous. 04:47.060 --> 04:53.220 So people are going to that way because they think like, yeah, you have like a big, 04:53.940 --> 04:58.020 I don't know, multi-sweeted machine with GPUs and so on. So yeah, as a college city is good, 04:58.020 --> 05:02.660 like you have an event and then you can search to that event. So you try to optimize that, 05:03.460 --> 05:11.540 that aspect of the robot. The huge issue with as a college city, like it is done on Ross, 05:12.500 --> 05:18.980 it is non-deterministic. So what I say by non-deterministic is that you grab your 05:18.980 --> 05:25.700 your boss bags, you look them in your robot, but you never have any guarantees that when you get 05:25.700 --> 05:31.540 back your your boss bags and you try to replay your code, that your code is going to replay 05:31.540 --> 05:37.220 the same thing as what happened on the robot. And that has like a lot of like a kind of like 05:37.300 --> 05:41.620 cascading consequences when you are trying to, yeah, and make, for example, like autonomous robots, 05:41.620 --> 05:47.620 like things that are needs to be safe and where also you have like a lot of people working on 05:47.620 --> 05:52.580 that needs to reproduce a lot of cases out of the out of your robot, that they either encounter 05:52.580 --> 06:01.300 on the wild or in simulation. There is also the C++ situation. I mean, I spent literally nights 06:01.380 --> 06:10.020 on the passenger side of a cellar rinkar, wondering what the hell is going on with this code 06:10.020 --> 06:16.820 base, everything passed, like all the all the leaders passed, and I remember one that was very 06:16.820 --> 06:25.060 serious, where are like some kind of like to search the perception system, who was actually less 06:25.860 --> 06:32.180 this performance that was supposed to be, and it was a corruption, that was the limit of our 06:32.180 --> 06:39.380 user code and the and the transroarty layer, and that was a stupid for loop that somebody did 06:39.380 --> 06:45.140 where there was like an undefined behavior, and you look, seriously, like a lot of people are 06:45.140 --> 06:51.780 there are eyes on this thing, and it went through all the ways through the car. So C++, again, 06:51.860 --> 06:57.940 think about like what I said about the game engines, people are like roboticists, usually they are 06:57.940 --> 07:04.900 they see really C++ as a tool, like a school driver, they don't care, they don't care yet, 07:04.900 --> 07:08.740 they don't care about like complexity of the language and so on, they want something that is safe 07:08.740 --> 07:15.540 to run and to implement what they have in mind, which is usually math, usually both are like 07:15.540 --> 07:23.700 pure transforms, for your robots, for any algorithms including a machine learning, and yeah, 07:25.140 --> 07:33.620 C++ doesn't, and the thing also is that people often switch back to Python then, because Python 07:33.620 --> 07:39.220 is actually safe, it's hard to actually crash Python and easy to use, and then you have like 07:39.220 --> 07:44.500 questions where yeah, you have a management on your back, saying you need a robot, 07:44.580 --> 07:48.500 that needs to go to production, like as the code is in Python, and you're like now, it doesn't 07:48.500 --> 07:56.100 even keep real time, it calls in the lab, not trained on the public rules, performance is horrible, 07:56.100 --> 08:03.940 it's just terrible, you'll see with copper, I think the compulsion is more about like 08:03.940 --> 08:11.780 was being slow than actually copper being fast, also the fact is it's really dependent on your 08:11.860 --> 08:19.860 system, people try to port, was to value systems, I have it on my arch Linux, it's terrible, 08:19.860 --> 08:24.820 because like you have like so many system dependencies and package dependencies, out of the systems, 08:24.820 --> 08:30.180 something also that that really hinders people to actually have a system that is really 08:30.180 --> 08:37.700 heavily in production where you can update it and put it in the wild, yeah, and like you'll see 08:37.700 --> 08:44.340 also on the safety, so okay I took a lot of games, so about what let's let's look at 08:44.340 --> 08:49.940 at copper, so copper is when I really started it from scratch, the non-negotiable 08:50.900 --> 08:58.020 first principle I wanted to implement in there was determinism, so to be sure that what you run, 08:58.020 --> 09:04.100 so literally you run let's say something simulation even with copper, you can try it actually on 09:04.100 --> 09:12.020 the repo, you run your robot on simulation, it plugs the robot, you strip out the outputs, 09:12.980 --> 09:21.140 you rerun the product, you replay basically with a whisperer that that log, you compare the 09:21.140 --> 09:27.860 binaries of the two logs, they are exactly the same, so think about it for a roboticist, it means 09:27.860 --> 09:32.740 that those logs you can put them in the in the cloud and you can be sure that when your test 09:32.740 --> 09:37.060 gets passes, it will always pass, and when it doesn't pass, you know that you you you 09:37.060 --> 09:48.100 regress somewhere, so it's also designed for safety, conceptually, so conceptually actually copper 09:48.100 --> 09:55.140 is a lot of things, one it's a compiler, I just basically copper extends with macros in rest, 09:55.460 --> 10:04.740 the rest compiler to actually create your run time, we don't depend on anything, so much that 10:05.300 --> 10:10.500 you could say that copper is an actual operating system, you say Ross is an operating system, 10:10.500 --> 10:16.740 it's not, that is an operating system, I have a file system, I have a scalar and I run like 10:16.740 --> 10:23.380 bare metal, you can run on STM32 if you want, but it runs off course on standard process, 10:23.380 --> 10:28.420 we'll time a minute, but you can also run it like bare metal, because yeah, I depend on nothing, 10:30.660 --> 10:36.420 it's very performant, like like high bond wave, low latency, we are like out of the box, 10:36.420 --> 10:44.660 if you want to do, I have some examples in the repo, if you want to do the same chain of tasks 10:44.740 --> 10:53.860 that you run and log for each of them, for the latency, I have 100x faster than Ross, so that's 10:53.860 --> 11:00.260 100x, yeah, because like it generates basically the operating system to run your robot, you design 11:00.260 --> 11:05.860 your robot, you say to copper what you want to run and it accommodates you, the system around 11:05.860 --> 11:11.380 your your the architecture of your robot, so it's very out to be, I mean it tries to chain up like 11:11.460 --> 11:17.700 all the tasks back to back in memory, with like that architecture, so it's always like hitting 11:17.700 --> 11:22.740 all the cashees and the linearity of all your systems, same thing for logging, actually, 11:22.740 --> 11:28.820 logging with log, we don't log, like Ross bugs are kind of like indexed and all over the 11:28.820 --> 11:36.260 place on an hard wife, we log so linearly that we don't need a file system, so you give it a partition 11:36.820 --> 11:42.500 linearity, we log back to back to back to back to back, so for an NVMe for example, 11:42.500 --> 11:47.620 it's the difference between seven gigabytes per second to something that is five on the right 11:47.620 --> 11:52.100 of the megabytes or six on the megabytes per second, that's the difference of successful 11:52.100 --> 11:57.460 product or not, because yeah, if you want to match that performance, you need 10 times more like 11:57.460 --> 12:03.060 NVMe's, how do I know? Actually, actually I can still set the ring cards, we're hard to put like 12:03.220 --> 12:09.540 a raise of NVMe's, where I was like what the hell are we doing? And the digital also is 12:09.540 --> 12:14.900 important, something that you realize quickly with robots in a conformant environment, you're 12:14.900 --> 12:22.740 robots will run nicely, but also the need you have more people or more objects around your 12:22.740 --> 12:28.980 your thing and if your own system adds some noise into the measurement, you don't know 12:29.060 --> 12:34.180 in terms of performance like, okay, what three girls that kind of like randomness into your 12:34.180 --> 12:43.300 the execution of your own right? So yeah, all in all, that's all those people to focus on algorithms 12:43.300 --> 12:50.580 and not all the details I told you, compared to that for you, on at compile time. Should we try 12:50.660 --> 13:02.260 a demo? Can you make a prayer to the demo girls? So that's on the repo, you can actually try it 13:02.260 --> 13:10.820 yourself and one thing I tried really hard to do is that you know what, that's just a rest up, 13:10.820 --> 13:16.660 you don't have cool cool things off, special makes fires or whatever, that's it, that's my 13:16.740 --> 13:29.620 non-negotiable, you can go on and it should run each, maybe. 13:37.700 --> 13:45.540 Come on, no, yes, yes, yes, yes, yes, yes, yes, maybe I'll make it. 13:47.540 --> 13:54.260 Here we go, so that's a very simple robot, which is like a safe balancing rod. I do that because 13:54.260 --> 13:59.860 I don't want to explain to you a robot, so everybody knows this example actually, you don't see 13:59.860 --> 14:10.340 my cursor but you try to try to show you, so that's just a self balancing rod like in a 14:10.340 --> 14:17.780 run in a simulator, I do have the actual robot at home. It runs exactly the same code, 14:17.780 --> 14:26.580 if I can't really see what I'm doing, but so you see, so that's basically bevy, bevy is like 14:26.580 --> 14:34.740 a game engine in in copper, but we do, we do support like values like simulator, it's just one 14:34.740 --> 14:40.580 that is easy because because of this copper run, like that's like a rust deponentive, so I can run it 14:40.580 --> 14:45.540 straight away, you can see a little bit like the console, there is a console like to monitor real 14:45.540 --> 14:54.660 time what is happening on the robot, so it shows you, here the structure of the robot itself, 14:54.660 --> 15:00.980 so that's a big config file that is modular, you can add that, so the big difference between 15:00.980 --> 15:08.020 was and copper is that you actually define your robot a lot of time, so you say what's going to be 15:08.020 --> 15:12.660 connected to what and who is sending a message to what, that's part of the determinism aspect of it, 15:13.300 --> 15:18.100 but still, still at the same concept, you have a task, you have input outwards and you 15:18.100 --> 15:23.060 talk like you can have send messages even if you don't really send messages in that example 15:23.860 --> 15:31.060 and you can visualize that they are like this little kind of dag, where you have on the left-hand side 15:31.860 --> 15:40.420 sensors, those are, this was a Raspberry Pi running, like some algorithms, the PID is really simple 15:40.420 --> 15:49.940 and the actual output on the right-hand side, so this thing also, when you look at the other latency, 15:50.580 --> 15:54.580 so you have some zeros, because some of them are actually simulated, the other ones are actually 15:54.580 --> 16:00.420 executed, so I give you the number on the simulator there, but you will have the same thing on the robot, 16:00.420 --> 16:07.540 you see, I mean that's a small laptop, it's measured in microsegons and if I run that on my 16:07.540 --> 16:13.780 desktop, it's going to be in nanoseconds, basically, sometimes it's zero because with the super 16:13.780 --> 16:21.140 scale of the CPU, you can have actually data that is going so fast and we measure twice, 16:21.140 --> 16:31.780 the same timestamp on the CPU clock, and I'm talking like that, but you would say like, 16:31.780 --> 16:36.740 why do you need nanoseconds of latency, but think about it, like when you have a good 16:36.740 --> 16:42.100 logger, like we have, and a low latency, suddenly you can think about your robot and actually 16:42.100 --> 16:47.460 subdivides your robot with like blocks that are that are as small as possible, so these 16:47.460 --> 16:53.540 you visibility on every single blocks input out, input out, input out, input out, and basically for free, 16:53.540 --> 17:00.900 so you can, I don't know, you can put like 10 12 layers of of of blocks like that and you have like, 17:01.860 --> 17:07.220 I don't know, one microsegons of latency and two, and if this is pure CPU, that's pretty cool, 17:07.860 --> 17:13.940 I mean, over at the top of what you're doing, of course, if you're spending three seconds on 17:13.940 --> 17:23.460 your past, it will show. In terms of bandwidth, so that's kept to the simulator, like 60 17:23.460 --> 17:29.860 frames per second, something, like that's where you can see what's the efficiency of the 17:29.860 --> 17:34.820 logging, what's the bandwidth you use, because often like what happens when you are building a robot, 17:34.820 --> 17:40.740 you hit, you hit like limits on your system that are actually not CPUs, there are either Io, 17:40.740 --> 17:47.140 or or memory bandwidth, often, because you're drawing like images or light up points, like super 17:47.140 --> 17:52.260 AV things, that's why I really want you to have that view where robotics is can show like, oh, 17:52.260 --> 17:57.300 wait, I just I did like a camera, a camera, or like a new light up, what's going to be the 17:57.460 --> 18:06.340 cost in terms of performance, and yeah, that's pretty it. I can show you something I have seven 18:06.340 --> 18:14.820 minutes, so I try to, can show you how it looks like, so you define your tasks on, that's the one 18:14.820 --> 18:22.980 you've shown a little graph, and it's just like you tell it basically an ID, so you can collect them 18:22.980 --> 18:30.900 and refer to them in the logs, you give them a type that is kind of, it's just like a rust type, 18:30.900 --> 18:35.620 that implements like few traits depending on what type of component you are building, 18:36.660 --> 18:43.300 and yeah, you can give it like those ones are like other configurations, those are tuning for 18:43.300 --> 18:51.060 PIDs, so it's pretty self-explanatory, and you, you connect them, so basically you say, oh, I want 18:51.140 --> 18:55.220 to connect this source with this destination, with this message, very, very simple. 19:02.580 --> 19:09.620 Yeah, let's go back to the plantation. So yeah, I want to be sure that you have some 19:09.620 --> 19:14.660 times for questions, which is usually, I trigger a lot of questions that would have that presentation, 19:15.220 --> 19:19.940 so I would like to explain the amazing community, I've like a bunch of contributors, 19:19.940 --> 19:28.100 now on copper, and yeah, we are moving forward a lot, we just, we aren't exactly like this, 19:28.100 --> 19:37.460 bunch of like either middleware, like they know, or I saw eggs, we do, I think we've actually 19:37.460 --> 19:46.820 exceeded the algorithm, like cornea, we are like hanging face and fire and algebra, the algebraic, 19:47.540 --> 19:56.500 systems on unrest, so it's really copper is one thing that is actually growing together, a 19:56.500 --> 20:04.100 little bit, all that risk of, of like in robotics, that is actually growing, and re-inventing a 20:04.100 --> 20:09.060 little bit like what I did with copper, a lot of things are actually not just re-wrote in 20:09.060 --> 20:13.540 unrest, but actually re-inventing unrest, and that's quite amazing, and I'm super happy to be part of 20:14.420 --> 20:20.020 that ecosystem. Of course, like the two ones, at the bottom we talked about like re-run and first 20:20.020 --> 20:27.540 glove, so for example, it's more like a, you saw that before, like a visualizer, re-run as also, 20:28.420 --> 20:33.700 as also like an amazing integration with copper, because it integrates, of course, at the 20:33.700 --> 20:40.340 rest of the value API level, so it's in two lines, of course, you can actually show what's going on 20:40.420 --> 20:47.780 in re-run for, or what's going on in copper, always re-run. One small ask, if you like 20:47.780 --> 20:54.420 what I'm doing, you are supporting a project, yeah, please, stay on a little report would be amazing. 21:04.260 --> 21:08.900 The first thing to thank you very much, that's a lot of work and I appreciate that. 21:10.420 --> 21:13.620 How does this framework interact with the programming languages, in particular Python, which is 21:13.620 --> 21:17.460 taking our robotics with all the machine learning approaches, which in there, this calling 21:17.460 --> 21:23.700 it's supposed to last, I know, but how does it interact? Yeah, no good question, so we do have already 21:23.700 --> 21:30.340 Python API, but for the logs, because for example, you don't want to do that analytics in 21:30.340 --> 21:38.420 the rest of the year, so our rest, our logging is actually an API, and so we can use that to 21:38.420 --> 21:43.940 explore that to other systems, like we said, for folks love, but also you can get that and get 21:43.940 --> 21:52.260 straight, you get your robot, you can have your Python worksheet, and you can actually get the 21:52.260 --> 22:01.700 data straight out of Python interface. Life data, too? Life data, too? Life, the topic is looking at 22:01.700 --> 22:08.340 that data, you could do it, we don't support it yet, but we could, so we do have what we call 22:08.340 --> 22:15.620 like bridges, also, where you can integrate with your Python code, we use zero, for example, for 22:15.620 --> 22:24.900 that, where you can actually, like to meet the data, to a channel, and you have bindings for those 22:24.900 --> 22:31.620 like types in Python, so you can do that, like remotely. What we haven't done yet is actually 22:31.780 --> 22:39.780 enabling Python itself in the tasks of the robot, it's not hard to do, like you know, like 22:39.780 --> 22:46.180 tooling in rest, that is doing that very nicely, but I'm a little bit scared, because like then you 22:46.180 --> 22:52.660 have like the, a little bit the duration, a lot of like people contribute just Python, while 22:52.660 --> 22:57.300 I really, especially where I am in the community today, I really want like solid like building blocks 22:57.460 --> 23:02.900 for basic things, like drivers or like, I don't know, ICP, and those kind of like simple things 23:02.900 --> 23:08.500 that I really want to be nailed. At some point I will implement like a first class Python, 23:08.500 --> 23:13.540 super, for sure. So you have bridges, like let's say we have our system, we want to migrate towards 23:13.540 --> 23:17.540 your system, so we start with whatever we have, I'm going to say Ross, because that's what we have. 23:17.540 --> 23:22.660 And we want to migrate some elements to your OS, do you have bridges set up, so you can 23:22.740 --> 23:27.860 correct. Yes, so we do have a translation layer for Ross too, so you can also talk to Ross 23:27.860 --> 23:30.580 too soon, but that also one of your escape arch from Ross. 23:34.580 --> 23:40.580 Thanks so much for the talk, I'm really calling concepts and I think that Ross could learn a lot from 23:40.580 --> 23:48.740 from that, but I, this thing on your website that you say that you have a patent on copper, 23:48.740 --> 23:55.220 could you verify that? Actually, yeah, actually I let it expire. So I had a provisionary patent on 23:55.220 --> 24:00.260 on it and it's not that much, but what's going to happen now? What's going to happen with 24:00.260 --> 24:07.060 Arcas, I'm not even going to touch suffer that. Yeah, no, it's not patent today, actually. 24:07.060 --> 24:11.540 Okay, it's it was a pre-minuary patent, so basically it's not a patent just like saying maybe 24:11.540 --> 24:16.740 we, I would, I would patent it and I decided to not, to not, it would be good if you updated the 24:16.820 --> 24:22.580 website because for me, it was like, it's very, yeah, yeah, I'm going to touch this. Okay, cool, thank you. 24:25.860 --> 24:27.380 Goodmath, thank you for one more. 24:29.460 --> 24:36.740 Hey, my question is, if you, if you have a system that's built on Ross too already, 24:36.740 --> 24:42.500 what is the migration path if I, I really like what you're doing? Yeah, I, I don't understand 24:42.500 --> 24:47.140 like, do we have to start from scratch and we'll build everything? There are like, there will be 24:47.140 --> 24:54.500 questions. So, so we have a system and one of our users is doing that actually and what are 24:54.500 --> 25:00.180 recommend usually is to, so we have a bridge between copper and Ross too and so you can send 25:00.180 --> 25:04.980 messages from one to another. So your, your copper system can act as like a big,