Ubuntu 22.04 (ROS 2 Humble) / Ubuntu 24.04 (ROS 2 Jazzy) | ๋ชจ๋ํ rtc_ ํ๋ ์์ํฌ ๊ธฐ๋ฐ UR5e ์ค์๊ฐ ์ ์ด ์์คํ *
๋ก๋ด ๋น์์กด์ (robot-agnostic) RTC ํ๋ ์์ํฌ ์์ ๊ตฌ์ถ๋ ์ค์๊ฐ ์ ์ด ์๋ฃจ์
์
๋๋ค. ๊ฐ๋ณ DOF, ์ค์ ๊ฐ๋ฅํ ์ ์ด ์ฃผ๊ธฐ(500Hzโ2kHz), ์ ๋ต ํจํด ๊ธฐ๋ฐ ๋ค์ค ์ ์ด๊ธฐ(P/JointPD/CLIK/OSC/TSID-WBC), TSID QP ์ ์ ์ ์ด (rtc_tsid + ProxSuite), MPCโRT ์ธํฐํ์ด์ค ๊ณ์ธต (rtc_mpc: zero-copy TripleBuffer + cubic-Hermite ๋ณด๊ฐ + Riccati ํผ๋๋ฐฑ, dedicated-core MPC thread), ์ ์ก ๊ณ์ธต ์ถ์ํ(UDP/CAN-FD/EtherCAT/RS485), RT-์์ ONNX ์ถ๋ก ์์ง, MuJoCo 3.x ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ดํฐ, E-STOP ์์ ์์คํ
, CSV ๋ฐ์ดํฐ ๋ก๊น
, GUI ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค.
20๊ฐ ROS2 ํจํค์ง๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๋ก๋ด ๋น์์กด์ ํ๋ ์์ํฌ(rtc_*), ํ์ ์ถ์ (shape_estimation_*), ๋ก๋ด ๊ณ ์ ํจํค์ง(ur5e_*)๋ก ๋ถ๋ฆฌ๋ฉ๋๋ค. ๊ฐ ํจํค์ง๋ ์์ฒด README.md๋ฅผ ํฌํจํฉ๋๋ค.
| ํจํค์ง | ๋ฒ์ | ์ค๋ช | ๋น๋ |
|---|---|---|---|
rtc_msgs |
5.17.0 | ์ปค์คํ ROS2 ๋ฉ์์ง 8์ข (JointCommand, FingertipSensor, HandSensorState, GuiPosition, RobotTarget, DeviceStateLog, DeviceSensorLog, GraspState) | ament_cmake |
rtc_base |
5.17.0 | ํค๋-์ ์ฉ RT ์ธํ๋ผ: ํ์
, SeqLock, SPSC ๋ฒํผ, ์ค๋ ๋ฉ(4/6/8/10/12/16์ฝ์ด + MPC tier MpcThreadConfig), Bessel/Kalman ํํฐ, CSV ๋ก๊น
|
ament_cmake |
rtc_communication |
5.17.0 | ํค๋-์ ์ฉ ์ ์ก ๊ณ์ธต ์ถ์ํ: TransportInterface, UdpSocket RAII, PacketCodec concept, Transceiver ํ ํ๋ฆฟ | ament_cmake |
rtc_controller_interface |
5.17.0 | ์ถ์ ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค (Strategy ํจํด) + Singleton ๋ ์ง์คํธ๋ฆฌ (๊ฐ๋ณ DOF) | ament_cmake |
rtc_controllers |
5.17.0 | ๋ฒ์ฉ ์ ์ด๊ธฐ 4์ข (P, JointPD, CLIK, OSC) + ํธํฑ ๊ถค์ ์์ฑ๊ธฐ | ament_cmake |
rtc_tsid |
0.1.0 | TSID QP ํ๋ ์์ํฌ: WQP/HQP formulation, PostureTask/SE3Task/CoMTask/ForceTask, EOM/Contact/FrictionCone/TorqueLimit/JointLimit ์ ์ฝ, ProxSuite ๋ฐฑ์๋ | ament_cmake |
rtc_mpc |
0.1.0 | MPCโRT ์ธํฐํ์ด์ค: zero-copy TripleBuffer<T> (single-atomic publish/acquire), cubic-Hermite TrajectoryInterpolator, RiccatiFeedback, MPCSolutionManager facade, MPCThread+MockMPCThread jthread skeleton (solver-agnostic; Aligator๋ ํ์ ํจํค์ง) |
ament_cmake |
rtc_controller_manager |
5.17.0 | 500Hz RT ๋ฃจํ (clock_nanosleep) + ์ปจํธ๋กค๋ฌ ๋ผ์ดํ์ฌ์ดํด + SPSC publish offload + E-STOP | ament_cmake |
rtc_inference |
5.17.0 | ํค๋-์ ์ฉ RT-์์ ์ถ๋ก ์์ง: ONNX Runtime IoBinding, ์ฌ์ ํ ๋น ๋ฒํผ, ๋ฐฐ์น/๋ค์ค ๋ชจ๋ธ | ament_cmake |
rtc_mujoco_sim |
5.18.0 | MuJoCo 3.x ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ดํฐ: ๋ฉํฐ ๊ทธ๋ฃน ๋ฌผ๋ฆฌ, GLFW ๋ทฐ์ด, fake_hand 1์ฐจ ํํฐ, max_rtf ์๋ ์ ์ด, n_substeps ์๋ธ์คํ
|
ament_cmake |
rtc_digital_twin |
5.17.0 | RViz2 ๋์งํธ ํธ์ ์๊ฐํ: ๋ค์ค ์์ค ๊ด์ ์ํ ํตํฉ, mimic ์๋ ๊ณ์ฐ, ํ๊ฑฐํ ์ผ์ Arrow/Sphere ๋ง์ปค | ament_python |
rtc_tools |
5.17.0 | Python ์ ํธ๋ฆฌํฐ 7์ข : controller_gui, plot_rtc_log, compare_mjcf_urdf, urdf_to_mjcf, hand_udp_sender, hand_data_plot, session_dir | ament_python |
rtc_scripts |
5.17.0 | RT ์์คํ
์ค์ ์คํฌ๋ฆฝํธ (PREEMPT_RT ์ปค๋, CPU ๊ฒฉ๋ฆฌ, IRQ ์ดํผ๋ํฐ, ๋คํธ์ํฌ ์ต์ ํ, MPC ์ฝ์ด ํฌํผ get_mpc_cores/get_rt_cores/get_os_cores) |
ament_cmake |
| ํจํค์ง | ๋ฒ์ | ์ค๋ช | ๋น๋ |
|---|---|---|---|
rtc_urdf_bridge |
5.17.0 | ๋ก๋ด ๋น์์กด์ URDF ํ์ + Pinocchio ๋ชจ๋ธ ๋น๋, YAML ๊ธฐ๋ฐ ์ฒด์ธ ์ถ์ถ ์ค์ | ament_cmake |
| ํจํค์ง | ๋ฒ์ | ์ค๋ช | ๋น๋ |
|---|---|---|---|
shape_estimation_msgs |
5.17.0 | ToF ๊ธฐ๋ฐ ํ์ ์ถ์ ์ฉ ์ปค์คํ ROS2 ๋ฉ์์ง 3์ข (ToFReadings, TipPoses, ShapeEstimate) + ExploreShape ์ก์ | ament_cmake |
shape_estimation |
5.17.0 | ToF ์ผ์ ๊ธฐ๋ฐ ํ์ ์ถ์ : ๋ณต์ ํฌ์ธํธ ๋์ , ์ต์์ ๊ณฑ ํ๋ฆฌ๋ฏธํฐ๋ธ ํผํ (๊ตฌ/์ค๋ฆฐ๋/ํ๋ฉด/๋ฐ์ค) | ament_cmake |
| ํจํค์ง | ๋ฒ์ | ์ค๋ช | ๋น๋ |
|---|---|---|---|
ur5e_description |
5.17.0 | UR5e URDF/MJCF/๋ฉ์ โ Pinocchio/RViz/MuJoCo ๊ฒธ์ฉ | ament_cmake |
ur5e_hand_driver |
5.17.0 | 10-DOF ํธ๋ UDP ๋๋ผ์ด๋ฒ: SeqLock ์ํ, ppoll sub-ms ํ์์์, ์ด๊ฐ ์ผ์ 44ch, ONNX F/T ์ถ๋ก | ament_cmake |
ur5e_bt_coordinator |
0.1.0 | BehaviorTree.CPP v4 ๊ธฐ๋ฐ ๋น-RT ํ์คํฌ ์ฝ๋๋ค์ดํฐ (20 Hz, UR5e + ํธ๋ ํตํฉ ๋ชจ์ ) | ament_cmake |
ur5e_bringup |
5.17.0 | UR5e launch/config + ๋ฐ๋ชจ ์ปจํธ๋กค๋ฌ (DemoJoint, DemoTask, DemoWbc โ TSID QP ๊ธฐ๋ฐ 8-phase WBC + Phase 5 MPC ํตํฉ ๊ฒฝ๋ก, enable_mpc launch arg, 9-entry gains) + CPU ๊ฒฉ๋ฆฌ/DDS ํ๋ |
ament_cmake |
rtc_msgs, rtc_base (๋
๋ฆฝ)
โโโ rtc_communication โ rtc_base
โโโ rtc_inference โ rtc_base
โโโ rtc_controller_interface โ rtc_base, rtc_msgs
โ โโโ rtc_controllers โ rtc_controller_interface, rtc_urdf_bridge
โ โโโ rtc_controller_manager โ rtc_controllers, rtc_communication
โโโ rtc_tsid โ Pinocchio, ProxSuite, Eigen3, yaml-cpp
โโโ rtc_mpc โ rtc_base, Eigen3, yaml-cpp # Phase 5
โโโ rtc_mujoco_sim โ MuJoCo 3.x (optional)
โโโ rtc_digital_twin (๋
๋ฆฝ, Python)
โโโ rtc_tools (๋
๋ฆฝ, Python)
โโโ rtc_scripts (๋
๋ฆฝ, shell)
rtc_urdf_bridge โ Pinocchio, tinyxml2, yaml-cpp
shape_estimation_msgs (๋
๋ฆฝ)
โโโ shape_estimation โ shape_estimation_msgs, Eigen3
ur5e_description (๋
๋ฆฝ)
โโโ ur5e_hand_driver โ rtc_communication, rtc_inference, rtc_base
โโโ ur5e_bt_coordinator โ rtc_msgs, BehaviorTree.CPP v4
โโโ ur5e_bringup โ rtc_controller_manager, rtc_tsid, rtc_mpc,
ur5e_hand_driver, ur5e_description
- ๊ฐ๋ณ DOF ์ค์๊ฐ ์ ์ด:
clock_nanosleep(TIMER_ABSTIME)๊ธฐ๋ฐ 500Hzโ2kHz RT ๋ฃจํ, CPU ์ฝ์ด ์๋ ํ ๋น (4/6/8/10/12/16์ฝ์ด) - Lock-Free SPSC ์ํคํ ์ฒ: RT ์ค๋ ๋ โ SPSC ๋ฒํผ โ ๋น-RT ํผ๋ธ๋ฆฌ์/๋ก๊น (wait-free push, cache-line ์ ๋ ฌ)
- SeqLock ๋๊ธฐํ: ๋จ์ผ Writer / ๋ค์ค Reader lock-free ์ํ ๊ณต์ (trivially copyable ํ์ ์ ์ฉ)
- ์ปจํธ๋กค๋ฌ ๊ณ์ธต ๋ถ๋ฆฌ:
rtc_controller_interface(์ถ์) โrtc_controllers(๋ฒ์ฉ 4์ข ) โur5e_bringup(๋ฐ๋ชจ 2์ข ) - Lifecycle ๊ด๋ฆฌ: ๋ชจ๋ C++ ๋
ธ๋๊ฐ
rclcpp_lifecycle::LifecycleNode๊ธฐ๋ฐ โros2 lifecycleCLI๋ก ๋ฐํ์ ์ํ ์ ์ด (deactivate/activate), Launch event handler ๊ธฐ๋ฐ ์๋ configureโactivate ์ฒด์ด๋
- PController: Joint-space ๋น๋ก ์ ์ด (์ฆ๋ถ ์คํ
q + kp*error*dt) - JointPDController: PD + Pinocchio RNEA ์ค๋ ฅ/์ฝ๋ฆฌ์ฌ๋ฆฌ ๋ณด์, JointSpaceTrajectory ํธํฑ ๋ณด๊ฐ
- ClikController: Damped Jacobian ์ญ์ด๋ํ (3/6-DOF), ์๊ณต๊ฐ ์ ์ด, TaskSpaceTrajectory SE3 ํธํฑ
- OperationalSpaceController: 6-DOF Cartesian PD + SO(3) ํ์ ์ ์ด, Pinocchio log3 ์ค์ฐจ
- DemoWbcController: TSID QP ๊ธฐ๋ฐ 16-DoF (arm + hand) ์ ์ ์ ์ด, 8-phase FSM (IdleโApproachโPreGraspโClosureโHoldโRetreatโReleaseโFallback), ProxSuite Dense QP, semi-implicit Euler ์ ๋ถ, Phase 5์์ MPC reference ์ฃผ์
๊ฒฝ๋ก ์ง์ โ
rtc_mpc์ MockMPCThread(20 Hz) โ TripleBuffer โ cubic-Hermite ๋ณด๊ฐ โ TSID taskq_des/v_des/a_des + u_fb์ฃผ์ , MPC ๋นํ์ฑ ์ Phase 4 ๊ณ ์ -reference ๋์ bit-identical ์ ์ง
- ๊ธ๋ก๋ฒ E-STOP:
atomic<bool>+compare_exchange_strong๊ธฐ๋ฐ ํตํฉ ๋น์ ์ ์ง โ ๋์ ๋๋ฐ์ด์ค ๊ทธ๋ฃน ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ:init_timeout: ์ด๊ธฐํ ์๊ฐ ๋ด state ๋ฏธ์์ โ ๋ ธ๋ ์ข ๋ฃ{group}_timeout: ๋๋ฐ์ด์ค ๊ทธ๋ฃน๋ณ state ํ ํฝ ๊ฐฑ์ ํ์์์ (CheckTimeouts 50Hz, YAML ์ค์ )sim_sync_timeout: ์๋ฎฌ๋ ์ด์ ๋๊ธฐํ ํ์์์ (use_sim_time_sync๋ชจ๋)consecutive_overrun: โฅ10ํ ์ฐ์ RT ๋ฃจํ ์ค๋ฒ๋ฐ
- ์๋ ๋ณต๊ตฌ: protective_stop, ํ๋ก๊ทธ๋จ ์ฐ๊ฒฐ ๋๊น์ ๋ํด ์ ํ์ ์๋ ๋ณต๊ตฌ ์ง์
- MuJoCo 3.x ์๋ฎฌ๋ ์ดํฐ: ๋๊ธฐ์ ๋ฃจํ, GLFW ์ธํฐ๋ํฐ๋ธ ๋ทฐ์ด (40+ ํค๋ณด๋ ๋จ์ถํค), fake_hand ์๋ฎฌ๋ ์ด์
,
max_rtf์๋ ์ ์ด,n_substeps์๋ธ์คํ ์ผ๋ก ๋ฌผ๋ฆฌ ํด์๋ ์กฐ์ - RT-์์ ONNX ์ถ๋ก : IoBinding + ์ฌ์ ํ ๋น ๋ฒํผ๋ก RT ๊ฒฝ๋ก ํ ํ ๋น ์ ๊ฑฐ, ๋ฐฐ์น/๋ค์ค ๋ชจ๋ธ ์ง์
- ์ ์ก ๊ณ์ธต ์ถ์ํ: UDP ๊ตฌํ ์๋ฃ, CAN-FD/EtherCAT/RS485 ํ์ฅ ๊ฐ๋ฅ
- ์ธ์
๊ธฐ๋ฐ CSV ๋ก๊น
:
logging_data/YYMMDD_HHMM/โ timing, robot, device 3ํ์ผ ๋ถ๋ฆฌ - ROS2 ํ๋ผ๋ฏธํฐ ์ธํธ๋ก์คํ์ : ์ปจํธ๋กค๋ฌ๋ณ ํ ํฝ ๋งคํ์ ์ฝ๊ธฐ ์ ์ฉ ํ๋ผ๋ฏธํฐ๋ก ๋ ธ์ถ
- controller_gui: tkinter ๊ธฐ๋ฐ ์ค์๊ฐ ๊ฒ์ธ ํ๋ GUI
- plot_rtc_log: Matplotlib CSV ๊ถค์ ์๊ฐํ (robot/device ์๋ ๊ฐ์ง)
- compare_mjcf_urdf: MJCF/URDF ๋ฌผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๊ต์ฐจ ๊ฒ์ฆ
- urdf_to_mjcf: URDF โ MJCF ์๋ ๋ณํ
chmod +x install.sh
./install.sh sim # ์๋ฎฌ๋ ์ด์
์ ์ฉ
./install.sh robot # ์ค์ ๋ก๋ด ์ ์ฉ
./install.sh full # ์ ์ฒด ์ค์นchmod +x build.sh
./build.sh sim # ์๋ฎฌ๋ ์ด์
ํจํค์ง
./build.sh robot # ๋ก๋ด ํจํค์ง (MuJoCo ์ ์ธ)
./build.sh full # ์ ์ฒด ํจํค์ง
./build.sh sim -c -j 4 # ํด๋ฆฐ ๋น๋ + 4 ์์ปค
./build.sh -p rtc_base # ํน์ ํจํค์ง๋ง ๋น๋
# ์๋ ๋น๋
cd ~/ros2_ws/rtc_ws && colcon build --symlink-install && source install/setup.bash# MuJoCo ์๋ฎฌ๋ ์ด์
ros2 launch rtc_mujoco_sim mujoco_sim.launch.py
# ์ค์ ๋ก๋ด (CycloneDDS ์ฑ๋ฅ ์ต์ ํ ์ค์ ์๋ ๋ก๋)
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 launch ur5e_bringup robot.launch.py robot_ip:=192.168.1.10
# ๊ฐ์ ํ๋์จ์ด (๋ก๋ด ๋ถํ์)
ros2 launch ur5e_bringup robot.launch.py use_fake_hardware:=true
# ํธ๋ ๋๋ผ์ด๋ฒ ๋
ธ๋
ros2 launch ur5e_hand_driver hand_udp.launch.py target_ip:=192.168.1.2ros2 topic hz /forward_position_controller/commands # RT ๋ฃจํ ์ฃผ๊ธฐ (~500Hz)
ros2 topic echo /system/estop_status # E-STOP ์ํ (true = ํ์ฑ)
ros2 topic echo /sim/status # MuJoCo: [step, time, rtf, paused]
ros2 param list /rt_controller | grep controllers # ํ ํฝ ํ๋ผ๋ฏธํฐ ํ์ธ
# RT ์ค๋ ๋ ์ํ ํ์ธ
PID=$(pgrep -f rt_controller) && ps -eLo pid,tid,cls,rtprio,psr,comm | grep $PIDROS2 Humble / Jazzy ๋ฉํฐ ํจํค์ง ๋ฆฌํฌ์งํ ๋ฆฌ (ament_cmake, C++20). rtc_* ํจํค์ง๋ URDF ๋งค๋ํฐ๋ ์ดํฐ์ ๋ฒ์ฉ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
[๋ก๋ด ํ๋์จ์ด / MuJoCo ์๋ฎฌ๋ ์ดํฐ]
โ /joint_states (sensor_msgs/JointState)
โผ
[rtc_controller_manager] โ /target_joint_positions (goal)
โ RT ๋ฃจํ (clock_nanosleep 500Hz)
โ ์ ์ด๊ธฐ: rtc_controllers (P / JointPD / CLIK / OSC)
โ ์ ์ก: rtc_communication (UDP)
โโโโ SPSC โโโ [publish_thread] โโโ /forward_position_controller/commands
โโโโ SPSC โโโ [log_thread] โโโ CSV 3-ํ์ผ (timing, robot, device)
โโโโ E-STOP โโโ /system/estop_status
[ํธ๋ HW] โUDP ์ง์ ์์ โ [ur5e_hand_driver] โ SeqLock โ [ControlLoop]
[rtc_inference] RT-์์ ONNX ์ถ๋ก (IoBinding, ์ฌ์ ํ ๋น)
| ์ค๋ ๋ | ํ์ | ์ฝ์ด | ์ค์ผ์ค๋ฌ | ์ฐ์ ์์ | ์ญํ |
|---|---|---|---|---|---|
rt_loop |
jthread (clock_nanosleep) | 2 | SCHED_FIFO | 90 | ControlLoop 500Hz + CheckTimeouts 50Hz |
sensor_executor |
ROS2 Executor | 3 | SCHED_FIFO | 70 | /joint_states, /target_joint_positions ๊ตฌ๋ |
log_executor |
ROS2 Executor | 4 | SCHED_OTHER | nice -5 | CSV 3-ํ์ผ ๋ก๊น (SpscLogBuffer drain) |
mpc_main (Phase 5) |
jthread | 4 | SCHED_FIFO | 60 | 20 Hz MPC solve, TripleBuffer publish (6์ฝ์ด๋ logging๊ณผ ๊ณต์ ; 8+์ฝ์ด๋ dedicated) |
publish_thread |
jthread (SPSC drain) | 5 | SCHED_OTHER | nice -3 | ROS2 publish offload (ControlPublishBuffer) |
aux_executor |
ROS2 Executor | 5 | SCHED_OTHER | 0 | E-STOP ์ํ ํผ๋ธ๋ฆฌ์ |
udp_recv |
jthread | 5 | SCHED_FIFO | 65 | ํธ๋ UDP ์์ (ur5e_hand_driver) |
Core 0โ1: OS, DDS, NIC IRQ (isolcpus ๋์ ๋ฐํ์
cset shield์ฌ์ฉ). DDS ์ค๋ ๋๋taskset์ผ๋ก Core 0-1์ ์๋ ํ๋. CycloneDDS ์ฑ๋ฅ ์ต์ ํ: ๋ฉํฐ์บ์คํธ ๋นํ์ฑํ, ์์ผ ๋ฒํผ ํ๋, write batching, NACK ์ง์ฐ ์ต์ํ. MPC ์ค๋ ๋๋ sensor_io๋ณด๋ค ๋ฎ์ ์ฐ์ ์์(60 < 70)๋ฅผ ๊ฐ์ง๋ฏ๋ก sensor callback์ด ํญ์ preempt โ ๊ธด solve๊ฐ RT ๋ฃจํ์ ์ํฅ์ ์ฃผ์ง ์์. 12/16์ฝ์ด tier๋ MPC main + 1โ2 worker(SCHED_FIFO 55)๋ก ๋ณ๋ ฌ solve ์ง์. 8/10/12/16์ฝ์ด ๋ ์ด์์ ๋ฐkMpcConfig{4,6,8,10,12,16}Core๋rtc_baseREADME ์ฐธ์กฐ.
๋ก๊ทธ๋ logging_data/YYMMDD_HHMM/ ์ธ์
๋๋ ํ ๋ฆฌ์ ์๋ ์ ์ฅ๋ฉ๋๋ค (max_log_sessions: 10):
| ์๋ธ๋๋ ํ ๋ฆฌ | ๋ด์ฉ |
|---|---|
controller/ |
timing_log.csv (6์ด: ํ์ด๋ฐ), <device>_log.csv (๋๋ฐ์ด์ค๋ณ: ๊ด์ /์ผ์/์ถ๋ก ) |
monitor/ |
ur5e_failure_*.log, controller_stats.json |
hand/ |
hand_udp_stats.json |
sim/ |
screenshot_*.ppm (MuJoCo ์ ์ฉ) |
plots/, motions/ |
rtc_tools ์ถ๋ ฅ |
ํ๊ฒฝ๋ณ์ RTC_SESSION_DIR (๋๋ UR5E_SESSION_DIR ํด๋ฐฑ)๋ก ๋ชจ๋ ๋
ธ๋์ ์ธ์
๊ฒฝ๋ก ์๋ ์ ํ.
sudo groupadd realtime
sudo usermod -aG realtime $USER
echo "@realtime - rtprio 99" | sudo tee -a /etc/security/limits.conf
echo "@realtime - memlock unlimited" | sudo tee -a /etc/security/limits.conf
# ๋ก๊ทธ์์ ํ ์ฌ๋ก๊ทธ์ธ ํ์์ต๋ RT ์ฑ๋ฅ์ ์ํ CPU ๊ฒฉ๋ฆฌ:
# /etc/default/grub์ GRUB_CMDLINE_LINUX_DEFAULT์ ์ถ๊ฐ (6์ฝ์ด ๊ธฐ์ค)
# isolcpus=2-5 nohz_full=2-5 rcu_nocbs=2-5
sudo update-grub && sudo reboot| ๋ฌธ์ | ์ค๋ช |
|---|---|
| docs/RT_OPTIMIZATION.md | ์ค์๊ฐ ์ต์ ํ ๊ฐ์ด๋ (CPU ์ฝ์ด ํ ๋น, ์ปค๋ ์ค์ ) |
| docs/VSCODE_DEBUGGING.md | VS Code + GDB ๋๋ฒ๊น ๊ฐ์ด๋ |
| docs/CLAUDE.md | AI ์ด์์คํดํธ ์ปจํ ์คํธ ๋ฌธ์ |
| docs/SHELL_SCRIPTS.md | RT ์ค์ ์ ์คํฌ๋ฆฝํธ ๊ฐ์ด๋ |
๊ฐ ํจํค์ง์ ์์ธ API, ์ค์ , ์ํคํ
์ฒ๋ ํด๋น ํจํค์ง์ README.md๋ฅผ ์ฐธ์กฐํ์ธ์.
MIT License โ ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.