Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 7 additions & 32 deletions .devcontainer/.clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,19 @@ Checks: >
modernize-*,
performance-*,
readability-*,
-cppcoreguidelines-avoid-magic-numbers,
-modernize-use-trailing-return-type,
-readability-avoid-const-params-in-decls,
-readability-function-cognitive-complexity,
-readability-identifier-naming,
-readability-magic-numbers,
misc-unused-using-decls,

# Аналізувати лише код домашніх робіт і типові source/include директорії,
# а не системні headers або сторонні бібліотеки.
HeaderFilterRegex: '(^|/)(homework_[0-9]+|include|src)/'

# Помилки analyzer/core-guidelines/modernize мають ламати перевірку.
# Readability і performance лишаються попередженнями, щоб не блокувати
# навчальні ітерації надто рано.
# Зауваження static analyzer мають ламати перевірку: це найчастіше реальні баги.
# Решта checks лишаються warning-ами, щоб clang-tidy був навчальним
# інструментом, а не стіною стилістичних помилок для ДЗ.
WarningsAsErrors: clang-analyzer-*,
cppcoreguidelines-*,
modernize-*,

# Naming rules формують один стиль для прикладів курсу.
CheckOptions:
- key: readability-identifier-naming.FunctionCase
value: lower_case
- key: readability-identifier-naming.VariableCase
value: lower_case
- key: readability-identifier-naming.ConstantCase
value: CamelCase
- key: readability-identifier-naming.ConstantPrefix
value: k
- key: readability-identifier-naming.LocalVariableCase
value: lower_case
- key: readability-identifier-naming.ParameterCase
value: lower_case
- key: readability-identifier-naming.MemberCase
value: lower_case
- key: readability-identifier-naming.MemberSuffix
value: _
- key: readability-identifier-naming.PrivateMemberCase
value: lower_case
- key: readability-identifier-naming.PrivateMemberSuffix
value: _
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: CamelCase
39 changes: 16 additions & 23 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,15 @@
# syntax=docker/dockerfile:1

# Ubuntu 24.04 LTS (noble), закріплено по SHA256 digest.
#
# Теги на Docker Hub змінюються: :noble перевипускається кілька разів
# на рік з оновленнями безпеки. Той самий Dockerfile з тим самим тегом
# завтра може витягнути інший образ. Пін по digest робить так, щоб
# через будь-який час збірка давала ту саму базу.
#
# Оновити digest (коли планово бампаємо базу):
# docker pull ubuntu:noble
# docker inspect --format='{{index .RepoDigests 0}}' ubuntu:noble
FROM ubuntu:noble@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b
# ROS 2 Jazzy desktop як базовий devcontainer-образ.
# Це лишає Ubuntu 24.04 під капотом, але одразу дає /opt/ros/jazzy,
# rviz2, rqt-інструменти і системні залежності ROS 2.
FROM osrf/ros:jazzy-desktop

# Неінтерактивний frontend, щоб apt не зависнув чекаючи відповіді на
# питання (часовий пояс, клавіатура, kernel upgrade prompt). У Dockerfile
# інтерактивного stdin немає - без цього build може зависнути назавжди.
ARG DEBIAN_FRONTEND="noninteractive"


# Розділені deb822-джерела: amd64 з archive.ubuntu.com, arm64 з
# ports.ubuntu.com. Обидва файли обов'язкові в build context, інакше
# COPY провалить збірку. Без arch-обмежень apt тягнув би arm64 з
# archive.ubuntu.com (там його немає -> 404).
COPY ubuntu-amd64.sources /etc/apt/sources.list.d/ubuntu.sources
COPY ubuntu-arm64.sources /etc/apt/sources.list.d/ubuntu-arm64.sources

RUN dpkg --add-architecture arm64 && \
apt-get update && \
apt-get install --no-install-recommends -y libgpiod-dev:arm64
# Пакети зі списку apt-packages.in (по одному на рядок, коментарі через #).
#
# Прапори й чистка:
Expand All @@ -53,16 +35,27 @@ COPY .clang-format /.clang-format
COPY .clang-tidy /.clang-tidy
COPY .clangd /.clangd
COPY .cmake-format.json /.cmake-format.json
COPY cyclonedds.xml /etc/cyclonedds.xml

# Змінні середовища:
# - TZ: UTC як нейтральний дефолт. Логи завжди в UTC, без суперечок з
# літнім часом різних регіонів.
# - LC_ALL / LANG / LANGUAGE: en_US.UTF-8 щоб stdout/stderr коректно
# виводили UTF-8 текст (кирилиця, emoji, JSON з non-ASCII ключами).
# - RMW_IMPLEMENTATION: CycloneDDS як default middleware для ROS 2 demo.
# Це робить discovery стабільнішим у host-network devcontainer.
# - CYCLONEDDS_URI: явний DDS config для локального devcontainer graph.
# Config лишає autodetect interface і multicast loopback для host network.
ENV TZ=Etc/UTC
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV ROS_DISTRO=jazzy
ENV ROS_VERSION=2
ENV ROS_PYTHON_VERSION=3
ENV ROS_DOMAIN_ID=0
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ENV CYCLONEDDS_URI=file:///etc/cyclonedds.xml

