-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTCC.tex
1565 lines (1353 loc) · 73.9 KB
/
TCC.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
% Meta-monografia de exemplo genérico de uso da classe delaetex.cls
% Copyright (C) 2004..2016 Walter Fetter Lages <[email protected]>
%
% This file was adapted from:
% Meta-monografia de exemplo genérico de uso da classe deletex.cls
% Copyright (C) 2004 Walter Fetter Lages <[email protected]>
%
% This is free software, distributed under the GNU GPL; please take
% a look in `deletex.cls' to see complete information on using, copying
% and redistributing these files
%
%\documentclass[repeatfields,openright,overleaf,nomicrotype]{tcc}
% LTeX: language=pt-BR
\documentclass[repeatfields,xlists,xpacks,oneside,yearsonly]{ufrgscca}
\graphicspath{{./img/}}
\usepackage{fancybox}
\usepackage{subcaption}
\addbibresource{TCC.bib}
\usepackage[disable]{todonotes}
\usepackage{tabularx}
\usepackage{float}
\setlength{\marginparwidth}{2cm}
\begin{document}
\maketitle
% dedicatória é opcional
%\notoc\chapter{Dedicatória} %não vai aparecer no sumário
% agradecimentos são opcionais
%\notoc\chapter{Agradecimentos}
% Agradeço ao \LaTeX\ por não ter vírus de macro\ldots
% resumo no idioma do documento
\begin{abstract}
O presente trabalho apresenta um sistema de navegação autônoma,
aplicado no robô móvel Twil. Aproveitando o desenvolvimento de
trabalhos anteriores, este sistema foi estendido, com adição do
mapeamento do espaço onde o robô se movimenta. O mapa criado é
utilizado para aprimorar a estimativa de posição do robô, e para
replanejar trajetos em tempo real, evitando colisões. Isto foi
realizado com auxílio de ferramentas do ROS 2, como a biblioteca de
navegação autônoma \textit{Navigation2} e pacotes que incorporam
técnicas de mapeamento e localização simultâneas. O desempenho dos
sistemas desenvolvidos foi avaliado através de testes em um ambiente
simulado, com gráficos medindo a estimativa de posição, comparação do
mapa obtido com o mapa real, e análise qualitativa do planejador de
trajetórias.
\end{abstract}
% resumo no outro idioma
% como parâmetro devem ser passadas as palavras-chave
% no outro idioma, separadas por vírgulas
\begin{otherabstract}{Mobile robotics, autonomous navigation, simultaneous localization and mapping}
This paper presents an autonomous navigation system, applied to the
Twil mobile robot. Taking advantage of the development of previous
works, this system was extended, with the addition of mapping of the
space in which the robot navigates. The generated map is used to
improve the robot's pose estimation, and to replan trajectories in
real time, avoiding collisions. This was done with the aid of tools
made for ROS 2, such as the \textit{Navigation2} navigation framework
and packages that perform simultaneous mapping and localization. The
performance of the developed systems was evaluated through tests in a
simulated environment, with graphs measuring the estimated position,
comparison of the obtained map with the real map, and qualitative
analysis of the path planner.
\end{otherabstract}
% sumario
\setcounter{tocdepth}{3}
% lista de ilustrações
\listoffigures
% lista de tabelas
\listoftables
% lista de listagens (código fonte)
%\listofcodelist %% doesn't work on overleaf
% lista de abreviaturas e siglas
% o parametro deve ser a abreviatura mais longa
\begin{listofabbrv}{PPGEE}
\item[BT] \textit{Behavior Tree} (árvore de Comportamento)
\item[RGB-D] \textit{Red Green Blue - Depth} (vermelho verde azul -
profundidade)
\item[ROS] \textit{Robot Operating System} (sistema operacional de robôs)
\item[SLAM] \textit{Simultaneous Localization and Mapping} (localização e
mapeamento simultâneos)
\item[UFRGS] Universidade Federal do Rio Grande do Sul
\end{listofabbrv}
% lista de símbolos é opcional
% \begin{listofsymbols}{$\alpha\beta\pi\omega$}
% \end{listofsymbols}
\tableofcontents
\chapter{Introdução}
A robótica deve seu maior sucesso à indústria de manufatura, onde são
utilizados principalmente robôs
manipuladores~\cite{IntroductionToMobileRobots}. Porém, esses robôs
têm como limitação sua mobilidade, incapazes de se movimentar pela
planta, restringindo suas tarefas a um espaço fixo. Um robô móvel,
por outro lado, é capaz de se mover pelo seu ambiente de trabalho,
aumentando a gama de tarefas que podem ser realizadas.
O mercado desta categoria de robô está em crescimento, como mostra a
Figura~\ref{fig:mercado_robo}. Estes robôs podem ser utilizados em
ambientes internos, como hospitais, fábricas ou em centros de
distribuição, como o Proteus, o primeiro robô autônomo da
Amazon~\cite{amazon_robot}. Eles têm como desafio a navegação em
espaços dinâmicos, muitas vezes compartilhados com humanos. Portanto,
é necessária a capacidade de perceber seu ambiente e replanejar sua
trajetória em tempo real, de modo a evitar colisões.
\todo[inline]{Laranja disse que esta parte ficou meio enrolada}
\begin{figure}[h]
{
\centering
\caption{Mercado global de robôs autônomos de 2016 a 2021, com projeção até 2028.}
\label{fig:mercado_robo}
\includegraphics[width=0.75\textwidth]{mercado_robo}\\
}
{\sourcecitation{\textcite{robot_market}.}}
\end{figure}
É neste contexto que se insere o projeto atual.
Utilizando o robô Twil, representado na Figura \ref{fig:robo_rviz},
propõe-se um sistema de navegação autônomo com sensores
que mapeiam o ambiente em conjunto com algoritmos de planejamento
de trajetórias, permitindo a navegação sem colisões em ambientes previamente
desconhecidos ou dinâmicos.
\todo{tentar separar essa frase em duas}
\begin{figure}[H]
{
\centering
\caption{Modelo do robô utilizado.}
\label{fig:robo_rviz}
\includegraphics[width=0.3\textwidth]{robo_rviz.png}\\
}
% {\sourcecitation{Autor.}}
\end{figure}
Este robô já foi utilizado em trabalhos de conclusão de curso
anteriores, como em \textcite{petry_tcc} e \textcite{rahul_tcc}.
Porém, devido ao avanço do campo da robótica, ferramentas utilizadas
nesses trabalhos foram substituídas por versões atualizadas. É o caso
do ROS 2, sucessor do ROS 1, que é uma coleção de bibliotecas e
ferramentas para desenvolvimento de robôs, e do \textit{Navigation
2}, um pacote para implementar navegação autônoma em robôs móveis,
que substituí o \textit{Navigation Stack} do ROS 1. Estas novas
versões aprimoram certos aspectos, como a segurança no caso do ROS, e
utilizam técnicas mais modernas, como o uso de árvores de
comportamento no \textit{Navigation 2}.
Neste trabalho, é dado seguimento ao desenvolvimento anterior no
Twil, a partir da adição e configuração de novos sensores, como a
câmera RGB-D Intel RealSense D435 e uma unidade de medida
inercial~(IMU). A câmera é responsável pela a percepção do ambiente,
que cria um mapa do ambiente, usado tanto na estimativa de posição do
robô, quanto no planejamento de trajetórias. A IMU, por sua vez, é
utilizado como um sensor auxiliar, que aprimora a odometria do robô
através de dados de orientação e velocidade angular do robô.
Como o mapeamento está presente em dois sistemas, cada um com
diferentes requisitos, foram criados dois mapas diferentes, um para o
planejamento de trajetórias, em forma de mapa de custo, e outro para
a localização do robô.
\chapter{Revisão da Literatura}
\label{revisao}
Neste capítulo são apresentadas as ferramentas e os conceitos
empregados na navegação autônoma de um robô móvel, com foco nas
técnicas presentes neste trabalho.
\section{Robot Operating System 2 (ROS 2)}
O ROS 2 é a segunda geração do Robot Operating System, um
\textit{framework} para desenvolvimento de robôs. Ele foi
desenvolvido a partir do zero para atender as necessidades de robôs
modernos, com suporte para customização extensiva. O seu
\textit{middleware}, \textit{Data Distribution Service}~(DDS), também
é usado em sistemas de infraestrutura crítica, como aplicações
militares, aeroespaciais e financeiras. Este padrão confere ao ROS
segurança e suporte para comunicação em tempo
real~\cite{ROS2Article}.
Um assunto relevante a este trabalho são os padrões de comunicação do
ROS 2. Existem três tipos de comunicação no ROS 2: \textit{topics},
\textit{services} e \textit{actions}. \textit{Topics} são canais de
comunicação unidirecionais, em que um nó, chamado de
\textit{publisher}, publica uma mensagem e outros nós, os
\textit{subscribers}, podem se inscrever no tópico publicado para
receber essa mensagem. \textit{Services} são um mecanismo do tipo
\textit{remote procedure call}~(RPC), em que um nó faz uma chamada a
outro nó, que executa uma computação e retorna um resultado,
funcionando como um cliente e um servidor.
\textit{Actions}, são utilizados para tarefas de longa duração, com possibilidade de
cancelamento prematuro.
O cliente começa a execução enviando uma requisição para o servidor,
que retorna periodicamente o estado atual da tarefa.
No término, é enviado o resultado, podendo ser sucesso ou falha.
Um exemplo de uso é uma tarefa de navegação em que um \textit{action client}
envia uma requisição com um ponto de destino para um \textit{action server}
que responde com realimentação contínua da posição atual do robô e
com o resultado ao finalizar a tarefa.
Eles também são apropriados para utilização em árvores de comportamento.
\section{Estimativa de posição de um robô móvel}
A terminologia e convenção dos sistemas de coordenadas de um robô
móvel utilizado neste trabalho é definido pela norma REP
105~\cite{rep_105}. Essa especificação define quatro sistemas de
coordenadas: \texttt{earth}, \texttt{map}, \texttt{odom} e
\texttt{base\_link}. Logo, a posição da base do robô, chamada de
\texttt{base\_link}, é definida através das transformações entre
esses sistemas de coordenadas, como mostra a Figura
\ref{fig:rep_105}.
\begin{figure}[H]
{
\centering
\caption{Relação entre os sistemas de coordenadas utilizados na localização de um robô móvel.}
\label{fig:rep_105}
\includegraphics[width=0.8\textwidth]{tf_rep_105.png}\\
}
{\sourcecitation{\textcite{rep_105}.}}
\end{figure}
O sistema de coordenadas chamado de \texttt{earth} serve como
referência global em aplicações com diversos mapas com interação de
robôs entre eles. Neste trabalho, o foco é em um único robô em um
único mapa, portanto, esse sistema de coordenadas não é utilizado.
Assim, a posição do robô móvel é definida através das transformadas
entre os sistemas de coordenadas \texttt{map}, \texttt{odom} e
\texttt{base\_link}. A transformada entre \texttt{map} e
\texttt{odom} é calculada pelo sistema de localização, enquanto que a
transformada entre \texttt{odom} e \texttt{base\_link} pelo sistema
de odometria.
\todo[inline]{
tenho que referenciar extensivamente isso nas duas seçoes seguintes
https://www.ece.ufrgs.br/~fetter/ele00070/mobrob/estimation.pdf}
\subsection{Odometria}
A odometria publica a pose do robô em relação ao sistema de
coordenadas \texttt{odom}. Essa posição pode divergir ao longo do
tempo, sem limites, porém deve ser contínua. Devido à essas
características, ela é útil para referência local, mas deve ser
complementada com outros sistemas para referência global.
Essa odometria é geralmente obtida através de sensores incrementais,
que estimam a posição e orientação do robô através da integração de
dados de velocidade ou aceleração e, portanto, acumulam erros ao
longo da distância percorrida, como é o caso de encoders das rodas.
Outros exemplos de fontes de odometria são Unidades de Medição
Inercial~(IMUs), que contém acelerômetros e giroscópios, e odometria
visual, que utilizam sensores óticos para estimar a velocidade do
robô através da diferença de dados sucessivos.
\todo[inline]{
explicaçao de odometria visual usando ransac(que o rtabmap odom usa)
que encontrei:
doi: 10.1109/IMTIC.2018.8467263 }
\subsection{Localização}
O sistema de localização é responsável por publicar a transformada
entre os sistemas de coordenadas \texttt{map} e \texttt{odom}, que
serve como um ajuste do erro da odometria. A estimativa de posição do
robô em relação ao \texttt{map} não deve divergir ao longo do tempo
significativamente, porém, essa coordenada não é continua e a posição
do robô pode mudar de forma abrupta em relação a ela. Portanto, essa
estimativa não precisa ser publicada a uma frequência tão alta quanto
a odometria.
Logo, sensores absolutos são ideais para esses sistemas, já que não
sofrem com erros de acumulação. Porém, sensores desse tipo geralmente
exigem processamento sofisticado, ocasionando um longo tempo entre
estimativas. Percebe-se que essas duas características são
semelhantes ao requisitos da publicação da transformada entre
\texttt{map} e \texttt{odom}.
Uma técnica comumente usada é a comparação de um mapa, obtido
previamente, com dados de sensores óticos. A localização por Monte
Carlo é uma das aplicações mais comuns desse sistema. Nela, os
estados possíveis do robô são representados por partículas, criando
uma distribuição de probabilidade. Com os dados da odometria e do
sensor ótico, o estado possível do robô é atualizado, sendo a
partícula com maior probabilidade escolhida como a estimativa de
posição do robô.
Porém, em situações em que não há conhecimento prévio do ambiente, é
necessário usar técnicas que realizam o mapeamento durante o
deslocamento do robô.
\section{Localização e Mapeamento Simultâneo (SLAM)}
Quando não há um mapa do ambiente obtido a priori, é preciso
construir o mapa durante a navegação. Nesse caso, técnicas de
localização e mapeamento simultâneo~(SLAM) são usadas.
Resolver o problema de SLAM envolve a estimação da trajetória do robô
e do mapa do ambiente enquanto o robô se desloca. Ao longo da
movimentação do robô em poses sequencias desconhecidas $x_{1:t} = {
x_1, x_2, ..., x_t }$ em uma mapa desconhecido $m$, são obtidas uma
sequência de odometrias $u_{1:t} = {u_1, u_2, ..., u_t}$ e
observações do ambiente $z_{1:t} = {z_1, z_2, ..., z_t}$. O problema
SLAM requer a obtenção da distribuição de probabilidades dada pela
Equação \ref{eq:slam_problem}, considerando que $x_0$ é a posição
inicial do robô~\cite{slam_tutorial_part_i}. Um modelo gráfico deste
problema, em forma de uma rede de Bayes dinâmica, está representado
na Figura \ref{fig:slam_algo}.
% citar o artigo tutorial slam
\begin{equation}
\label{eq:slam_problem}
p(x_{1:t}, m | z_{1:t}, u_{1:t}, x_0)
\end{equation}
\begin{figure}[h]
{
\centering
\caption{Modelo gráfico do problema do SLAM.}
\label{fig:slam_algo}
\includegraphics[width=0.8\textwidth]{graphic_slam_representation.png}\\
}
{\sourcecitation{\textcite{slam_tutorial_part_i}.}}
\end{figure}
Na literatura, uma variedade de soluções para esse problema estão
disponíveis. Dentre eles, destaca-se o método baseado em um grafo de
poses. O estado da arte atual, em relação a precisão e a velocidade
da estimativa, de sistemas SLAM utilizam técnicas com base nesse
método~\cite{graph_slam_tutorial}.
\subsection{SLAM baseado em grafo de poses}
A aplicação do grafo de poses para mapeamento e localização
geralmente consiste em quatro etapas: extração dos dados dos
sensores; construção do grafo de poses; procura de candidatos a
fechamento de laço; e otimização do grafo.
A construção do grafo de poses é feita utilizando os dados extraídos
dos sensores de odometria e percepção. Cada nó deste grafo consiste
na posição estimada do robô, dada pela odometria, com as informações
obtidas pelo sensor ótico, comumente em forma de \textit{features} da
imagem.
Após a adição de um nó, é feita a procura de candidatos para o
fechamento de laço, comparando os dados deste nó com de nós
desconectados, ou seja, nós que não foram criados recentemente na
mesma rota. Desta forma, é possível detectar quando o robô retorna a
uma posição já visitada anteriormente.
Finalmente, levando em contas as restrições obtidas na construção do
grafo, é realizada a otimização do caminho obtido, de forma a
diminuir o erro da estimativa de posição.
\subsection{Aplicações do SLAM no ROS}
Entre pacotes que implementam o SLAM baseado em grafos se destacam o
SLAM Toolbox e o Cartographer~\cite{slam_toolbox_art}. Porém, o
Cartographer foi descontinuado pelo Google e não é mais atualizado. O
SLAM Toolbox, por outro lado, foi escolhido como o pacote padrão de
SLAM para o ROS 2~\cite{slam_toolbox_ros_standard}, e oferece
diversas melhoras em relação a sistemas de SLAM anteriores, como o
GMapping, Karto, Hector e o próprio Cartographer.
Estes pacotes utilizam representações bidimensionais do ambiente,
sendo sensores baseados em \textit{scan} LASER a fonte de dado mais
comum~\cite{SensorAndSLAM}. Porém, com o avanço da tecnologia,
sensores Red Green Blue - Depth~(RGB-D) e câmeras estéreo estão se
tornando mais acessíveis, influenciando o desenvolvimento de sistemas
de Visual~SLAM~(VSLAM). Dentre sistemas de VSLAM, destacam-se o
ORB-SLAM3, OpenVSLAM e RTABMap, que possuem suporte a câmeras RGB-D e
permitem modos de localização pura.
Neste modo, também presente no SLAM Toolbox, a localização é feita
com um mapa base, obtido anteriormente, e com o estado atual do
ambiente. Divergências entre o ambiente e o mapa base são tratados
como obstáculos temporários, e não modificam permanentemente o mapa
original.
Em \textcite{VSLAM}, é feita uma comparação entre sistemas VSLAM,
mostrando que o OpenVSLAM é o pacote mais adequado para maioria dos
casos. Dos pacotes citados neste artigo, apenas o RTABMap continua
sendo desenvolvido ativamente, com suporte às versões mais recentes
do ROS 2. Porém, novos sistemas de VSLAM promissores estão sendo
desenvolvidos, como o NVidia Isaac ROS VSLAM e o StellaROS, que é um
sucessor do OpenVSLAM.
\section{Fusão de dados de sensores}
Robôs modernos estão cada vez equipados com mais sensores,
ocasionando em mais de uma fonte de dado para a mesma informação. Um
caso relevante neste trabalho, é a odometria do robô, que pode ser
estimada por diversos tipos de sensores, como IMU ou encoders de
roda, cada um com características diferentes. Ao invés de utilizar
apenas um sensor para estimar a odometria, os dados desses sensores,
munidos da informação de covariância do mesmo, podem ser fundidos
obtendo uma estimativa mais precisa. O filtro de Kalman, introduzido
em \textcite{KalmanFilter}, é um estimador linear recursivo,
comumente utilizado para aplicações deste tipo.
Um exemplo de aplicação deste filtro para estimativa de posição no
ROS 2 é o pacote
\texttt{robot\_localization}~\cite{robot_localization_paper}. Ele
permite um grande número de entrada de dados de sensores, e tem
suporte para diversos sensores, através da utilização de diferentes
tipos de mensagens do ROS. Além disso, é possível configurar os dados
que serão utilizados de cada sensor, podendo excluir os que não são
relevantes ou confiáveis do resultado final.
\section{Mapas de custo}
Um mapa de custo é uma representação de ambiente composta por uma
grade de células que contém um valor, variando de desconhecido,
livre, ocupado ou custo inflado.
Tradicionalmente, esses dados são armazenadas em mapas monolíticos,
para utilização em planejamento de trajetórias. Essa implementação é
aplicada com sucesso para caminhos curtos, mas pode apresentar
dificuldade em lidar com ambientes dinâmicos
maiores~\cite{latombeRobotMotionPlanning}.
Uma solução para este problema são mapas de custo com camadas, que
separam o processamento de dados em camadas semanticamente
distintas~\cite{layered_costmaps}. Esta separação permite a
utilização de diferentes fontes de dados, possibilitando, por
exemplo, atualizar o mapa com dados de sensores, sem modificar o
original. Outras camadas podem ser configuradas para evitar certas
áreas, manter uma distância segura de obstáculos ou para respeitar
regras culturais, como manter-se a direita em corredores. A Figura
\ref{fig:mapa_camadas} mostra uma configuração possível de camadas de
mapas de custo.
\begin{figure}[h]
{
\centering
\caption{Exemplo de configuração de camadas de um mapa de custo.}
\label{fig:mapa_camadas}
\includegraphics[width=0.5\textwidth]{mapa_camadas_trad.png}\\
}
{\sourcecitation{Adaptado de \textcite{layered_costmaps}.}}
\end{figure}
Entre essas camadas, três são essenciais para mapear ambientes
dinâmicos: a estática, a de obstáculos e a de inflação. A camada
estática tem o mapa base, que deve ter apenas obstáculos fixos, dessa
maneira, a trajetória planejada não será alterada em razão de objetos
inexistentes.
A camada de obstáculos é responsável por atualizar o mapa de custo
com obstáculos dinâmicos, através de dados de sensores óticos. Uma
opção dessa camada, é a camada \textit{voxel}, que utiliza uma
representação em três dimensões dos dados dos sensores, introduzida
em~\textcite{office_marathon}. Nesse caso, é utilizado um espaço
tridimensional, composto por blocos chamados de \textit{voxels}, que
indicam se o bloco está ocupado ou livre. Cada coluna deste campo é
então projetada em um mapa bidimensional, com o valor dependendo da
presença de \textit{voxels} ocupados na mesma. Isto permite ao robô
detectar obstáculos em diferentes alturas, atualizando o mapa apenas
para obstáculos que podem colidir com o robô.
A camada de inflação utiliza os dados das camadas abaixo dela para
criar uma zona de segurança entre os obstáculos. Essa zona tem
valores intermediários entre os valores de obstáculo e livre, criando
trajetórias seguras, mas que permitem que o robô passe próximo a
obstáculos, caso necessário.
\section{Navigation2}
O \textit{Navigation2}~(Nav2) é o sucessor do ROS \textit{navigation
stack}, permitindo a realização de tarefas complexas em diversos
ambientes e classes de robôs cinemáticos. Baseando-se no legado do
\textit{navigation stack} do ROS 1, o Nav2 foi construído em cima do
ROS2, implementando técnicas mais modernas para ter um sistema
modular propício para ambientes dinâmicos, e com suporte a uma maior
variedade de sensores~\cite{Nav2}.
Uma árvore de comportamento é utilizada para orquestrar as tarefas de
navegação, ativando os servidores de controle, planejamento e
recuperação para navegação. Para executar nós de \textit{actions},
são normalmente utilizados \textit{Action servers} do ROS 2. Esta
árvore de comportamento pode ser configurada pelo usuário através de
um arquivo em XML, permitindo a descrição de comportamentos de
navegação únicos sem necessidade de programação.
Na arquitetura, pode-se notar a utilização de dois mapas de custo, um
local e outro global. O local, utilizado no servidor do controlador,
realiza o planejamento a curto prazo e prevenção de colisão, enquanto
o global, aplicado no servidor de planejamento, é usado
principalmente para planejamento a longo prazo.
\chapter{Metodologia}
\label{desenvolvimento}
O sistema de navegação do Twil foi desenvolvido utilizando a versão
Humble do ROS 2 e com auxílio de ferramentas suportadas por esta
versão. Dentre as ferramentas utilizadas, destacam-se o Gazebo,
utilizado para simulação do robô, e o \textit{Navigation2}, que
fornece diversas ferramentas para implementar e orquestrar um sistema
de navegação autônoma.
Os variados componentes do robô, como os sensores empregados neste
trabalho, foram implementados através de \textit{plugins} do Gazebo,
que comunicam o estado do robô durante a simulação através de tópicos
do ROS 2. A câmera RGB-D Intel RealSense D435, utilizada para o o
mapeamento do ambiente, foco deste trabalho, foi implementada dessa
forma.
O \textit{Navigation2} é encarregado de enviar comandos de velocidade
para o robô, para que ele chegue ao destino desejado de modo seguro,
evitando colisões. Sua arquitetura está representada na Figura
\ref{fig:nav2_arc}. As setas à esquerda da imagem representam as
entradas necessárias do sistema, como a estimativa de posição do
robô, representadas pela seta TF, em forma de transformadas sistemas
de coordenadas conforme o REP-105~\cite{rep_105}, além do mapa e dos
dados dos sensores, que são utilizados para o planejamento de
trajetórias.
\begin{figure}[H]
{
\centering
\caption{Arquitetura do \textit{Navigation2}.}
\label{fig:nav2_arc}
\includegraphics[width=0.8\textwidth]{nav2_architecture_trad.png}\\
}
{\sourcecitation{Adaptado de \textcite{nav2_site}.}}
\end{figure}
O servidor do planejador é responsável pela criação de trajetórias
usando a representação do ambiente em forma de um mapa de custo.
Utilizando essa trajetória como referência, e comparando a estimativa
de posição do robô, o servidor do controlador gera comandos de
velocidade para o robô, que é a saída do \textit{Nav2}.
Antes do início deste trabalho, o Twil já estava configurado para
utilizar o \textit{Nav2}, porém sem utilizar dados da câmera e IMU.
Portanto, as trajetórias planejadas não eram atualizadas a fim de
evitar obstáculos, além de não haver sistema de localização, ou seja,
a transformada entre \texttt{map} e \texttt{odom} era estática, sem
ajuste da odometria implementada.
Em razão disso, foi adicionada a câmera RGB-D Intel RealSense D435 e
um IMU ao robô, e o sistema de navegação foi aprimorado com a
utilização desses sensores nos componentes de odometria, localização
e mapeamento.
Um diagrama simplificado da arquitetura do sistema desenvolvido neste
trabalho é mostrado na Figura \ref{fig:arq_trabalho}. O
desenvolvimento atual foi focado nos blocos em vermelho, que realizam
o mapeamento do ambiente, e blocos em verde, que estimam a posição do
robô. O bloco em azul, que representa as outras ferramentas do
\textit{Nav2}, e o controlador em marrom, que transforma os comandos
de velocidade em comandos para as rodas do robô, já estavam
configurados.
Os componentes de mapeamento criam duas representações do ambiente.
Um mapa criado é o utilizado no planejamento de trajetórias, em forma
de mapa de custo, onde foi adicionada uma camada para percepção de
obstáculos utilizando a câmera RGB-D. Além disso, foi realizada a
calibração da camada de inflação, para produzir caminhos mais
seguros. O segundo mapa é criado e utilizado pelos sistemas de
localização e mapeamento simultâneo~(SLAM), adicionados ao Twil.
Em verde, estão os componentes referentes à estimativa de posição do
robô, onde foram adicionados pacotes que realizam a odometria visual
e pacotes de SLAM. Também, aprimorou-se a odometria das rodas,
através da fusão de dados com o sensor IMU. Ademais, para realização
de testes, se manteve a opção de utilizar a transformada estática
entre \texttt{map} e \texttt{odom}, e foi adicionado um sistema de
odometria utilizando a posição exata do robô no Gazebo.
\begin{figure}[H]
{
\centering
\caption{Arquitetura do simplificada do sistema desenvolvido.}
\label{fig:arq_trabalho}
\includegraphics[width=0.98\textwidth]{arquitetura_simplificadav4.png}\\
}
% {\sourcecitation{Autor.}}
\end{figure}
Nas seções seguintes, é apresentado o robô e o ambiente de testes
utilizado neste trabalho. Em seguida, é detalhado o desenvolvimento
dos sistemas necessários para a navegação autônoma do robô neste
ambiente. Finalmente, é descrita a coleta de dados para a análise dos
resultados, que é apresentada no próximo capítulo.
\section{Configuração do robô}
O modelo do robô está presente no pacote \texttt{twil\_description},
que contém os arquivos de descrição do robô no formato XACRO, que é
expandido para o formato URDF, utilizado pelo nodo
\texttt{robot\_state\_publisher}, que publica essa descrição em um
tópico. Esse modelo é utilizado no rviz para visualização do robô,
como representado na Figura \ref{fig:robo_rviz}, e no Gazebo, para
simulação. Os componentes físicos do robô, como sensores e atuadores,
são criados a partir de \textit{plugins} do Gazebo, também presentes
no arquivo de descrição.
Durante este trabalho, foram configurados dois novos componentes ao
robô, a câmera RGB-D Intel RealSense D435 e um IMU. A câmera está
presente nos sistemas de odometria, localização e mapeamento,
enquanto o IMU foi usado como suplemento ao sistemas de odometria,
fornecendo dados de orientação do robô para fusão de dados.
Para utilização da câmera, é necessário o pacote
\texttt{realsense-ros}~\cite{realsense_ros}, que contém o modelo da
câmera. O \textit{plugin} do Gazebo \texttt{camera\_plugin}, é
responsável pela publicação dos dados da câmera simulada. Cinco
tópicos são responsáveis por estes dados: dois tópicos publicam as
imagens não comprimidas, uma RGB e outra de profundidade; dois
tópicos com informações suplementares destas imagens; e um tópico com
a nuvem de pontos produzida pela câmera.
A adição do IMU foi feita utilizando o \textit{plugin}
\texttt{GazeboRosImuSensor}, que publica mensagens do tipo
\texttt{sensor\_msgs/Imu}. Essas mensagens contêm a orientação,
velocidade angular e aceleração linear do robô. Por si só, o IMU não
é confiável para estimar a posição do robô porque necessita integrar
a aceleração linear duas vezes para calcular a posição e, portanto, é
muito suscetível a erros de acumulação. Porém, os dados referentes a
orientação e velocidade angular, podem complementar as outras fontes
de odometria, através da fusão de dados. Para representar fisicamente
o IMU no robô, foi reutilizada a descrição de uma placa de circuito
impresso \textit{Eurocard}, que também representa outros componentes
do robô.
A atuação das rodas do robô, a partir dos comandos de velocidade
produzidos pelo \textit{Nav2}, é feita por controladores configurados
no pacote \texttt{twil\_bringup}. Diversos deles estão disponíveis
para uso com o Twil, porém o controlador
\textit{twist\_mrac\_controller}, do pacote
\texttt{linearizing\_controllers} foi o escolhido e integrado ao
\textit{Nav2} em trabalhos anteriores.
\section{Ambiente de simulação}
O sistema foi testado em uma simulação do prédio Centenário da Escola
de Engenharia da UFRGS, utilizando o Gazebo. No pacote
\texttt{ufrgs\_map} está incluído uma representação em formato PGM da
planta do prédio, mostrada na Figura \ref{fig:planta_centenario},
desenvolvida em~\textcite{petry_tcc}. Além da imagem da planta,
também está presente um arquivo de configuração em formato YAML, que
contém a resolução e a origem do mapa. Este arquivo ainda contém
parâmetros para utilização como mapa de custo, indicando a faixa de
valores para considerar uma célula como livre ou ocupada.
\begin{figure}[H]
{
\centering
\caption{Planta do 1º andar do prédio Centenário da EE-UFRGS.}
\label{fig:planta_centenario}
\includegraphics[width=0.7\textwidth]{centenario_floor_plan.png}\\
}
{\sourcecitation{\textcite{petry_tcc}.}}
\end{figure}
O pacote \texttt{ufrgs\_gazebo} contém arquivos de mundos do Gazebo
para simulação. Ele, porém, estava desatualizado e não continha uma
representação completa do prédio Centenário. Utilizando o
\textit{Building Editor} do Gazebo, foi criado um modelo simplificado
do prédio em 3D, com base na sua planta, mostrado na Figura
\ref{fig:gazebo_centenario}.
\begin{figure}[h]
{
\centering
\caption{Ambiente Gazebo com modelo do prédio Centenário da EE-UFRGS.}
\label{fig:gazebo_centenario}
\includegraphics[width=0.95\textwidth]{gazebo.png}\\
}
% {\sourcecitation{Autor.}}
\end{figure}
Não foram adicionados os obstáculos representados em cinza claro da
planta da Figura \ref{fig:planta_centenario}, que não são obstáculos
fixos. Para teste com obstáculos dinâmicos ou temporários são
adicionados novos objetos a este mundo durante a execução da
simulação no Gazebo.
\section{Estimativa de posição do robô}
\label{bib:estimativa_posicao}
A estimativa de posição é feita utilizando o sistemas de coordenadas
definido pela norma REP 105, conforme descrito na
Seção~\ref{bib:estimativa_posicao}. Portanto, a pose do robô é
estimada por dois sistemas, o de odometria e de localização.
\subsection{Odometria}
\label{met:odometria}
O sistema de odometria é responsável pela publicação da transformada
entre o sistema de coordenadas \texttt{odom} e \texttt{base\_link},
utilizando sensores incrementais.
Neste trabalho, foram utilizados e comparados três sistemas de
odometria, que além da transformada, também publicam mensagens do
tipo \texttt{nav\_msgs/Odometry} no tópico \texttt{/odom}. Antes
deste trabalho, a odometria era publicada apenas pelo controlador,
através do pacote \texttt{twist\_mrac\_controller}, utilizando dados
do encoder nas rodas para estimar a posição do robô. O cálculo da
posição é feito pelo pacote \texttt{arc\_odometry}, que utiliza o
modelo cinemático de um robô móvel de acionamento diferencial para
estimar a posição e orientação do robô a partir das rotação das
rodas. Para aprimorar a qualidade desta odometria, foi adicionado o
pacote \texttt{robot\_localization}, que realiza a fusão de dados da
odometria das rodas com os dados do IMU.
A fusão é realizada através de um filtro de Kalman estendido, onde
devem ser escolhidos quais dados dos sensores devem ser considerados.
Os criadores do pacote \texttt{robot\_localization} recomendam não
utilizar dados de posição da odometria das rodas. Dessa forma, a
posição é calculada pelo mesmo pacote a partir dos dados obtidos pela
fusão das velocidades fornecidas ao pacote. Quando são fornecidas
estimativas de posição, não é realizado o cálculo a partir da
velocidade, sendo usado apenas a fusão dos dados de posição.
Apesar disso, decidiu-se utilizar tanto a posição quanto a velocidade
na fusão de dados, que faz com que a pose publicada pelo pacote seja
igual a estimada pelo \texttt{arc\_odometry}, já que o IMU não
fornece dados de posição. Isso foi feito porque a velocidade obtida
pelo \texttt{arc\_odometry} é dada em referência ao sistema de
coordenadas global, ou seja, o \texttt{odom}, enquanto que o
\texttt{robot\_localization} espera que a velocidade seja em
referência a base do robô. Portanto, o \texttt{robot\_localization}
não é capaz de estimar corretamente a posição do robô com base na
velocidade publicada pelo \texttt{arc\_odometry} sem um nodo
adicional para conversão.
A velocidade angular e orientação, por outro lado, foram fundidas com
os dados do IMU, que fornece uma estimativa mais precisa destes
campos.
Como alternativa a este sistema, foi implementado um sistema de
odometria visual, publicado pelo executável \texttt{rgbd\_odometry}
do pacote \texttt{rtabmap\_odom}, que utiliza imagens da câmera RGB-D
com auxílio do sensor IMU para estimava da posição. Com a informação
de profundidade, são comparadas \textit{features} visuais entre
imagens consecutivas, a velocidade do robô é estimada com um
algoritmo baseado em \textit{Random Sample
Consensus}~(RANSAC)~\cite{rtabmap_odom}.
É possível fundir os dados destes dois sistemas de odometria,
porém, optou-se primeiramente por mantê-los separados para realizar a comparação
do desempenho entre eles. Caso ambos sistemas tenham desempenhos satisfatórios,
a fusão de dados pode fornecer um resultado mais preciso.
Finalmente, para realização de testes, foi implementado um sistema de
odometria com a posição real do robô no Gazebo. O \textit{plugin}
P3D, publica uma mensagem do tipo \texttt{nav\_msgs/Odometry} com a
posição do robô em relação ao sistema de coordenadas \texttt{odom}.
Quando este sistema de odometria é selecionado, as informações do P3D
são retransmitidas no tópico \texttt{/odom} e o pacote
\texttt{odom\_to\_tf\_ros2} publica a transformada entre
\texttt{odom} e \texttt{base\_link} a partir destes dados.
Os sistemas de odometria utilizados estão resumidos na Tabela
\ref{tab:odometria}, onde é indicado o pacote, a fonte de dados e o
tipo de mensagem recebido por cada um.
\begin{table}[H]
\begin{center}
\caption{Sistemas de odometria}
\label{tab:odometria}
% a fonte de dados ficou "Rodas" na primeira linha porque encoder das rodas nao coube
\small
\begin{tabularx}{\linewidth}{c|c|c|c}
Pacote utilizado & Fonte de dados & Tópico & Tipo da mensagem \\
\hline
\multirow{2}{*}{\texttt{robot\_localization}} & Rodas & \texttt{/controller/odom} & \texttt{nav\_msgs/Odometry} \\
& IMU & \texttt{/sensor/imu} & \texttt{sensor\_msgs/Imu} \\
\hline
\multirow{5}{*}{\texttt{rtabmap\_odom}} & \multirow{4}{*}{Câmera} & \texttt{/depth/image\_raw} & \texttt{sensor\_msgs/Image} \\
& & \texttt{/depth/camera\_info} & \texttt{sensor\_msgs/CameraInfo} \\
& & \texttt{/color/image\_raw} & \texttt{sensor\_msgs/Image} \\
& & \texttt{/color/camera\_info} & \texttt{sensor\_msgs/CameraInfo} \\
& IMU & \texttt{/sensor/imu} & \texttt{sensor\_msgs/Imu} \\
\hline
\texttt{odom\_to\_tf\_ros2} & Gazebo & \texttt{/fake\_odom} & \texttt{nav\_msgs/Odometry} \\
\end{tabularx}
\end{center}
% {\sourcecitation{Autor}}
\end{table}
\subsection{Localização}
\label{met:localizacao}
O sistema de localização, por outro lado, publica esporadicamente a
transformada entre o sistema de coordenadas \texttt{map} e
\texttt{odom}, para ajustar os erros de divergência da odometria,
através de sensores absolutos.
Anteriormente, não era utilizado nenhum sensor para localização do
robô, e a transformada entre \texttt{map} e \texttt{odom} era
estática, causando divergência na estimativa de posição durante a
navegação. Este sistema foi mantido para testes, porém foram
implementados dois sistemas de localização baseados em localização e
mapeamento simultâneos~(SLAM), utilizando a câmera RGB-D Intel
RealSense D435, para melhorar a estimativa de posição do robô
publicada pela odometria.
Uma alternativa à sistemas SLAM é o \texttt{nav2\_amcl}, que utiliza
localização por Monte Carlo em um mapa construído previamente, que
poderia ser a planta do prédio, para estimar a posição do robô.
Porém, essa opção foi descartada, pois o robô deve ser capaz de
navegar em ambiente dinâmicos ou pouco conhecidos, onde um mapa
estático não seria adequado. Além disso, esse pacote só é compatível
com representações bidimensionais do ambiente, que causaria problemas
na detecção de objetos tridimensionais, como as escadas, agravando as
divergências que já existem entre o ambiente do Gazebo e a planta.
Os dois sistemas de SLAM utilizados foram o \texttt{slam\_toolbox} e
o \texttt{rtabmap\_slam}, resumidos na Tabela \ref{tab:localizacao}.
\begin{table}[H]
\begin{center}
\caption{Sistemas de localização}
\label{tab:localizacao}
\small
\begin{tabularx}{\linewidth}{c|c|c|c}
Pacote utilizado & Fonte de dados & Tópico & Tipo de mensagem recebida \\
\hline
\texttt{slam\_toolbox} & Câmera & \texttt{/depth/image\_scan} & \texttt{sensor\_msgs/LaserScan} \\
\hline
\multirow{4}{*}{\texttt{rtabmap\_slam}} & \multirow{4}{*}{Câmera} & \texttt{/depth/image\_raw} & \texttt{sensor\_msgs/Image} \\
& & \texttt{/depth/camera\_info} & \texttt{sensor\_msgs/CameraInfo} \\
& & \texttt{/color/image\_raw} & \texttt{sensor\_msgs/Image} \\
& & \texttt{/color/camera\_info} & \texttt{sensor\_msgs/CameraInfo} \\
\end{tabularx}
\end{center}
\end{table}
O \textit{slam\_toolbox}, realiza o SLAM em 2D e foi criado para
utilizar sensores a laser. Portanto, são esperadas mensagens do tipo
\texttt{sensor\_msgs/LaserScan} para percepção do ambiente neste
sistema. Como a câmera RGB-D não publica mensagens desse tipo, o
pacote \texttt{depthimage\_to\_laserscan} foi usado para converter a
imagem de profundidade da câmera na mensagem esperada, em forma de um
feixe de luz em duas dimensões localizado na altura da câmera. O
\textit{rtabmap}, por outro lado, realiza o SLAM em 3D e aproveita
todos os tópicos publicados pela câmera RGB-D, não necessitando de
conversão de mensagens.
Ambos sistemas publicam a transformada entre \texttt{map} e
\texttt{odom}, além da posição global do robô no tópico
\texttt{/pose}, em mensagens do tipo
\texttt{geometry\_msgs/PoseWithCovarianceStamped}, que são utilizadas
para comparação com a posição real e a estimada pela odometria.
Apesar de realizar o mapeamento do ambiente em tempo-real, esses
sistemas podem ser iniciados com informações de uma sessão prévia de
mapeamento, que pode aumentar a precisão da localização, caso o mapa
seja mais fiel que o construído. Porém, nos testes realizados, a
sessão de SLAM foi iniciada do zero, para simular um ambiente
desconhecido.
\section{Mapeamento}
O mapeamento é um aspecto essencial para a navegação autônoma. Ele é
utilizado tanto no planejador de trajetórias, para perceber e evitar
obstáculos dinâmicos, quanto no sistema de localização do robô, para
estimar a posição do robô no ambiente.
% O mesmo mapa poderia ser
% utilizado para ambos sistemas, porém, devido a diferentes
% necessidades de cada sistema, optou-se criar dois mapas do ambiente,
% o mapa de custo, para planejamento de trajetórias, e o mapa SLAM,
% utiliza para localização do robô.
Apesar do sistema de SLAM fornecer um mapa do ambiente, este mapa não
é utilizado no mapa de custo. Como este mapa não está completo desde
o início, não é possível planejar trajetórias para ambientes não
visitados previamente. Além disso, é preferível que o mapa da camada
estática tenha apenas obstáculos fixos, como paredes e escadas, e
utilizar a camada de obstáculos para obstáculos dinâmicos. Esta
separação permite que o mapa estático seja utilizado em diversas
sessões, porém com uma camada de obstáculos nova a cada sessão.
Ademais a camada de obstáculos pode ser configurada de forma
independente que o SLAM, podendo utilizar outros sensores ou
considerar uma altura de obstáculos diferente.
Portanto, foram criadas duas representações do ambiente, uma obtida
pelo SLAM, que é utilizada apenas para localização, e outra realizada
utilizando os \textit{plugins} do mapa de custo do Nav2, que é usado
no planejamento de trajetória.
\subsection{Mapeamento de custo}
O mapa de custo empregado no planejamento de trajetórias é composto
por três camadas: a camada estática, que possui uma representação
simples do ambiente, preferencialmente sem obstáculos temporários; a
camada de obstáculos ou \textit{voxel}, onde são utilizados dados dos
sensores óticos para atualizar o mapa com obstáculos percebidos; e a
camada de inflação, que cria um campo de custo ao redor dos
obstáculos.
A planta do prédio Centenário, representada na Figura
\ref{fig:planta_centenario}, foi utilizada como mapa estático. Ele
foi configurado para considerar apenas as cédulas em preto como
ocupadas, que equivalem a obstáculos fixos, como paredes e a escada.
As cédulas em cinza, que representam a obstáculos prováveis como
cadeiras e mesas, são consideradas livres, já que esses objetos devem
ser captados pelos dados dos sensores do robô.
A camada de obstáculos utiliza os dados da camera RGB-D para
atualizar o mapa. Existem dois \textit{plugins} que podem ser
aplicados para este fim, o \texttt{obstacle\_layer} e o
\texttt{voxel\_layer}. Ambos suportam mensagens do tipo
\texttt{PointCloud2}, que são publicadas pela câmera RGB-D, porém
empregam técnicas diferentes para atualizar o mapa. O
\texttt{obstacle\_layer} utiliza \textit{ray casting} em 2D para
determinar a posição dos obstáculos. O \texttt{voxel\_layer}, por
outro lado, cria um grade tri-dimensional, divido em blocos chamados
de \textit{voxels}, que podem estar ocupados ou livres.
Apesar do mapa de custo ser em 2D, a simulação e o mundo real podem
ter obstáculos de diferentes alturas, como mesas e cadeiras.
Portanto, é necessária a percepção em 3D do ambiente para evitar
colisões com estes obstáculos. Logo, foi utilizado o
\texttt{voxel\_layer} para atualizar o mapa de custo.
Para a configuração do \texttt{voxel\_layer}, é preciso definir a
resolução e o número de \textit{voxels} no eixo Z utilizados. A
câmera RGB-D Intel RealSense D435 do Twil está localizada a uma
altura de aproximadamente 1,37 metro do chão, que é a altura mínima
do gride de \textit{voxels}. O número máximo de \textit{voxels}
permitido pelo \textit{plugin} é 16. Tendo em vista estes dados, foi
definido um gride de \textit{voxels} com 15 \textit{voxels} de
resolução 0,1 metro, criando um gride de 1,5 metro de altura.
Portanto, são captados apenas obstáculos dentro deste campo, e
objetos em uma altura superior a 1,5 metro não são considerados. Isso
é importante para evitar a detecção de obstáculos que não são
relevantes para a navegação como, no caso do ambiente de simulação
utilizado, a moldura das portas.
A última camada, \texttt{inflation\_layer}, cria uma zona de
segurança ao redor dos objetos captados nas outras camadas, para
garantir uma distância segura ao planejar a trajetória. Em
\textcite{ros_tuning_guide}, recomenda-se que a camada de inflação
cubra um raio grande em volta de obstáculos com uma curva de
decaimento de inclinação baixa, para criar um campo que cubra a maior
parte do mapa de custo. Desta forma, são criadas trajetórias que
passam no meio de obstáculos, mantendo uma distância segura,
diminuindo o risco de possíveis colisões e realizando movimentos
suaves.
\subsection{Mapeamento SLAM}
O mapeamento realizado pelo sistemas SLAM é utilizado apenas para a
localização do robô pelo mesmo pacote que o criou. Foram criados dois
mapas, um por cada pacote de localização implementado,
\texttt{slam\_toolbox} e \texttt{rtabmap\_slam}, descritos na Seção
\ref{met:localizacao}.
Devido aos dados dos sensores à sua disposição, o
\texttt{slam\_toolbox} só é capaz de criar mapas em duas dimensões.
Porém, o \texttt{rtabmap\_slam} pode criar mapas em duas ou três
dimensões. Como o robô Twil não é capaz de se movimentar no eixo Z,
neste trabalho só serão comparados os mapas bidimensionais criados
por ambos pacotes.
\section{Testes e coleta de dados}
\label{met:testes}
Devido à independência entre o mapeamento de custos e os demais
sistemas desenvolvidos neste trabalho, foram realizados dois tipos de
testes diferentes. Para testar o mapeamento de custo, foram criadas
trajetórias com e sem obstáculos para testar o desempenho das camadas
de obstáculos e inflação. Já para conferir o funcionamento dos
sistemas de odometria, localização e mapeamento SLAM, utilizaram-se
arquivos de gravação de tópicos do ROS 2, chamados de
\textit{rosbags}.
Estes arquivos permitem a execução de diferentes ensaios usando os
mesmos dados de entrada. Outro benefício foi o alívio na exigência de
processamento do computador utilizado, já que não foi necessário
realizar a simulação do mundo real no Gazebo e a execução dos nodos
de localização simultaneamente.
Para a criação das \textit{rosbags}, foi feito um \textit{script} em