🖥️ Sistema Computacional
Entender o computador embarcado do G1: Jetson Orin NX, arquitetura, ROS2, processamento de IA e otimizações.
🧠 NVIDIA Jetson Orin NX 16GB
Arquitetura do SoM (System on Module)
┌────────────────────────────────────────────────┐
│ NVIDIA Jetson Orin NX 16GB SOM │
├────────────────────────────────────────────────┤
│ CPU: 8-core ARM Cortex-A78AE @ 2.0 GHz │
│ ├─ 4x Big cores (high performance) │
│ └─ 4x Little cores (energy efficient) │
├──────────────────────────────────── ────────────┤
│ GPU: 1024-core NVIDIA Ampere │
│ ├─ 32 Tensor Cores (IA acelerada) │
│ ├─ 8 RT Cores (raytracing - não usado) │
│ └─ 100 TOPS (INT8) / 50 TFLOPS (FP16) │
├────────────────────────────────────────────────┤
│ Memory: 16GB LPDDR5 │
│ ├─ Bandwidth: 102 GB/s │
│ └─ Shared entre CPU/GPU (unified memory) │
├────────────────────────────────────────────────┤
│ Storage: 64GB eMMC (sistema) │
│ └─ Slot NVMe M.2 para expansão (até 2TB) │
├───────────────────────────── ───────────────────┤
│ Conectividade: │
│ ├─ 2x GbE (Gigabit Ethernet) │
│ ├─ 4x USB 3.2 │
│ ├─ HDMI 2.1 (debug/desenvolvimento) │
│ ├─ 3x MIPI CSI-2 (câmeras) │
│ ├─ 2x CAN Bus │
│ └─ GPIO, I2C, SPI, UART │
├────────────────────────────────────────────────┤
│ Power: 10-25W (configurável) │
│ OS: Ubuntu 20.04 (JetPack 5.1.2) │
└────────────────────────────────────────────────┘
Por Que Jetson Orin NX?
- IA Acelerada
- Comparação
- Modos de Energia
100 TOPS de Performance
TOPS = Tera Operations Per Second (trilhões ops/seg)
# Exemplo: YOLO detection com GPU
import tensorrt as trt
# Modelo YOLO otimizado para Jetson
model = trt.load_engine('yolov8n_fp16.trt')
# Inference em uma imagem 1920x1080
frame = camera.read()
detections = model.infer(frame) # ~3ms (333 FPS!)
# Mesmo modelo sem GPU: ~150ms (6 FPS)
# Aceleração: 50x mais rápido
Aplicações que Usam 100 TOPS:
-
Visão Computacional (40 TOPS)
- YOLO object detection
- Pose estimation (detectar pessoas)
- Depth estimation
-
Navegação (30 TOPS)
- SLAM (mapeamento simultâneo)
- Path planning
- Obstacle avoidance
-
Controle (20 TOPS)
- Modelo preditivo de estabilidade
- Otimização de marcha em tempo real
-
Reserva (10 TOPS)
- Tarefas customizadas do usuário
Jetson Orin NX vs Alternativas:
| Plataforma | TOPS | CPU | RAM | Preço | Consumo |
|---|---|---|---|---|---|
| Orin NX 16GB | 100 | 8-core A78 | 16GB | $800 | 10-25W |
| Orin Nano 8GB | 40 | 6-core A78 | 8GB | $500 | 7-15W |
| Orin AGX 64GB | 275 | 12-core A78 | 64GB | $2000 | 15-60W |
| Xavier NX | 21 | 6-core Carmel | 16GB | $400 | 10-20W |
| Raspberry Pi 5 | ~2 | 4-core A76 | 8GB | $80 | 5W |
| Intel NUC i7 | ~5 | x86 i7 | 32GB | $1200 | 30-65W |
Por que NX é ideal para G1:
- ✅ Balance perfeito: performance/custo/energia
- ✅ 16GB suficiente para múltiplos modelos IA simultâneos
- ✅ Compatível com ROS2 nativo (ARM)
- ✅ Ecossistema maduro (JetPack, TensorRT)
NVP Model (NVIDIA Power Model):
# Listar modos disponíveis
sudo nvpmodel -q
Available modes:
- Mode 0: MAXN (max performance) - 25W
- Mode 1: 15W - balanced
- Mode 2: 10W - power save
# G1 usa Mode 1 (15W) por padrão
sudo nvpmodel -m 1
# Para desenvolvimento intenso, usar MAXN
sudo nvpmodel -m 0
Comparação de Performance:
| Modo | CPU Max | GPU Max | RAM BW | TOPS | Uso |
|---|---|---|---|---|---|
| MAXN (25W) | 2.0GHz | 918MHz | 102GB/s | 100 | Desenvolvimento |
| 15W | 1.5GHz | 765MHz | 85GB/s | 70 | Produção (G1) |
| 10W | 1.2GHz | 624MHz | 68GB/s | 50 | Economia extrema |
Quando Trocar:
# Detectar carga de trabalho
if heavy_ai_task:
os.system('sudo nvpmodel -m 0') # MAXN
else:
os.system('sudo nvpmodel -m 1') # Default
🐧 Sistema Operacional
Ubuntu 20.04 + JetPack 5.1.2
O que vem instalado:
┌─ Base System ─────────────────────┐
│ Ubuntu 20.04.6 LTS (Focal Fossa) │
│ Kernel: 5.10.104-tegra │
│ Python: 3.8.10 │
└───────────────────────────────────┘
┌─ NVIDIA JetPack 5.1.2 ────────────┐
│ CUDA 11.4 │
│ cuDNN 8.6 │
│ TensorRT 8.5.2 │
│ VPI (Vision Programming Interface) │
│ DeepStream SDK 6.2 │
└───────────────────────────────────┘
┌─ ROS & Robotics ──────────────────┐
│ ROS2 Humble (LTS) │
│ Gazebo 11 │
│ MoveIt 2 │
└───────────────────────────────────┘
┌─ AI Frameworks ───────────────────┐
│ PyTorch 1.13 (ARM + CUDA) │
│ TensorFlow 2.11 │
│ ONNX Runtime 1.14 │
└───────────────────────────────────┘
Acesso ao Sistema
- SSH
- Monitor Direto
- Jupyter Notebook
Conectar via WiFi/Ethernet:
# G1 cria hotspot WiFi quando ligado
SSID: Unitree-G1-XXXX
Password: (fornecida com robô)
# IP padrão: 192.168.123.1
# SSH
ssh unitree@192.168.123.1
# Senha padrão: 123
# Trocar senha
passwd
Desenvolvimento Remoto:
# VS Code Remote SSH
# Instalar extensão: Remote - SSH
# .ssh/config
Host unitree-g1
HostName 192.168.123.1
User unitree
ForwardX11 yes # Para GUIs
# Conectar
code --remote ssh-remote+unitree-g1 /home/unitree/workspace
Conectar HDMI + USB:
G1 possui:
├─ Porta HDMI (lado torso)
├─ Porta USB (teclado/mouse)
└─ Boot direto para Ubuntu Desktop
Uso: Debugging, setup inicial
Não recomendado para operação (cabos limitam movimento)
Desenvolvimento Interativo:
# No G1 via SSH
jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser
# No seu PC
# Acessar: http://192.168.123.1:8888
# Token aparece no terminal do G1
Exemplo - Testar Câmera:
# Jupyter cell
import cv2
from unitree_sdk import Robot
robot = Robot()
frame = robot.camera_front.read()
# Mostrar inline
from IPython.display import Image, display
_, encoded = cv2.imencode('.jpg', frame)
display(Image(data=encoded.tobytes()))
🤖 ROS2 Humble
Arquitetura ROS2 no G1
┌────────────────── ROS2 Nodes ──────────────────┐
│ │
│ /camera_node → /camera/image_raw (topic) │
│ ↓ │
│ /yolo_detector → /detections (topic) │
│ ↓ │
│ /navigation → /cmd_vel (topic) → Motores │
│ │
└─────────────────────────────────────────────────┘
Nodes Principais do G1
- Sensor Nodes
- Control Nodes
- AI Nodes
# Listar nodes ativos
ros2 node list
/lidar_node # Publica point clouds
/camera_front_node # Câmera principal
/camera_left_node # Stereo esquerda
/camera_right_node # Stereo direita
/imu_node # IMU (acelerômetro + gyro)
/joint_state_node # Posições de todos motores
Exemplo - Ler Câmera:
# Ver imagem (requer X11 forwarding)
ros2 run image_tools showimage --ros-args \
-r image:=/camera/front/image_raw
# Salvar frame
ros2 run image_view image_saver --ros-args \
-r image:=/camera/front/image_raw
/locomotion_controller # Controle de caminhada
/arm_left_controller # Braço esquerdo
/arm_right_controller # Braço direito
/balance_controller # Estabilização
/gait_planner # Planejamento de marcha
Comandar Movimento:
# Caminhar para frente a 0.5 m/s
ros2 topic pub --once /cmd_vel geometry_msgs/Twist \
"{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
# Girar (0.5 rad/s)
ros2 topic pub --once /cmd_vel geometry_msgs/Twist \
"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}"
# Node customizado - YOLO detector
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from vision_msgs.msg import Detection2DArray
from cv_bridge import CvBridge
import cv2
import tensorrt as trt
class YOLODetector(Node):
def __init__(self):
super().__init__('yolo_detector')
# Subscriber para câmera
self.sub = self.create_subscription(
Image,
'/camera/front/image_raw',
self.image_callback,
10
)
# Publisher para detecções
self.pub = self.create_publisher(
Detection2DArray,
'/detections',
10
)
self.bridge = CvBridge()
self.model = trt.load_engine('yolov8n.trt')
def image_callback(self, msg):
# Converter ROS Image -> OpenCV
cv_image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
# Inferência
detections = self.model.infer(cv_image)
# Publicar detecções
detection_msg = self.format_detections(detections)
self.pub.publish(detection_msg)
def main():
rclpy.init()
node = YOLODetector()
rclpy.spin(node)
if __name__ == '__main__':
main()
⚡ Otimizações de Performance
TensorRT - Otimização de Modelos IA
Converter PyTorch → TensorRT:
import torch
import torch_tensorrt
# Modelo PyTorch original
model = torch.hub.load('ultralytics/yolov8', 'yolov8n')
model.eval().cuda()
# Converter para TensorRT
trt_model = torch_tensorrt.compile(
model,
inputs=[torch_tensorrt.Input(shape=[1, 3, 640, 640])],
enabled_precisions={torch.float16}, # FP16 (2x mais rápido)
)
# Salvar
torch.jit.save(trt_model, 'yolov8n_fp16.ts')
Ganhos de Performance:
| Modelo | Framework | Precision | FPS | Latência |
|---|---|---|---|---|
| YOLOv8n | PyTorch | FP32 | 15 | 66ms |
| YOLOv8n | PyTorch | FP16 | 28 | 35ms |
| YOLOv8n | TensorRT | FP16 | 120 | 8ms |
| YOLOv8s | TensorRT | FP16 | 60 | 16ms |
Unified Memory - Zero-Copy
Jetson usa memória compartilhada CPU↔GPU:
import cupy as cp # NumPy-like para CUDA
import numpy as np
# ❌ Método tradicional (com cópia)
data_cpu = np.random.rand(1920, 1080, 3).astype(np.uint8)
data_gpu = cp.array(data_cpu) # Copia CPU→GPU (lento!)
# ✅ Método Jetson (zero-copy)
import pycuda.driver as cuda
# Alocar em unified memory
data_unified = cuda.managed_empty(
shape=(1920, 1080, 3),
dtype=np.uint8,
mem_flags=cuda.mem_attach_flags.GLOBAL
)
# CPU e GPU acessam MESMA memória
# Sem cópia, 10x mais rápido para grandes dados
Cooling e Throttling
Monitorar Temperatura:
# Ver temperaturas
tegrastats
# Output:
# CPU@38.5°C GPU@42°C ...
Cooling Ativo:
G1 possui:
├─ 2x Ventiladores 40mm (torso)
├─ PWM controlado (0-100%)
└─ Trigger: <60°C = 100% fan
Configuração:
/etc/nvidia/nvfancontrol.conf
Evitar Thermal Throttling:
# Monitorar clock real vs max
import subprocess
def get_gpu_clock():
result = subprocess.run(
['nvidia-smi', '--query-gpu=clocks.gr', '--format=csv,noheader,nounits'],
capture_output=True,
text=True
)
return int(result.stdout.strip())
clock = get_gpu_clock()
if clock < 900: # Max: 918 MHz em mode MAXN
print(f"⚠️ Throttling detectado! Clock: {clock} MHz")
print("GPU muito quente, reduzir carga de trabalho")
📦 Expansão de Armazenamento
Adicionar SSD NVMe
Slot M.2 2280 disponível:
# Recomendado: Samsung 980 PRO 512GB
# Custo: ~$80
# 1. Instalar fisicamente (parafuso M2)
# 2. Formatar
sudo mkfs.ext4 /dev/nvme0n1
# 3. Montar automaticamente
sudo mkdir /mnt/nvme
echo "/dev/nvme0n1 /mnt/nvme ext4 defaults 0 2" | sudo tee -a /etc/fstab
# 4. Mover datasets/models para SSD
mv ~/datasets /mnt/nvme/
ln -s /mnt/nvme/datasets ~/datasets
Benefícios:
- 📦 500GB+ espaço (vs 64GB eMMC)
- ⚡ 3000 MB/s leitura (vs 300 MB/s eMMC)
- 🎥 Gravar vídeos das câmeras
- 💾 Armazenar logs/telemetria
✅ Checklist de Conhecimento
Após este módulo, você deve saber:
- Specs do Jetson Orin NX (8-core CPU, 1024 GPU cores, 16GB RAM)
- O que são 100 TOPS e para que servem
- Como conectar via SSH ao G1
- ROS2 Humble é o middleware padrão
- TensorRT otimiza modelos IA (8x speedup)
- Como expandir armazenamento com NVMe
🔗 Próximos Passos
📡 Comunicação e Conectividade →
Redes, WiFi, 4G, API remota e multi-robô.
⏱️ Tempo de estudo: 50-60 minutos 📊 Nível: Intermediário-Avançado 💻 Hands-on: SSH ao G1, explorar ROS2 topics