# sudo без пароля для dev-контейнера: зручно для apt install на ходу,
# debug tools, etc. У прод-образах ніколи - там контейнер має жорстко
Expand Down Expand Up @@ -103,7 +96,7 @@ RUN if id ubuntu >/dev/null 2>&1; then \
userdel -r ubuntu && groupdel ubuntu 2>/dev/null || true; \
fi && \
useradd -s /bin/bash -m ${CONTAINER_USER} && \
echo "\nexport PROMPT_COMMAND=\"history -a; history -n\n\"" >> /home/${CONTAINER_USER}/.bashrc
printf '\nsource /opt/ros/jazzy/setup.bash\nexport PROMPT_COMMAND="history -a; history -n"\n' >> /home/${CONTAINER_USER}/.bashrc

# Всі подальші команди у контейнері (включно з процесами VS Code remote
# extension) виконуються від CONTAINER_USER, не від root.
Expand Down
15 changes: 8 additions & 7 deletions .devcontainer/apt-packages.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Базові пакети для стабільної роботи Ubuntu image.
# Базові пакети для стабільної роботи devcontainer image.
ca-certificates
curl
locales
Expand Down Expand Up @@ -33,10 +33,11 @@ clang-format
cmake-format
ninja-build

# ROS 2 інструменти для демо блоку 5: colcon workspace, ament_auto і graph GUI.
python3-colcon-common-extensions
ros-jazzy-ament-cmake-auto
ros-jazzy-rqt-graph

# work with rpi pins
libgpiod-dev
socat

pkg-config
file
# CycloneDDS використовується як default RMW для стабільнішого discovery
# у devcontainer.
ros-jazzy-rmw-cyclonedds-cpp
30 changes: 30 additions & 0 deletions .devcontainer/cyclonedds.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<CycloneDDS xmlns="https://cdds.io/config">
<Domain id="any">
<General>
<!--
Devcontainer працює у host network. Автовибір interface лишає DDS
сумісним з Docker/WSL/VPN setup.
-->
<AllowMulticast>true</AllowMulticast>
<EnableMulticastLoopback>true</EnableMulticastLoopback>
<Interfaces>
<NetworkInterface autodetermine="true"/>
</Interfaces>
</General>

<Discovery>
<!--
auto + MaxAutoParticipantIndex дають кільком локальним ROS 2 процесам
стабільно отримувати різні participant index-и.
-->
<ParticipantIndex>auto</ParticipantIndex>
<MaxAutoParticipantIndex>120</MaxAutoParticipantIndex>

<!-- Локальний peer лишає graph видимим для процесів у цьому devcontainer. -->
<Peers>
<Peer Address="127.0.0.1"/>
</Peers>
</Discovery>
</Domain>
</CycloneDDS>
9 changes: 8 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
".devcontainer/scripts/initialize"
],

// ROS 2 CLI daemon синхронізується з поточним CycloneDDS profile:
// прибрати завислий daemon, стартувати daemon заново і перевірити,
// що CLI graph-команди відповідають.
"postStartCommand": [
"bash",
".devcontainer/scripts/post-start"
],

// host network спрощує SSH/debug сценарії для занять з target-пристроями.
// SYS_PTRACE і seccomp=unconfined потрібні для стабільної роботи GDB
// всередині контейнера, особливо коли debug-сесія attach-иться до процесу.
Expand Down Expand Up @@ -77,7 +85,6 @@
"C_Cpp.intelliSenseEngine": "disabled",
"[cpp]": {
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true,
"editor.quickSuggestions": {
"other": "on",
"comments": "off",
Expand Down
37 changes: 37 additions & 0 deletions .devcontainer/scripts/post-start
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -eo pipefail

# VS Code викликає цей script після старту container-а. ROS 2 CLI daemon
# має відповідати поточному DDS profile. Якщо лишився завислий daemon, звичайні
# `ros2 node list` / `ros2 topic list` можуть зависати на XML-RPC connect.
source /opt/ros/jazzy/setup.bash

if [[ "${RMW_IMPLEMENTATION:-}" != "rmw_cyclonedds_cpp" ]]; then
echo "RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION:-unset}, expected rmw_cyclonedds_cpp" >&2
exit 1
fi

if [[ "${CYCLONEDDS_URI:-}" != "file:///etc/cyclonedds.xml" ]]; then
echo "CYCLONEDDS_URI=${CYCLONEDDS_URI:-unset}, expected file:///etc/cyclonedds.xml" >&2
exit 1
fi

if command -v timeout >/dev/null 2>&1; then
timeout 3s ros2 daemon stop >/dev/null 2>&1 || true
else
ros2 daemon stop >/dev/null 2>&1 || true
fi

if command -v pgrep >/dev/null 2>&1; then
while IFS= read -r ros_daemon_pid; do
kill "${ros_daemon_pid}" >/dev/null 2>&1 || true
done < <(pgrep -f 'ros2cli.daemon.daemonize|--name ros2-daemon|_ros2_daemon' || true)
fi

if command -v timeout >/dev/null 2>&1; then
timeout 5s ros2 daemon start >/dev/null
timeout 5s ros2 daemon status >/dev/null
else
ros2 daemon start >/dev/null
ros2 daemon status >/dev/null
fi
15 changes: 0 additions & 15 deletions .devcontainer/ubuntu-amd64.sources

This file was deleted.

7 changes: 0 additions & 7 deletions .devcontainer/ubuntu-arm64.sources

This file was deleted.

5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd",
"editor.formatOnSave": true,
"editor.formatOnPaste": false
}
},
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/homework_13/robot_ws/build/antidrone_turret"
]
}
Loading
Loading