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.

