Skip to content

hyujun/rtc-framework

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

941 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

RTC (Real-Time Control) Framework

CI codecov ROS2 Humble ROS2 Jazzy

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_*)

ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์„ค๋ช… ๋นŒ๋“œ
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_*)

ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์„ค๋ช… ๋นŒ๋“œ
shape_estimation_msgs 5.17.0 ToF ๊ธฐ๋ฐ˜ ํ˜•์ƒ ์ถ”์ •์šฉ ์ปค์Šคํ…€ ROS2 ๋ฉ”์‹œ์ง€ 3์ข… (ToFReadings, TipPoses, ShapeEstimate) + ExploreShape ์•ก์…˜ ament_cmake
shape_estimation 5.17.0 ToF ์„ผ์„œ ๊ธฐ๋ฐ˜ ํ˜•์ƒ ์ถ”์ •: ๋ณต์…€ ํฌ์ธํŠธ ๋ˆ„์ , ์ตœ์†Œ์ œ๊ณฑ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ํ”ผํŒ… (๊ตฌ/์‹ค๋ฆฐ๋”/ํ‰๋ฉด/๋ฐ•์Šค) ament_cmake

๋กœ๋ด‡ ๊ณ ์œ  ํŒจํ‚ค์ง€ (ur5e_*)

ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์„ค๋ช… ๋นŒ๋“œ
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

์ฃผ์š” ๊ธฐ๋Šฅ

RT ์ œ์–ด ์ฝ”์–ด

  • ๊ฐ€๋ณ€ 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 lifecycle CLI๋กœ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ ์ œ์–ด (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 task q_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.2

๋ชจ๋‹ˆํ„ฐ๋ง

ros2 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 $PID

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

ROS2 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, ์‚ฌ์ „ ํ• ๋‹น)

์Šค๋ ˆ๋”ฉ ๋ชจ๋ธ (v5.17.0, 6์ฝ”์–ด ๊ธฐ์ค€)

์Šค๋ ˆ๋“œ ํƒ€์ž… ์ฝ”์–ด ์Šค์ผ€์ค„๋Ÿฌ ์šฐ์„ ์ˆœ์œ„ ์—ญํ• 
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_base README ์ฐธ์กฐ.


์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊น…

๋กœ๊ทธ๋Š” 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 ํด๋ฐฑ)๋กœ ๋ชจ๋“  ๋…ธ๋“œ์— ์„ธ์…˜ ๊ฒฝ๋กœ ์ž๋™ ์ „ํŒŒ.


RT ๊ถŒํ•œ ์š”๊ตฌ์‚ฌํ•ญ

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 ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

About

Robot-agnostic Real-Time Controller framework (ROS2 Humble/Jazzy, C++20)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors