Encontro 1
Engenharia de software e documentação

A program is like a poem: you cannot write a poem without writing it.
Dijkstra
AGENDA
Sprint 1
Arquitetura do sistema
ENCONTROS
Encontro 1
- Engenharia de software
- Documentação
Encontro 2
- Requisitos
- Design patterns
ENCONTRO 3
- ROS
- Turtlebot



Engenharia de software
Coesão, acoplamento, inversão e injeção de dependência
Coesão

Coesão

ACOPLAMENTO

INJEção de DEPENDência

INVERSão de DEPENDência

INVERSão de DEPENDência

GIT
Como não destruir seu repositório com PRs

I named Linux after myself. It's only natural that I did the same with Git.
Linus Torvalds

GIT PULL

Retirado de fonte
GIT REBASE
Retirado de fonte


Encontro 2
Design patterns e requisitos de software

Insanity is doing the exact same fucking thing over and over again, expecting shit to change.
Vaas Montenegro
AGENDA
Design Patterns
Motivações e exemplos
Motivações
Coesão
Acoplamento
Reutilização
+
Escalabilidade
+
strategy pattern
Retirado de fonte

Strategy pattern

Strategy Pattern

Inversão de dependência
Observer pattern
Retirado de fonte

Observer pattern
Retirado de fonte

Observer pattern

Observer pattern

Onde mais tem observer?

Observer no ros


...E o singleton?

...E o singleton?
class ROSMaster:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super(ROSMaster, cls).__new__(cls)
cls._instance.publishers = {}
return cls._instance
def register_publisher(self, topic_name, publisher):
self.publishers[topic_name] = publisher
def subscribe(self, subscriber, topic_name):
publisher = self.publishers.get(topic_name)
if publisher:
publisher.add_subscriber(subscriber)
# Testando o Singleton:
master1 = ROSMaster()
master2 = ROSMaster()
# Deve retornar True, já que ambos devem ser a mesma instância
print(master1 == master2)
Vamos praticar

Exercício
Crie um script em Python capaz de ler as notas de alunos e calcular a média para cada um deles. O programa deve ser capaz de ler as notas tanto de um arquivo csv quanto de um arquivo yml. A sua saíde pode ser tanto uma atualização do arquivo csv/yml quanto por stdout (terminal). Exemplo:
./gera-notas.py -i notas.csv -o notas.yml
>> Arquivo atualizado com sucesso
./gera-notas.py -i notas.yml
Betinho: 5.5
Elisa: 7.5
João: 8.5

Dicas: bibliotecas pyyaml, csv, argparse
Rnfs
Como criá-los? Como medí-los
Atividade ponderada 1

Encontro 3
Revisão de ROS e Quatérnios

Quaternions came from Hamilton after his really good work had been done, and though beautifully ingenious, have been an unmixed evil to those who have touched them in any way.
Lord Kelvin
AGENDA
Revisão ROS
Nós e tópicos. Publishers e subscribers
Nós

tópicos

Exercício 1 - rodando o turtlesim

Use o pacote turtlesim para rodar um nó de simulação e outro de teleoperação.
RQT

rqt_graph
subscribers


Exercício 2 - lendo a pose do turtlesim

Crie um subscriber simples capaz de consumir informações do tópico de pose do turtlesim e exibir no terminal.
PUBLISHERS


Exercício 3 - comandando o turtlesim

Crie um publisher capaz de publicar mensagens no tópico que rege a movimentação do turtlesim.
pacotes e launch files
A forma mais simples de se trabalhar com projetos em ROS
Exercício 3 - pacotes e launchfiles

Utilizando o tutorial fornecido no material auxiliar, transforme os dois scripts feitos anteriormente em um pacote e crie um launchfile para rodá-los ao mesmo tempo (o launchfile deve fazer parte do pacote).
ROS em rede
ROS_DOMAIN_ID e Tchau, brigado pro WSL!
Configuração
export ROS_DOMAIN_ID=<valor>
#Valores seguros: 0-101 e 215-232
Exercício 4 - MExendo no turtlesim do coleguinha

Em duplas ou trios, criem um script capaz de fazer um desenho. Configurem para que o ROS_DOMAIN_ID seja o mesmo e alternem entre um fazer um desenho no turtlesim do outro.
quaternions
Pure evil

Por quê? 😫

Retirado de fonte
Cinemática inversa
Retirado de fonte

Cinemática inversa - singularidade

Encontro 4
Gazebo e nav2

...and yet though I know beforehand that he won’t, I set off to him. Why? Well, when one has no one, nowhere else one can go! For every man must have somewhere to go. Since there are times when one absolutely must go somewhere!
Marmeladov (Crime and Punishment)
AGENDA
Serviços ros
Server - Client
serviços
Retirado de fonte

ações ros
Dois serviços e um tópico
ações
Retirado de fonte

NAV2/SLAM
Mapeando e navegando
Diagrama de blocos
Retirado de fonte

ações NAV2
Retirado de fonte

