WEBVTT 00:00.000 --> 00:10.000 So, now, let's get started. 00:10.000 --> 00:11.000 So, let's welcome Jan. 00:11.000 --> 00:15.000 It's going to talk to us about the O3D project 00:15.000 --> 00:19.000 about a realistic simulator, exciting subject. 00:19.000 --> 00:20.000 Thank you. 00:20.000 --> 00:29.000 All right, hello everyone. 00:29.000 --> 00:31.000 My name is Jan Hanta. 00:31.000 --> 00:35.000 I work for Robotica AI and I'm busy doing open 00:35.000 --> 00:37.000 3D engine simulator. 00:37.000 --> 00:41.000 I'm actually surprised the simulator was mentioned 00:41.000 --> 00:42.000 in the previous talk. 00:42.000 --> 00:44.000 I guess it's because of this talk. 00:44.000 --> 00:47.000 But not many people know about it. 00:47.000 --> 00:49.000 When you open rows to documentation, 00:49.000 --> 00:50.000 that was also mentioned. 00:50.000 --> 00:51.000 Thank you for that. 00:51.000 --> 00:54.000 You see webbot, you see gazebo, 00:54.000 --> 00:56.000 but nothing there, nothing extra there. 00:56.000 --> 00:59.000 And we believe that's a big mistake. 00:59.000 --> 01:01.000 And I said, as a member of Robotica AI 01:01.000 --> 01:03.000 company that makes money out of doing open 01:03.000 --> 01:05.000 source with open 3D engine. 01:05.000 --> 01:07.000 Of course, I will upload at some point 01:07.000 --> 01:09.000 some tutorials on open 3D engine, 01:09.000 --> 01:11.000 but I never have time for that. 01:11.000 --> 01:13.000 So, can you use open 3D engine for simulation? 01:13.000 --> 01:14.000 Yes. 01:14.000 --> 01:16.000 And you can use it because it's open source. 01:16.000 --> 01:17.000 There are open source conference. 01:17.000 --> 01:20.000 So, of course, we are talking about open source products 01:20.000 --> 01:24.000 that you can modify and you can do whatever you want with them. 01:24.000 --> 01:26.000 We do simulations with this engine. 01:26.000 --> 01:29.000 You can think about this engine as open source 01:29.000 --> 01:32.000 alternative to unity or unreal engine 01:32.000 --> 01:37.000 with the small difference that it's in C++. 01:37.000 --> 01:41.000 So, you can integrate your rows directly. 01:41.000 --> 01:43.000 It's the same as gazebo. 01:43.000 --> 01:45.000 It's very, very modular. 01:45.000 --> 01:47.000 All the plugins or parts, 01:47.000 --> 01:49.000 components, however you call it, 01:49.000 --> 01:52.000 are called gems in open 3D engine. 01:52.000 --> 01:55.000 And we are the autos of simulation gems, 01:55.000 --> 01:57.000 multiple of them, to open 3D engine. 01:57.000 --> 01:59.000 So, the good things about open 3D engine 01:59.000 --> 02:01.000 is that everything is in there. 02:01.000 --> 02:02.000 Whatever you want to do, 02:02.000 --> 02:05.000 if it's animation, terrain, editor, 02:05.000 --> 02:08.000 you can use the tools that are building 02:08.000 --> 02:10.000 for games in open 3D engine. 02:10.000 --> 02:13.000 And then we use it to make a scene for our robots. 02:13.000 --> 02:16.000 The game engine itself is closed platform, 02:16.000 --> 02:20.000 but the simulation parts is working on the under the looks. 02:20.000 --> 02:24.000 And the biggest advantage of open 3D engine is the renderer. 02:24.000 --> 02:28.000 It's super fast and it has all the features you might want to use. 02:28.000 --> 02:33.000 When you want to generate realistic data, 02:33.000 --> 02:35.000 it has physically-based renderer 02:35.000 --> 02:38.000 and real-time global illumination 02:38.000 --> 02:41.000 and as well as support for ray casting. 02:41.000 --> 02:44.000 Basically, whenever you start rendering things with open 3D engine, 02:44.000 --> 02:46.000 it doesn't look like gazebo. 02:46.000 --> 02:49.000 It doesn't look like some cubes that are moving around on the scene. 02:49.000 --> 02:51.000 You can really put some materials. 02:51.000 --> 02:53.000 You can really put some reflections. 02:53.000 --> 02:55.000 You can really work on it. 02:55.000 --> 02:57.000 And this is something I presented on the left hand side 02:57.000 --> 03:00.000 with the gazebo imported robot Photoshop 03:00.000 --> 03:03.000 into open 3D engine scene with all the reflections 03:03.000 --> 03:07.000 on the material of antibiotics, animal D, robot. 03:07.000 --> 03:10.000 Of course, the robot itself is made out of slightly different materials, 03:10.000 --> 03:13.000 but our graphic engineers didn't know that. 03:13.000 --> 03:15.000 So the reflections are there, 03:15.000 --> 03:19.000 and the quality is good enough for all AI you can imagine 03:19.000 --> 03:22.000 to process the data to train the models and so on. 03:22.000 --> 03:26.000 And this is basically how we roll in my company mainly. 03:26.000 --> 03:30.000 So you can download the source code of open 3D engine. 03:30.000 --> 03:33.000 You can communicate with open 3D engine, 03:33.000 --> 03:35.000 using Discord. 03:35.000 --> 03:37.000 And if you visit a six simulation channel, 03:37.000 --> 03:41.000 most probably it will be me answering your questions. 03:41.000 --> 03:45.000 The important part about open 3D engine is that it's very modular 03:45.000 --> 03:47.000 and our part, the simulation part, 03:47.000 --> 03:51.000 lives in O3DE Express repository. 03:51.000 --> 03:53.000 So don't forget about this. 03:53.000 --> 03:57.000 There are some simulation gems and projects templates. 03:57.000 --> 04:01.000 My company also has a GitHub, of course, 04:01.000 --> 04:04.000 with plenty of open source related to open 3D engine, 04:04.000 --> 04:07.000 as we are the main contributor to this part of the engine. 04:07.000 --> 04:09.000 So if you start pulling the code, 04:09.000 --> 04:12.000 I also recommend to have a look into our repository. 04:12.000 --> 04:16.000 Many for the demos that we presented at Roscon 2021-24, 04:16.000 --> 04:19.000 2021-free 2022 and 2021. 04:19.000 --> 04:22.000 Those are the build projects. 04:22.000 --> 04:24.000 You can even find some pre-compiled projects. 04:24.000 --> 04:26.000 You can just start it on your computer, 04:26.000 --> 04:30.000 the quality of the graphics, and the quality of the engine. 04:30.000 --> 04:35.000 Starting with your own project is also very, very easy. 04:35.000 --> 04:37.000 You can download the SDK, 04:37.000 --> 04:40.000 so the whole system is made in a way 04:40.000 --> 04:43.000 that you can compile everything from the source, 04:43.000 --> 04:44.000 of course. 04:44.000 --> 04:47.000 You can use the SDK with everything building 04:47.000 --> 04:52.000 or you can exchange some parts with having some parts written 04:52.000 --> 04:55.000 from the source with some parts being modified by you, 04:55.000 --> 05:00.000 and you don't have to bother about compiling everything every time. 05:00.000 --> 05:03.000 For SDK, the only thing you do to start 05:03.000 --> 05:06.000 is you pull the simulation gems, 05:06.000 --> 05:08.000 as you can see on the first slide, 05:08.000 --> 05:10.000 then I have a pointer even. 05:10.000 --> 05:12.000 Then, of course, you create a project. 05:12.000 --> 05:15.000 You use one of the project templates 05:15.000 --> 05:16.000 and you click build. 05:16.000 --> 05:19.000 Hopefully it should run out of the box, 05:19.000 --> 05:22.000 and you can make your open 3D engine project 05:22.000 --> 05:23.000 in less than 10 minutes. 05:24.000 --> 05:26.000 There are three different templates available 05:26.000 --> 05:28.000 for you to start with. 05:28.000 --> 05:31.000 The first one is the one you also saw on the screenshots 05:31.000 --> 05:32.000 in the previous presentation, 05:32.000 --> 05:34.000 is with very simplistic warehouse, 05:34.000 --> 05:35.000 actually that's the warehouse 05:35.000 --> 05:37.000 that was imported from Gazibod directly 05:37.000 --> 05:39.000 with some on-person assets. 05:39.000 --> 05:42.000 It's just one robot in very small limited space, 05:42.000 --> 05:44.000 and you can use enough to 05:44.000 --> 05:48.000 and all the rows stack to manage the robot. 05:48.000 --> 05:50.000 Another template with the manipulation, 05:50.000 --> 05:53.000 manipulator trying to pick some objects from the table 05:53.000 --> 05:55.000 with all the physics of the manipulation, 05:55.000 --> 05:57.000 with physics 5 engine, 05:57.000 --> 05:59.000 the same engine as in Gazibod, 05:59.000 --> 06:01.000 working under the hood. 06:01.000 --> 06:04.000 The last template with the fleet of robots 06:04.000 --> 06:06.000 navigating through the warehouse scene, 06:06.000 --> 06:08.000 the warehouse scene itself is very detailed, 06:08.000 --> 06:09.000 very pretty, 06:09.000 --> 06:11.000 but not optimized at all. 06:11.000 --> 06:13.000 If you put too many robots, 06:13.000 --> 06:16.000 you already need a powerful computer for that. 06:17.000 --> 06:20.000 So how does it work with rows two? 06:20.000 --> 06:22.000 We have rows two gem. 06:22.000 --> 06:25.000 It's one of the modules of open 3D engine, 06:25.000 --> 06:28.000 and it's enough for you to import this module. 06:28.000 --> 06:32.000 You import this module into your open 3D engine, 06:32.000 --> 06:36.000 and it automatically creates rows two node, 06:36.000 --> 06:39.000 as you know, from any rows two package. 06:39.000 --> 06:43.000 The gem itself takes into consideration 06:43.000 --> 06:45.000 all the environment variables. 06:45.000 --> 06:48.000 So your rows two pipeline can work 06:48.000 --> 06:50.000 in exactly the same way as it used to be. 06:50.000 --> 06:52.000 So you create your workspace, 06:52.000 --> 06:53.000 you create your packages, 06:53.000 --> 06:54.000 you build it with co-con, 06:54.000 --> 06:57.000 you source to your rows workspace, 06:57.000 --> 06:59.000 and then you start with the same terminal, 06:59.000 --> 07:00.000 open 3D engine, 07:00.000 --> 07:03.000 and open 3D engine can discover everything 07:03.000 --> 07:05.000 that you've already done. 07:05.000 --> 07:08.000 For our base component, 07:08.000 --> 07:10.000 we use rows two frame component. 07:10.000 --> 07:12.000 This is corresponding to something you know, 07:12.000 --> 07:13.000 a process TF. 07:13.000 --> 07:16.000 So basically that's a spatial temporal representation 07:16.000 --> 07:18.000 of an object in the space, 07:18.000 --> 07:21.000 and for us it also serves a purpose 07:21.000 --> 07:24.000 of providing a name space to the system. 07:24.000 --> 07:26.000 So you can display the TF trees, 07:26.000 --> 07:28.000 you can display all the name spaces, 07:28.000 --> 07:30.000 and all services topics, 07:30.000 --> 07:32.000 and everything you have in there 07:32.000 --> 07:34.000 will get a proper name space. 07:34.000 --> 07:38.000 The rows two gem also implement the sensors. 07:38.000 --> 07:41.000 Those are the very basic implementations, 07:41.000 --> 07:42.000 for example, for camera. 07:42.000 --> 07:45.000 It just displays what the camera sees, 07:45.000 --> 07:48.000 without any extra distortions, 07:48.000 --> 07:50.000 without any extra noise models 07:50.000 --> 07:53.000 that we can apply later on to make our simulation 07:53.000 --> 07:54.000 even more realistic. 07:54.000 --> 07:57.000 There are also sensors like contact sensor, 07:57.000 --> 07:58.000 of course GPS, 07:58.000 --> 07:59.000 IMU, LiDAR, 07:59.000 --> 08:00.000 Automatry. 08:00.000 --> 08:04.000 LiDAR can work on either GPU or CPU, 08:04.000 --> 08:06.000 and Robotech AI has also 08:06.000 --> 08:08.000 LiDAR implementation for gazebo, 08:09.000 --> 08:12.000 that is definitely the fastest on the market, 08:12.000 --> 08:14.000 open source available to everyone. 08:14.000 --> 08:16.000 For Robotech Control, 08:16.000 --> 08:18.000 Robotech 2 package contains of the 08:18.000 --> 08:20.000 acarmon control, twist control, 08:20.000 --> 08:22.000 and a very basic rigid body control, 08:22.000 --> 08:25.000 so we can just move your robot around as you wish. 08:25.000 --> 08:28.000 We've simulating the robot fully, 08:28.000 --> 08:29.000 using acarmon, 08:29.000 --> 08:32.000 or simply with moving this as a break. 08:32.000 --> 08:34.000 It has a full control of joints, 08:34.000 --> 08:36.000 it can display the state, 08:36.000 --> 08:39.000 of course virus to services messages topics. 08:39.000 --> 08:43.000 It's exactly the same one as you would use with any other simulator, 08:43.000 --> 08:46.000 and it happens only after you include the gem, 08:46.000 --> 08:49.000 everything is available for you. 08:49.000 --> 08:51.000 There is a screenshot very similar to what you saw 08:51.000 --> 08:53.000 in the previous presentation, 08:53.000 --> 08:55.000 basically with move it to, 08:55.000 --> 09:01.000 and this move it to is connected to the template I displayed earlier, 09:01.000 --> 09:05.000 the template that was made to try to manipulate 09:05.000 --> 09:07.000 with some objects. 09:07.000 --> 09:10.000 So there is a camera on top of the gripper, 09:10.000 --> 09:11.000 next to the gripper, 09:11.000 --> 09:13.000 to see the object from the above, 09:13.000 --> 09:16.000 and move it can actually integrate with 09:16.000 --> 09:19.000 our simulation without any problems. 09:19.000 --> 09:23.000 Robotech 2 gem includes also implement 09:23.000 --> 09:25.000 also the importer, 09:25.000 --> 09:27.000 so if you have your simulation ready and gazebo, 09:27.000 --> 09:29.000 you can import your robot. 09:29.000 --> 09:32.000 I'm not going to say it will work out of the box, 09:32.000 --> 09:36.000 because O3D is slightly different than gazebo. 09:36.000 --> 09:38.000 Everything under the hood is different. 09:38.000 --> 09:40.000 All the sensors are different. 09:40.000 --> 09:42.000 There are some different options to configure. 09:42.000 --> 09:45.000 So of course it will help you to start, 09:45.000 --> 09:47.000 but it will not solve all the problems. 09:47.000 --> 09:49.000 So the importer itself, again, 09:49.000 --> 09:51.000 can use your rows to sourcing, 09:51.000 --> 09:54.000 so if you have any rows packages connected to your robot, 09:54.000 --> 09:56.000 if you have any specific sensors, 09:56.000 --> 09:59.000 with specific implementations connected to your robot, 09:59.000 --> 10:02.000 the importer will be able to read it. 10:02.000 --> 10:06.000 The importer supports Sakura and multiple mesh formats. 10:06.000 --> 10:09.000 There is a general open-free engine, 10:09.000 --> 10:10.000 it's not well documented. 10:10.000 --> 10:13.000 I'm doing my best to fill all the gaps between 10:13.000 --> 10:16.000 the projects I'm doing for different companies, 10:16.000 --> 10:20.000 but there is a tutorial about importing turtle but far, 10:20.000 --> 10:23.000 and all the problems that may happen 10:23.000 --> 10:25.000 actually happen when you import this robot, 10:25.000 --> 10:27.000 so it's a very good source of information 10:27.000 --> 10:30.000 and you want to try with your own robot. 10:30.000 --> 10:33.000 Since we are trying to compete with NVIDIA, 10:33.000 --> 10:35.000 of course this is not easy, 10:35.000 --> 10:37.000 we are also implementing USD support, 10:37.000 --> 10:41.000 and probably it will be done before the end of the year. 10:41.000 --> 10:44.000 So I'm a C++ guy. 10:44.000 --> 10:46.000 I don't have any experience with Python. 10:46.000 --> 10:49.000 I know that there is a lot of implementation happening 10:49.000 --> 10:52.000 with Python rows, especially in academia, 10:52.000 --> 10:55.000 but we want to be fast efficient and we want to use 10:55.000 --> 10:58.000 what open-free the engine gives to us. 10:58.000 --> 11:01.000 And open-free the engine gives us the possibility 11:01.000 --> 11:06.000 to implement rows called directly within the code 11:06.000 --> 11:08.000 of open-free the engine. 11:08.000 --> 11:11.000 So as a small example, I decided to show you 11:11.000 --> 11:13.000 how to implement a gem, 11:13.000 --> 11:15.000 applying to open-free the engine, 11:15.000 --> 11:20.000 that would publish the current light entity via rows two topic. 11:20.000 --> 11:24.000 It would also subscribe to a topic to allow the changes, 11:24.000 --> 11:28.000 and would also create a service for changing the same intensity. 11:28.000 --> 11:30.000 Don't get fooled by the picture. 11:30.000 --> 11:34.000 It's just different colors with the light rendered 11:34.000 --> 11:36.000 in open-free the engine. 11:36.000 --> 11:38.000 We are changing the intensity. 11:38.000 --> 11:42.000 So for two stats with the implementation, 11:42.000 --> 11:44.000 the only thing you need to do when you create your gem, 11:44.000 --> 11:48.000 that you can create either via a graphical user interface 11:48.000 --> 11:51.000 of open-free the engine or just with some scripts available 11:51.000 --> 11:54.000 within the engine, Python scripts. 11:54.000 --> 11:56.000 You get your new gem. 11:56.000 --> 11:59.000 You need to connect to rows two gem, 11:59.000 --> 12:01.000 so everything is available for you. 12:01.000 --> 12:03.000 All the goodies that are already implemented 12:03.000 --> 12:05.000 that are open source are available for you. 12:05.000 --> 12:10.000 Since open-free the engine is implemented in C++, 12:10.000 --> 12:13.000 but it's also available for iOS, Android and so on. 12:13.000 --> 12:16.000 The whole build system is, of course, a CMake, 12:16.000 --> 12:18.000 the most popular right now, I guess. 12:18.000 --> 12:20.000 And what you need to do if you want to connect 12:20.000 --> 12:22.000 to rows two gem additionally, 12:22.000 --> 12:26.000 you of course need to link to the library. 12:26.000 --> 12:28.000 That's built in the beforehand. 12:28.000 --> 12:31.000 Via CMake of rows two gem, 12:31.000 --> 12:37.000 we also let you connect to your rows two implementations. 12:37.000 --> 12:40.000 In this example, I'm not going to use any specific implementations 12:40.000 --> 12:43.000 other than standard messages and standard services. 12:43.000 --> 12:46.000 But as you can see, this magical command target depends 12:46.000 --> 12:50.000 on rows two packages would just do everything for you. 12:50.000 --> 12:52.000 And by doing everything for you, 12:52.000 --> 12:54.000 I mean that if you create your header, 12:54.000 --> 12:56.000 you can use includes, you know, 12:56.000 --> 12:59.000 from all the tutorials on rows two directly. 12:59.000 --> 13:01.000 Everything is available for you. 13:01.000 --> 13:02.000 Everything is there. 13:02.000 --> 13:04.000 This is a header of the component. 13:04.000 --> 13:07.000 I blurred out a bit because I didn't want to bother you 13:07.000 --> 13:11.000 with details that are automatically done by open-free the engine. 13:11.000 --> 13:14.000 But if we want to create a publisher, 13:14.000 --> 13:16.000 a subscriber and a service, 13:16.000 --> 13:20.000 the only thing we need to do is to include the headers, 13:20.000 --> 13:22.000 as we would do in any rows two package 13:22.000 --> 13:25.000 that we implement standalone from open-free the engine. 13:25.000 --> 13:27.000 And we would have to, of course, 13:27.000 --> 13:30.000 create or define at this point only. 13:30.000 --> 13:33.000 The service, the subscription, and the publisher. 13:33.000 --> 13:36.000 There is no difference between this code 13:36.000 --> 13:40.000 and between the tutorials on rows two documentation website, 13:40.000 --> 13:42.000 other than different names. 13:42.000 --> 13:45.000 In this code, in this example, 13:45.000 --> 13:50.000 I also connected my test component to tick bus 13:50.000 --> 13:53.000 to be able to answer to every tick in the simulation 13:53.000 --> 13:56.000 because I wanted to make it very simple. 13:56.000 --> 13:59.000 And I wanted to be sure that I publish a message 13:59.000 --> 14:01.000 on every tick of the simulator. 14:01.000 --> 14:05.000 And I created a helper method set lights intensity. 14:05.000 --> 14:07.000 And I connected to the entity with the lights. 14:07.000 --> 14:09.000 Because this is something I didn't mention. 14:09.000 --> 14:12.000 This simulator works in a way that you define objects, 14:12.000 --> 14:13.000 like entities. 14:13.000 --> 14:16.000 And those entities have some components, 14:16.000 --> 14:18.000 which might be, for example, a sensor, 14:18.000 --> 14:23.000 a texture, a collider, like in most of the simulators. 14:23.000 --> 14:26.000 For the code itself, 14:26.000 --> 14:30.000 we implement everything in the activate method. 14:30.000 --> 14:33.000 So, every time we activate this component, 14:33.000 --> 14:36.000 we want to have our publisher subscriber 14:36.000 --> 14:38.000 and the service ready. 14:38.000 --> 14:40.000 To start with service, first of all, 14:40.000 --> 14:42.000 I want to get access to rows two node. 14:42.000 --> 14:45.000 And rows two node is already in the system. 14:45.000 --> 14:47.000 After everything is linked with rows two gem, 14:47.000 --> 14:50.000 it's a single tone, it's available for you. 14:50.000 --> 14:54.000 And since we are not implementing stuff in Rust, 14:54.000 --> 14:56.000 as yesterday's presentation mentioned, 14:56.000 --> 14:58.000 we also need to check, of course, 14:58.000 --> 15:00.000 if there is no new pointer problem. 15:00.000 --> 15:03.000 We also try to get this basic component 15:03.000 --> 15:05.000 that I mentioned earlier, the frame component. 15:05.000 --> 15:08.000 And we want to get it to double check the namespace 15:08.000 --> 15:10.000 of our service that we create, 15:10.000 --> 15:13.000 because when we spawn 10 or 15 robots, 15:13.000 --> 15:16.000 we want to be sure that they get the proper namespaces 15:16.000 --> 15:20.000 and messages from different cameras can be observed separately. 15:20.000 --> 15:23.000 For creating the service itself, 15:23.000 --> 15:25.000 it doesn't differ from the code you know. 15:25.000 --> 15:28.000 So, we get a node and we create a service. 15:28.000 --> 15:30.000 The service here is very basic. 15:30.000 --> 15:33.000 So, we use the trigger, standard service trigger. 15:34.000 --> 15:36.000 We don't care, of course, about request, 15:36.000 --> 15:38.000 hands may be unused. 15:38.000 --> 15:40.000 We only care about response. 15:40.000 --> 15:41.000 And there are responses, of course, 15:41.000 --> 15:43.000 false, if we cannot set the light on, 15:43.000 --> 15:46.000 and true, in case of success. 15:46.000 --> 15:49.000 So, first, we check if the light entity is there, 15:49.000 --> 15:52.000 because we need this object with light. 15:52.000 --> 15:55.000 If the lights are not there, we cannot switch them on. 15:55.000 --> 15:58.000 So, we can give an extra hint to the user 15:58.000 --> 16:01.000 within the service response that the lights 16:01.000 --> 16:03.000 are not there in the scene. 16:03.000 --> 16:05.000 Other than that, we use the internal method 16:05.000 --> 16:08.000 set lights entity, intensity sorry, 16:08.000 --> 16:11.000 to change the light intensity. 16:11.000 --> 16:15.000 For subscriber and publisher, 16:15.000 --> 16:20.000 again, it stays unchanged when compared to any rows to package. 16:20.000 --> 16:24.000 So, we just use the node to create subscription. 16:24.000 --> 16:28.000 In this case, we will use float to give the defined, 16:28.000 --> 16:30.000 predefined intensity. 16:30.000 --> 16:34.000 And as you can see, we use this helper methods from rows to jam 16:34.000 --> 16:37.000 to get namespace to name of the topic. 16:37.000 --> 16:41.000 So, we get the namespace, we add the current topic setting. 16:41.000 --> 16:46.000 And we set the QOS, which also comes from the subscriber configuration. 16:46.000 --> 16:50.000 It's a nice tool that is already implemented there 16:50.000 --> 16:53.000 within rows to jam, that when you edit your objects 16:53.000 --> 16:55.000 in the editor of the simulation, 16:55.000 --> 17:00.000 you can just use the drop list to select the proper configuration of QOS 17:00.000 --> 17:02.000 and so on. 17:02.000 --> 17:06.000 So, this is just a callback that uses our internal helper 17:06.000 --> 17:08.000 method set light intensity. 17:08.000 --> 17:12.000 In case of publisher, what we do is just the same stuff, 17:12.000 --> 17:15.000 so taking the name and taking the QOS, 17:15.000 --> 17:17.000 and we create the publisher. 17:17.000 --> 17:19.000 Some are there down there in the code, 17:19.000 --> 17:22.000 when we implement the ontic method, 17:22.000 --> 17:25.000 on every tick we publish a message, 17:25.000 --> 17:32.000 we read the intensity of the light from the O3DE rendering bus. 17:32.000 --> 17:36.000 So, O3D works in the same way as most of the engine 17:36.000 --> 17:38.000 that most of the game engines, 17:38.000 --> 17:41.000 that it defines buses for communication, 17:41.000 --> 17:44.000 and you can communicate via those buses. 17:44.000 --> 17:47.000 You use the entity as the address, 17:47.000 --> 17:51.000 and you ask what is the light component 17:52.000 --> 17:54.000 within the entity, 17:54.000 --> 17:59.000 and what is the intensity of this light component within the given entity. 17:59.000 --> 18:02.000 We get the response that started in this current intensity, 18:02.000 --> 18:04.000 that was pretty fine to minus 100, 18:04.000 --> 18:08.000 just in case before we create a standard rows message 18:08.000 --> 18:11.000 float for T2, where we put the intensity, 18:11.000 --> 18:13.000 and we just publish this intensity. 18:13.000 --> 18:17.000 So, the code stays exactly the same as it will stay 18:17.000 --> 18:20.000 in a standalone rows package, 18:20.000 --> 18:23.000 and from my perspective as a robotic developer, 18:23.000 --> 18:26.000 this is the biggest advantage of open 3D engine, 18:26.000 --> 18:28.000 that I have access to everything directly, 18:28.000 --> 18:31.000 there are no bridges, no man in the middle, 18:31.000 --> 18:35.000 so basically one component less to maintain. 18:35.000 --> 18:37.000 There is a bonus, 18:37.000 --> 18:41.000 because I mentioned that in open 3D engine, 18:41.000 --> 18:44.000 we can use C++, we can use Lua, 18:44.000 --> 18:47.000 to some extent it's also possible to use Python, 18:47.000 --> 18:49.000 but there is also something called script canvas, 18:49.000 --> 18:53.000 which is just an interface for drawing the pipelines of your choice. 18:53.000 --> 18:56.000 For example, you can on start of the graph, 18:56.000 --> 18:58.000 on start of the pipeline, 18:58.000 --> 19:00.000 when this script is initialized, 19:00.000 --> 19:03.000 we initialize the object that is responsible 19:03.000 --> 19:06.000 for triggering some messages once in a while, 19:06.000 --> 19:08.000 it's called hardbeat, 19:08.000 --> 19:12.000 and every 100 milliseconds on our pools, 19:12.000 --> 19:15.000 we will publish a message to Topic Hello, 19:15.000 --> 19:17.000 that is called Hello World. 19:17.000 --> 19:19.000 So with such a simple script, 19:19.000 --> 19:21.000 we don't even have to type C++ code, 19:21.000 --> 19:25.000 we can just get a script canvas and we can draw it. 19:25.000 --> 19:27.000 Very fast for prototyping, 19:27.000 --> 19:31.000 very fast for doing anything you want to do. 19:31.000 --> 19:34.000 Even when doing commercial products in my company, 19:34.000 --> 19:37.000 we use a lot of that because it's simple and fast. 19:37.000 --> 19:40.000 The same stuff can be done using Lua, 19:40.000 --> 19:44.000 with the only difference that this Lua one-liner publishes, 19:44.000 --> 19:47.000 the message once I didn't write the full loop here. 19:47.000 --> 19:51.000 So yeah, actually this is very, very brief presentation 19:51.000 --> 19:52.000 of Open3D Engine. 19:52.000 --> 19:54.000 I was afraid I would run out of time, 19:54.000 --> 19:59.000 but I recommend to have a look into it 19:59.000 --> 20:02.000 if you want to get nice rendering, 20:02.000 --> 20:04.000 if you want to get nice effects, 20:04.000 --> 20:07.000 because this is what Open3D Engine gives. 20:07.000 --> 20:12.000 And since I have one more minute or even two more minutes, 20:12.000 --> 20:17.000 I can show you a short video with a track 20:17.000 --> 20:21.000 going through the mine facility in Chile. 20:21.000 --> 20:24.000 This is a digital twin of huge mine facility. 20:24.000 --> 20:27.000 Maybe it's not perfectly visible when it's under the ground. 20:27.000 --> 20:29.000 We use it for simulation. 20:29.000 --> 20:33.000 We use that for our client to provide answers 20:33.000 --> 20:36.000 where the tracks should be in the mine. 20:36.000 --> 20:39.000 This is the demo from Roscon 2020 free. 20:40.000 --> 20:44.000 We did it to show that Open3D Engine can handle a lot. 20:44.000 --> 20:47.000 There are 12 robotic arms here. 20:47.000 --> 20:52.000 There are 56 AMRs all equipped with LiDAR sensors 20:52.000 --> 20:54.000 and camera sensors. 20:54.000 --> 20:59.000 So there are 72 LiDAR's more than 50 cameras in the scene 20:59.000 --> 21:02.000 and it works on my notebook in a real time. 21:02.000 --> 21:03.000 This is another demo. 21:03.000 --> 21:04.000 Okay, those are recordings, 21:04.000 --> 21:07.000 but it could work on my notebook in real time. 21:08.000 --> 21:11.000 The agricultural demo, the demo with some robots, 21:11.000 --> 21:13.000 I decided to show you this video. 21:13.000 --> 21:16.000 Mainly to show you the quality of the rendering. 21:16.000 --> 21:20.000 Of course, you cannot see it well in the screen, 21:20.000 --> 21:23.000 but displaying it in a 4K screen, 21:23.000 --> 21:25.000 having all this data at the same time 21:25.000 --> 21:27.000 and running it on notebook. 21:27.000 --> 21:29.000 Okay, with Nvidia graphic card, of course, 21:29.000 --> 21:33.000 but still notebook, it's still very, very cool. 21:33.000 --> 21:35.000 So yeah, I guess that's all. 21:35.000 --> 21:36.000 I will go back. 21:37.000 --> 21:38.000 Thank you. 21:54.000 --> 21:55.000 Hi. 21:55.000 --> 21:57.000 I just wanted to ask, 21:57.000 --> 21:59.000 because one of the biggest reasons 21:59.000 --> 22:02.000 are sometimes in industry 22:03.000 --> 22:06.000 people choose to use game engines instead of a zebra, 22:06.000 --> 22:09.000 for example, not because of the simulation of the robot, 22:09.000 --> 22:13.000 but because if you want to do highly dynamic environments, 22:13.000 --> 22:16.000 it's an absolute pain to do that in a zebra. 22:16.000 --> 22:20.000 So I wanted to ask how easy it is to, for example, 22:20.000 --> 22:23.000 add tons of actors, moving parts, 22:23.000 --> 22:28.000 things flying around, things that add the simulation in. 22:28.000 --> 22:31.000 It's perfectly doable. 22:31.000 --> 22:35.000 We have it in our simulators for our clients. 22:35.000 --> 22:38.000 Some parts are available, open source, 22:38.000 --> 22:40.000 some parts, unfortunately, 22:40.000 --> 22:43.000 we need to hide behind the paywall. 22:43.000 --> 22:47.000 We have levels maybe made for agriculture, 22:47.000 --> 22:51.000 where we have more than 100 people walking around 22:51.000 --> 22:56.000 and automated way with all the robots moving between them. 22:56.000 --> 23:01.000 We simulate different weather with rain, snow, 23:01.000 --> 23:04.000 and other things falling from the sky. 23:04.000 --> 23:05.000 We simulate fogs. 23:05.000 --> 23:08.000 Everything is possible with open 3D engine. 23:08.000 --> 23:10.000 I'm not saying it's easy. 23:10.000 --> 23:12.000 I'm saying it's doable. 23:12.000 --> 23:15.000 And I don't know other game engines, 23:15.000 --> 23:17.000 but as a C++ person, 23:17.000 --> 23:21.000 for me implementing staff and open 3D engine is easier 23:21.000 --> 23:22.000 than for example, new unity. 23:22.000 --> 23:25.000 I don't have comparison with Unreal at all. 23:25.000 --> 23:27.000 But only with unity. 23:27.000 --> 23:30.000 We also did many things for 23:30.000 --> 23:33.000 outdoor foundation with unity. 23:33.000 --> 23:36.000 Simulating the city, my company is responsible 23:36.000 --> 23:39.000 for digital twins of Japanese cities. 23:39.000 --> 23:42.000 And we are porting that to open 3D engine 23:42.000 --> 23:46.000 and it looks way better and it works much faster than any unity. 23:49.000 --> 23:50.000 Hello, Jan. 23:50.000 --> 23:52.000 Thank you for your presentation. 23:52.000 --> 23:57.000 Do you have any plans on integration with the drone code stack? 23:57.000 --> 24:00.000 We don't have drones, 24:00.000 --> 24:05.000 or the objects that are just moving on splines in the sky. 24:05.000 --> 24:10.000 This is the biggest missing point of open 3D engine. 24:10.000 --> 24:13.000 There is no wind, no water simulation. 24:13.000 --> 24:16.000 So unless you simulate it yourself, 24:16.000 --> 24:20.000 what we did in one small project was, as I said, 24:20.000 --> 24:25.000 it was just an object that was moving on a spline 24:25.000 --> 24:27.000 with some additional noise to it. 24:27.000 --> 24:29.000 But we didn't have anything more than that. 24:29.000 --> 24:33.000 So you're not planning to integrate it with PX4. 24:33.000 --> 24:35.000 For the moment, 24:35.000 --> 24:38.000 we don't have projects like that with clients. 24:38.000 --> 24:42.000 And this is how we roll and how we try to support the open source community 24:42.000 --> 24:47.000 that we always do projects that can give us some money to live. 24:47.000 --> 24:50.000 And we try to publish as much code open source as possible. 24:50.000 --> 24:53.000 So as long as we don't get any projects, 24:53.000 --> 24:55.000 we won't have the capacity for that. 24:55.000 --> 24:57.000 But of course, it's open-source. 24:57.000 --> 24:58.000 We are invited to help us. 24:58.000 --> 25:02.000 And then maybe we will get someone to help you. 25:04.000 --> 25:07.000 Thank you, Jan, for the wonderful presentation. 25:07.000 --> 25:12.000 Since I just started to mention the AI and similar stuff, 25:13.000 --> 25:18.000 would this, did you ever try or would this be able to handle, 25:18.000 --> 25:24.000 I don't know, some really fast image object classification or object acquisition? 25:24.000 --> 25:27.000 Because I see it can be used there. 25:27.000 --> 25:30.000 So this is just a simulator. 25:30.000 --> 25:33.000 And what happens here is that we produce objects. 25:33.000 --> 25:35.000 Sorry, we produce images. 25:35.000 --> 25:39.000 And those are the images that you can analyze outside. 25:39.000 --> 25:43.000 You can get those images the simplest way would be via rows two topics. 25:43.000 --> 25:45.000 And then you can do it outside. 25:45.000 --> 25:49.000 You can send the response back what you detected was happening there. 25:49.000 --> 25:54.000 You can also integrate this into the code base of open 3D engine. 25:54.000 --> 26:00.000 This is one of the core parts of money actually to generate images for machine learning 26:00.000 --> 26:03.000 training and verifications and validation. 26:04.000 --> 26:07.000 Really realistic for that. 26:07.000 --> 26:09.000 Thank you, thank you for the response. 26:09.000 --> 26:14.000 And just to say this might be a really good alternative for my club's plugin 26:14.000 --> 26:15.000 for Unreal Engine. 26:15.000 --> 26:16.000 This could change it. 26:16.000 --> 26:19.000 And the pictures look even nicer than there. 26:19.000 --> 26:21.000 Thank you very much. 26:21.000 --> 26:26.000 I believe there is still a gap between Unreal and open 3D engine. 26:26.000 --> 26:29.000 But the nice thing is that here you get the source code. 26:29.000 --> 26:30.000 You can change anything you want. 26:30.000 --> 26:31.000 And just to your needs. 26:31.000 --> 26:36.000 And then if possible, if the customer allows you publish it. 26:36.000 --> 26:38.000 So to the community. 26:38.000 --> 26:42.000 The predefined objects looks most nicer than the five objects. 26:42.000 --> 26:43.000 Okay. 26:43.000 --> 26:44.000 Very good. 26:44.000 --> 26:45.000 Thank you. 26:45.000 --> 26:46.000 Okay. 26:46.000 --> 26:48.000 Thank you. 26:48.000 --> 26:50.000 Thank you. 26:50.000 --> 26:51.000 Thank you.