Exercício 1 - Instalando e rodando o gazebo

Execute o lançador do turtlebot_world e mova o robô no mundo simulado com o turtlebot_teleop.
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
ros2 run turtlebot3_teleop teleop_keyboard
Exercício 2 - mapeando o mundo simulado

Usando o turtlebot cartographer, mapeie o mundo do turtlebot3. Para isso, use o teleop para mover-se pelo mapa enquanto mapeia.
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
ros2 run turtlebot3_teleop teleop_keyboard
ros2 run nav2_map_saver map_saver_cli -f <nome-do-mapa>
Exercício 2 - mapeando o mundo simulado

Exercício 3 - navegação no gazebo

Agora que já temos um mapa, vamos carregá-lo e navegar usando o Rviz + nav2
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
# Substitua o arquivo-do-mapa pelo local onde está o seu mapa
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True
map:=<arquivo-do-mapa>.yaml
Exercício 4 - Simple commander

Vamos agora fazer tudo isso, só que programáticamente?
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
# Substitua o arquivo-do-mapa pelo local onde está o seu mapa
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True
map:=<arquivo-do-mapa>.yaml
Encontro 5
Webots e chatbot simples

Chatbots baseados em regras são como papagaios tecnológicos, repetem o que é programado, mas não entendem o bate-papo. Eu, por outro lado, sou mais como um romancista em uma mesa de bar, criando histórias com cada palavra digitada. Eles seguem o script, eu jogo xadrez com as palavras.
Gepeto, Chat
AGENDA
Webots + nav2
Tchau, brigado gazebo
Exercício 1 - Instalando e rodando

Exercício 2 - webots com nav2

regex
/^.*regex.*:\)$/
chatbot simples
Dois dicionários e muito regex
Exercício 3 - Chatbotzin?

Exercício 2 - mapeando o mundo simulado

Exercício 3 - navegação no gazebo

Agora que já temos um mapa, vamos carregá-lo e navegar usando o Rviz + nav2
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
# Substitua o arquivo-do-mapa pelo local onde está o seu mapa
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True
map:=<arquivo-do-mapa>.yaml
Exercício 4 - Simple commander

Vamos agora fazer tudo isso, só que programáticamente?
ros2 launch turtlebot3_gazebo turtlebot3_world_launch.py
# Substitua o arquivo-do-mapa pelo local onde está o seu mapa
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True
map:=<arquivo-do-mapa>.yaml
Encontro 7
Langchain pt 2, LCEL, RAG

Sou o milhor. Posso não ser o milhor, mas na minha cabeça sou o milhor
Chat CR7

AGENDA
langchain
Quanto overengineering vocês querem?
- Sim
LANGCHAIN
Retirado de fonte

Prompt template
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template(
"Tell me a {adjective} joke about {content}."
)
prompt_template.format(adjective="funny", content="chickens")
LCEL
Conciso, mas com 500 abstrações para cada coisinha
LCEL
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
model = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_template(
"""
You are now my personal travel agent. Act as someone who has immense travel
experience and knows the best places in the world to do certain activities. I
want to know where I should go to {activity}. Give the answers as a list of
items, no bigger than 5 items. For each item, create a simple sentence
justifying this choice.
"""
)
chain = prompt | model
for s in chain.stream({"activity": "eat live fish"}):
print(s.content, end="", flush=True)
Exercício 1 - 15 min

Vamos implementar uma cadeia simples?
RAG
Como evitar que um LLM alucine?
RAG
Retirado de fonte

load
Retirado de fonte

transform
Retirado de fonte

eMBED
Retirado de fonte

store
Retirado de fonte

RETRIEVE
Retirado de fonte

RETRIEVE
Retirado de fonte

Aplicação
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough
from langchain.vectorstores import FAISS
vectorstore = FAISS.from_texts(
["Bread - (0.0, 1.0, 2.0)\nMilk - (1.0, 2.0, 0.0)"],
embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(model="gpt-3.5-turbo")
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
)
for s in chain.stream("Where is the bread?"):
print(s.content, end="", flush=True)
Exercício 2 - 30 min

Bora de RAG? Baixem o arquivo texto aqui
Encontro 8
Introdução à redes neurais

AI winters were not due to imagination traps, but due to lack of imaginations. Imaginations bring order out of chaos. Deep learning with deep imagination is the road map to AI springs and AI autumns.
Amit Ray
AGENDA
O problema com perceptrons


o perceptron

o perceptron
class Perceptron:
def __init__(self, weights, threshold):
self.weights = np.array(weights)
self.threshold = threshold
self.bias = 0
def activation_function(self, x):
return 1 if x >= self.threshold else 0
def predict(self, inputs):
# Calcula a soma ponderada das entradas
linear_output = np.dot(inputs, self.weights) + self.bias
# Aplica a função degrau para determinar a saída
y_predicted = self.activation_function(linear_output)
return y_predicted
Exercício 1 - 20 min

Vamos implementar um perceptron? Do livro "Neural networks and deep learning":
Suppose the weekend is coming up, and you've heard that there's going to be a cheese festival in your city. You like cheese, and are trying to decide whether or not to go to the festival. You might make your decision by weighing up three factors:
- Is the weather good?
- Does your boyfriend or girlfriend want to accompany you?
- Is the festival near public transit? (You don't own a car).
We can represent these three factors by corresponding binary variables x1,x2, and x3. For instance, we'd have x1=1 if the weather is good, and x1=0 if the weather is bad. Similarly, x2=1 if your boyfriend or girlfriend wants to go, and x2=0 if not. And similarly again for x3 and public transit.
funções de ativação



bias

Exercício 2 - 40 min (ponderada 6)

Vamos fazer o perceptron aprender? Crie um método de treinamento e, usando-o, faça com que o perceptron aprenda a reproduzir o comportamento das seguintes portas lógicas:
- AND
- OR
- NAND
- XOR




Multilayer PErceptron

Forward propagation
duas perguntas
- Como definir o custo de um erro?
- Se eu tiver camadas intermediárias, como eu correlaciono esse erro com os pesos?
Gradiente descendente

Retropropagação

forward propagation

Retropropagação

Encontro 9
Redes neurais convolucionais

You've got it from here.
Nanamin

AGENDA
MLP

Tensorflow e Keras
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
x = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[0], [1], [1], [0]])
# Creating the MLP model
model = Sequential()
model.add(Dense(4, input_dim=2, activation='relu')) # First hidden layer
model.add(Dense(1, activation='sigmoid')) # Output layer
# Compile the model
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
# Train the model
model.fit(x, y, epochs=10, batch_size=1)
Exercício 1 - 20 min
MLP c/ Keras

Convoluções

Convoluções como filtros

redes neurais convolucionais

Exercício 2 - 40 min
Ponderada 7 - Classificação MNIST utilizando redes neurais convolucionais.

arquitetura yolo

Encontro 10
Ferramentas TTS e STT

Honored bun

AGENDA
whisper

encoder decoder

Exercício 1 - 15 min
Utilizando o whisper, crie um programa simples que transcreva um arquivo de áudio contendo uma frase e exiba-o no terminal

pip install -U openai-whisper
bark
🐶
outros modelos tts


Exercício 2 - 15 min
Utilizando o JETS TTS, crie um script que receba um input do usuário e converta-o em áudio

pip install txtai[pipeline-audio]
pip install soundfile
Exercício 3 - resto do encontro
Ponderada 8 - Criando o seu próprio tradutor

- UI - 1,0 ponto
- TTS - 3,0 pontos
- Tradução - 3,0 pontos
- STT - 3,0 pontos
Encontro 11
Redes neurais recorrentes

Aoi Todo (GOAT)

AGENDA
O perceptron

Multi-layer perceptron

Feedforward
foreshadowing


redes neurais convolucionais


dados sequenciais




redes neurais recorrentes

vanishing/exploding gradient

vanishing/exploding gradient

LSTM

LSTM - Forget gate

LSTM - input gate

LSTM - output gate

tipos de redes recorrentes

ponderada 9
Utilizando LSTM para gerar músicas.


Encontro 12
Encoder-Decoder Transformer


You're right, [REDACTED]. I'm you. I wanted to reject you, convince myself that you were wrong. But that doesn't matter now. I'm gonna kill you. Even if you come back as another curse, I'll kill you. Change your name. Change your form. I'll kill you again. I don't need to find meaning or a reason. Maybe in a hundred years after my death, the meaning behind my actions will become apparent. In the grand scheme of things... I'm probably nothing more than a cog.
HIMtadori, Yuji

AGENDA

RNN

lstm

forget gate

input gate

output gate


tipos de uso - rnn

o problema do chatbot

comparando palavras


vector embeddings



seq2seq


Gyobu Masataka Oniwa

componentes


encoder

encoder/decoder

encoder/decoder

Vetor de contexto
Tokens
o problema do encoder/decoder

atenção!!

atenção!!

atenção!!

softmax

atenção!!

atenção!!

Ficou perfeito agora??
attention is all you need...


interlúdio

transformers


codificação posicional

Auto Atenção

query key value

encoder

atenção encoder/decoder

encoder/decoder

gpt (decoder only)

google gemini
nos vemos no módulo 9...

Encontro 13
Fabricação digital

[Jensen] sent out an email on Friday evening saying everything is going to deep learning, and that we were no longer a graphics company. By Monday morning, we were an AI company. Literally, it was that fast.
Greg Estes (VP Marketing - NVidia)

The “classical stack” of Software 1.0 is what we’re all familiar with — it consists of explicit instructions to the computer written by a programmer. In contrast, Software 2.0 is written in much more abstract, human unfriendly language, such as the weights of a neural network.
Andrej Karpathy (Tesla, OpenAI)
M8 EC Encontros
By Rodrigo Mangoni Nicola
M8 EC Encontros
Primeiro encontro do módulo 8 de EC - Inteli
- 328