From bb5a0adc0c650532cd2bd9c25ffb9fa76af7aa7e Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 19 Aug 2026 12:44:51 +0900 Subject: [PATCH] Replace Xbox joystick control with RadioMaster Pocket + XR1 RC receiver Migrates the 4WD control input from SDL2/Xbox gamepad to a serial RC receiver per doc/joystick.md's functional spec: CH1 steering, CH2 throttle, CH5 emergency brake (highest priority), CH7 speed mode (0.3/0.6 m/s), with a 200ms fail-safe that forces an immediate stop on signal loss. Channel mapping, deadzones, port, and baudrate are all configurable via --rc_* CLI flags. LiDAR avoidance, jerk-limited motion profile, and wheel-fault detection are unchanged. Co-Authored-By: Claude Sonnet 5 --- Makefile | 2 +- doc/joystick.md | 61 +++++ run_4wd.sh | 6 +- xbox_motor_control.cpp | 508 ++++++++++++++++++++++++++++++++--------- xbox_motor_control_cpp | Bin 72792 -> 91704 bytes 5 files changed, 461 insertions(+), 116 deletions(-) create mode 100644 doc/joystick.md diff --git a/Makefile b/Makefile index c934c91..c4c573b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CXX = g++ CXXFLAGS = -O3 -std=c++17 -Wall -Wextra -I/usr/local/include -LIBS = -lSDL2 -lpthread -llivox_lidar_sdk_shared +LIBS = -lpthread -llivox_lidar_sdk_shared TARGET = xbox_motor_control_cpp SRC = xbox_motor_control.cpp diff --git a/doc/joystick.md b/doc/joystick.md new file mode 100644 index 0000000..adf81cf --- /dev/null +++ b/doc/joystick.md @@ -0,0 +1,61 @@ +# [기능 명세서] RadioMaster Pocket & XR1 V1.0 기반 조종 제어 전환 + +## 1. 프로젝트 개요 +* **목적:** 기존 Xbox 게임패드 기반의 원격 제어 모듈을 **RadioMaster Pocket RC 조종기** 및 **XR1 V1.0 수신기(USB-to-TTL 시리얼 통신)** 기반으로 교체/마이그레이션. +* **통신 환경:** + * 하드웨어: USB to TTL 컨버터 (`/dev/ttyUSB*` 또는 COM 포트) + * 수신기: XR1 V1.0 + * 조종기: RadioMaster Pocket + +--- + +## 2. 하드웨어 및 채널 매핑 사양 + +### 2.1 채널별 입력 범위 및 기능 정의 + +| 채널 | 입력 장치 | Raw Value 범위 | 할당 기능 | 동작 설명 | +| :--- | :--- | :--- | :--- | :--- | +| **CH1** | 롤/조향 스틱 | • `1001`: 좌측 끝
• `1480 ~ 1500`: 중앙 (데드존)
• `2000`: 우측 끝 | **좌우 조향 (Steering / Angular Z)** | • 중앙 데드존(`1480~1500`) 적용
• 좌회전(-) / 우회전(+) 정규화 | +| **CH2** | 피치/스로틀 스틱 | • `1000`: 위 끝 (전진)
• `1500`: 중앙 (정지)
• `2000`: 아래 끝 (후진) | **전후진 (Throttle / Linear X)** | • `1000` 방향으로 이동 시 전진
• `2000` 방향으로 이동 시 후진
• CH7에서 결정된 최대 속도 기준으로 선형 매핑 | +| **CH5** | 2단 스위치 | • `1011`: 미작동 (OFF)
• `1988`: 눌림 (ON) | **전자/비상 브레이크 (Brake)** | • `1988` 수신 시 모든 주행 속도 즉시 0 (`Stop`)
• `1011` 수신 시 일반 주행 허용 | +| **CH7** | 2단 스위치 | • `1988`: 위쪽 누름
• `1011`: 아래쪽 누름 | **속도 모드 선택 (Speed Mode)** | • `1988` (위쪽): 저속 모드 (최대 **0.3 m/s**)
• `1011` (아래쪽): 고속 모드 (최대 **0.6 m/s**) | + +--- + +## 3. 제어 변환 알고리즘 및 로직 + +### 3.1 브레이크 최우선 로직 (CH5) +* $\text{CH5} \ge 1500$ (누름 / `1988` 부근): + $$\text{Linear Velocity} = 0.0, \quad \text{Angular Velocity} = 0.0$$ +* $\text{CH5} < 1500$ (안누름 / `1011` 부근): 정상 주행 로직 실행 + +### 3.2 속도 제한 설정 (CH7) +* $\text{CH7} \ge 1500$ (위쪽 / `1988` 부근): $V_{\max} = 0.3 \text{ m/s}$ (저속 모드) +* $\text{CH7} < 1500$ (아래쪽 / `1011` 부근): $V_{\max} = 0.6 \text{ m/s}$ (고속 모드) + +### 3.3 전후진 속도 계산 (CH2) +* **데드존(Deadband):** $1480 \le \text{CH2} \le 1520 \rightarrow V_x = 0.0$ +* **전진 구간 ($1000 \le \text{CH2} < 1480$):** + $$V_x = \left( \frac{1480 - \text{CH2}}{1480 - 1000} \right) \times V_{\max}$$ +* **후진 구간 ($1520 < \text{CH2} \le 2000$):** + $$V_x = -\left( \frac{\text{CH2} - 1520}{2000 - 1520} \right) \times V_{\max}$$ + +### 3.4 좌우 조향 각속도 계산 (CH1) +* **데드존(Deadband):** $1480 \le \text{CH1} \le 1500 \rightarrow \omega_z = 0.0$ +* **좌회전 구간 ($1001 \le \text{CH1} < 1480$):** + $$\omega_z = -\left( \frac{1480 - \text{CH1}}{1480 - 1001} \right) \times \Omega_{\max}$$ +* **우회전 구간 ($1500 < \text{CH1} \le 2000$):** + $$\omega_z = +\left( \frac{\text{CH1} - 1500}{2000 - 1500} \right) \times \Omega_{\max}$$ + +--- + +## 4. 구현 요구사항 (To Claude Code) + +1. **기존 Xbox 입력 모듈 분리 및 교체:** + - 기존의 조이스틱 라이브러리(pygame, evdev, joy 노드 등) 종속성 제거 + - 시리얼 통신(PySerial 등) 기반의 RC 수신기 데이터 리더 클래스 구현 +2. **시리얼 패킷 디코딩 & Fail-safe 처리:** + - USB-to-TTL 시리얼 포트 오픈 및 예외 처리(재연결 로직) + - 패킷 타임아웃(예: 200ms 이상 신호 미수신 시) 발생 시 자동 감속 및 긴급 정지 +3. **설정값 파라미터화 (Config):** + - Serial Port, Baudrate, 데드존 범위, 채널별 Max/Min/Center 값을 외부 설정(YAML, JSON, ROS 파라미터 등)으로 관리 가능하도록 모듈화 \ No newline at end of file diff --git a/run_4wd.sh b/run_4wd.sh index bb49520..d706818 100755 --- a/run_4wd.sh +++ b/run_4wd.sh @@ -23,9 +23,9 @@ if [ ! -f "./xbox_motor_control_cpp" ]; then fi echo "==================================================================" -echo " [시작] C++ 100Hz 초저지연 4WD 조이스틱 + 라이다 장애물 회피 시작 ($PORT)" -echo " - 라이다 기능 토글: Xbox 컨트롤러 X 버튼" -echo " - 정지/종료: B 버튼 또는 Ctrl+C" +echo " [시작] C++ 100Hz 초저지연 4WD RC(RadioMaster Pocket + XR1) + 라이다 장애물 회피 시작 ($PORT)" +echo " - 라이다 기능 비활성화: --no_lidar 옵션" +echo " - 비상 정지: CH5 브레이크 스위치 또는 Ctrl+C" echo "==================================================================" # 3. C++ 4WD 프로그램 실행 (추가 인자 전달 가능) diff --git a/xbox_motor_control.cpp b/xbox_motor_control.cpp index a76b5cc..7a38ade 100644 --- a/xbox_motor_control.cpp +++ b/xbox_motor_control.cpp @@ -1,12 +1,13 @@ -#include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -601,13 +602,234 @@ public: LidarObstacleDetector *LidarObstacleDetector::instance_ = nullptr; -float applyDeadzone(float val, float deadzone = 0.1f) { - if (std::abs(val) < deadzone) - return 0.0f; - float sign = (val > 0.0f) ? 1.0f : -1.0f; - float norm = (std::abs(val) - deadzone) / (1.0f - deadzone); - return sign * norm; -} +// ----------------------------------------------------------------------------- +// RadioMaster Pocket + XR1 V1.0 RC 수신기 (USB-to-TTL 시리얼) 입력 모듈 +// doc/joystick.md 기능 명세서 기반: 텍스트 라인 "CH1:1500,CH2:1500,..." 포맷을 +// 파싱해 채널별 raw 값(1000~2000)을 제공한다. +// ----------------------------------------------------------------------------- +struct RcConfig { + std::string port = "/dev/ttyUSB1"; + int baud = 115200; + + int ch_steer = 1; // CH1: 좌우 조향 + int ch_throttle = 2; // CH2: 전후진 + int ch_brake = 5; // CH5: 비상 브레이크 + int ch_speed = 7; // CH7: 속도 모드 + + int steer_min = 1001, steer_center_lo = 1480, steer_center_hi = 1500, + steer_max = 2000; + int throttle_min = 1000, throttle_center_lo = 1480, throttle_center_hi = 1520, + throttle_max = 2000; + + int brake_threshold = 1500; // 이상이면 브레이크 ON + int speed_threshold = 1500; // 이상이면 저속 모드 + + float v_max_low = 0.3f; // m/s (CH7 저속 모드) + float v_max_high = 0.6f; // m/s (CH7 고속 모드) + + int failsafe_timeout_ms = 200; // 이 시간 이상 신호 미수신 시 비상정지 +}; + +class RcReceiver { +public: + explicit RcReceiver(const RcConfig &cfg) : cfg_(cfg) {} + ~RcReceiver() { stop(); } + + void start() { + running_ = true; + thread_ = std::thread(&RcReceiver::run, this); + } + + void stop() { + running_ = false; + if (thread_.joinable()) + thread_.join(); + closePort(); + } + + // 채널 raw 값 조회. 아직 한 번도 수신하지 못했으면 false. + bool getChannel(int ch, int &out_val) { + std::lock_guard lock(mutex_); + auto it = channels_.find(ch); + if (it == channels_.end()) + return false; + out_val = it->second; + return true; + } + + // 포트가 열려 있고, failsafe_timeout_ms 이내에 유효한 패킷을 수신했는가. + bool isConnected() { + std::lock_guard lock(mutex_); + if (!port_open_ || channels_.empty()) + return false; + auto now = std::chrono::steady_clock::now(); + return std::chrono::duration_cast( + now - last_rx_time_) + .count() <= cfg_.failsafe_timeout_ms; + } + +private: + RcConfig cfg_; + std::atomic running_{false}; + std::thread thread_; + int fd_ = -1; + + std::mutex mutex_; + std::map channels_; + std::chrono::steady_clock::time_point last_rx_time_{}; + bool port_open_ = false; + + std::string line_buf_; + + bool openPort() { + fd_ = open(cfg_.port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + if (fd_ < 0) + return false; + + fcntl(fd_, F_SETFL, O_NONBLOCK); + + struct termios options; + tcgetattr(fd_, &options); + + speed_t speed = B115200; + switch (cfg_.baud) { + case 9600: + speed = B9600; + break; + case 19200: + speed = B19200; + break; + case 38400: + speed = B38400; + break; + case 57600: + speed = B57600; + break; + default: + speed = B115200; + break; + } + + cfsetispeed(&options, speed); + cfsetospeed(&options, speed); + + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + options.c_cflag &= ~CRTSCTS; + options.c_cflag |= CREAD | CLOCAL; + + // 텍스트 라인 프로토콜이므로 canonical 모드(라인 단위)로 사용 + options.c_lflag |= ICANON; + options.c_lflag &= ~(ECHO | ECHOE | ISIG); + options.c_iflag &= ~(IXON | IXOFF | IXANY | IGNBRK | BRKINT | PARMRK | + ISTRIP | INLCR | IGNCR | ICRNL); + options.c_oflag &= ~OPOST; + + tcsetattr(fd_, TCSANOW, &options); + tcflush(fd_, TCIOFLUSH); + return true; + } + + void closePort() { + if (fd_ >= 0) { + close(fd_); + fd_ = -1; + } + std::lock_guard lock(mutex_); + port_open_ = false; + } + + void parseLine(const std::string &line) { + std::map parsed; + size_t pos = 0; + while (pos <= line.size()) { + size_t comma = line.find(',', pos); + std::string tok = line.substr( + pos, comma == std::string::npos ? std::string::npos : comma - pos); + + size_t b = tok.find_first_not_of(" \t\r\n"); + size_t e = tok.find_last_not_of(" \t\r\n"); + if (b != std::string::npos) { + tok = tok.substr(b, e - b + 1); + if (tok.size() >= 4 && (tok[0] == 'C' || tok[0] == 'c') && + (tok[1] == 'H' || tok[1] == 'h')) { + size_t colon = tok.find(':'); + if (colon != std::string::npos) { + try { + int ch_num = std::stoi(tok.substr(2, colon - 2)); + int val = std::stoi(tok.substr(colon + 1)); + parsed[ch_num] = val; + } catch (...) { + // 손상된 토큰은 무시 + } + } + } + } + + if (comma == std::string::npos) + break; + pos = comma + 1; + } + + if (!parsed.empty()) { + std::lock_guard lock(mutex_); + for (auto &kv : parsed) + channels_[kv.first] = kv.second; + last_rx_time_ = std::chrono::steady_clock::now(); + } + } + + void run() { + // now() - 1001ms로 초기화: time_point::min()을 쓰면 첫 비교에서 + // "now - sentinel"이 부호있는 정수 오버플로우(UB)를 일으켜 -O3에서 + // 재연결 시도 자체가 영구히 스킵될 수 있다. + auto last_open_attempt = + std::chrono::steady_clock::now() - std::chrono::milliseconds(1001); + char buf[256]; + + while (running_) { + if (fd_ < 0) { + auto now = std::chrono::steady_clock::now(); + if (std::chrono::duration_cast( + now - last_open_attempt) + .count() > 1000) { + last_open_attempt = now; + if (openPort()) { + std::lock_guard lock(mutex_); + port_open_ = true; + std::cout << "\n[정보] RC 수신기 포트(" << cfg_.port + << ") 연결 성공.\n"; + } else { + std::cerr << "\n[경고] RC 수신기 포트(" << cfg_.port + << ") 열기 실패. 1초 후 재시도.\n"; + } + } + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + continue; + } + + ssize_t n = read(fd_, buf, sizeof(buf)); + if (n > 0) { + line_buf_.append(buf, static_cast(n)); + size_t nl; + while ((nl = line_buf_.find('\n')) != std::string::npos) { + std::string line = line_buf_.substr(0, nl); + line_buf_.erase(0, nl + 1); + parseLine(line); + } + if (line_buf_.size() > 4096) // 개행 없는 쓰레기 데이터 누적 방지 + line_buf_.clear(); + } else if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { + std::cerr << "\n[경고] RC 수신기 포트 통신 오류. 재연결 시도...\n"; + closePort(); + } else { + std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + } + } +}; int main(int argc, char **argv) { std::signal(SIGINT, signalHandler); @@ -618,7 +840,7 @@ int main(int argc, char **argv) { uint8_t id1 = 1; uint8_t id2 = 2; bool bcast_mode = false; - float max_v = 0.40f; // m/s + RcConfig rc_cfg; float max_spin_v = 0.30f; // m/s float track_width = 0.576f; // 좌우 바퀴 중심 거리 576mm float wheelbase = 0.3684f; // 전후 바퀴 중심 거리 368.4mm @@ -738,6 +960,46 @@ int main(int argc, char **argv) { max_z = std::stof(argv[++i]); else if (arg == "--no_lidar") use_lidar = false; + else if (arg == "--rc_port" && i + 1 < argc) + rc_cfg.port = argv[++i]; + else if (arg == "--rc_baud" && i + 1 < argc) + rc_cfg.baud = std::stoi(argv[++i]); + else if (arg == "--rc_ch_steer" && i + 1 < argc) + rc_cfg.ch_steer = std::stoi(argv[++i]); + else if (arg == "--rc_ch_throttle" && i + 1 < argc) + rc_cfg.ch_throttle = std::stoi(argv[++i]); + else if (arg == "--rc_ch_brake" && i + 1 < argc) + rc_cfg.ch_brake = std::stoi(argv[++i]); + else if (arg == "--rc_ch_speed" && i + 1 < argc) + rc_cfg.ch_speed = std::stoi(argv[++i]); + else if (arg == "--rc_steer_min" && i + 1 < argc) + rc_cfg.steer_min = std::stoi(argv[++i]); + else if (arg == "--rc_steer_center_lo" && i + 1 < argc) + rc_cfg.steer_center_lo = std::stoi(argv[++i]); + else if (arg == "--rc_steer_center_hi" && i + 1 < argc) + rc_cfg.steer_center_hi = std::stoi(argv[++i]); + else if (arg == "--rc_steer_max" && i + 1 < argc) + rc_cfg.steer_max = std::stoi(argv[++i]); + else if (arg == "--rc_throttle_min" && i + 1 < argc) + rc_cfg.throttle_min = std::stoi(argv[++i]); + else if (arg == "--rc_throttle_center_lo" && i + 1 < argc) + rc_cfg.throttle_center_lo = std::stoi(argv[++i]); + else if (arg == "--rc_throttle_center_hi" && i + 1 < argc) + rc_cfg.throttle_center_hi = std::stoi(argv[++i]); + else if (arg == "--rc_throttle_max" && i + 1 < argc) + rc_cfg.throttle_max = std::stoi(argv[++i]); + else if (arg == "--rc_brake_threshold" && i + 1 < argc) + rc_cfg.brake_threshold = std::stoi(argv[++i]); + else if (arg == "--rc_speed_threshold" && i + 1 < argc) + rc_cfg.speed_threshold = std::stoi(argv[++i]); + else if (arg == "--rc_vmax_low" && i + 1 < argc) + rc_cfg.v_max_low = std::stof(argv[++i]); + else if (arg == "--rc_vmax_high" && i + 1 < argc) + rc_cfg.v_max_high = std::stof(argv[++i]); + else if (arg == "--rc_failsafe_ms" && i + 1 < argc) + rc_cfg.failsafe_timeout_ms = std::stoi(argv[++i]); + else if (arg == "--max_spin_v" && i + 1 < argc) + max_spin_v = std::stof(argv[++i]); } constexpr float PI_VAL = 3.14159265358979323846f; @@ -761,10 +1023,16 @@ int main(int argc, char **argv) { std::cout << " - 필터링 범위: 높이 Z(" << min_z << "m ~ " << max_z << "m) | 회피 정밀 전폭 " << (robot_width + 0.10f) * 1000.0f << "mm\n"; - std::cout << " - 최고 속도: " << max_v << "m/s | 가속: " << accel_rate - << "RPM/s | Jerk: " << jerk_rate << "RPM/s² (제자리회전: " - << spin_jerk_rate << "RPM/s²) | 회전 곡선혼합: " - << spin_arc_bias * 100.0f << "%\n"; + std::cout << " - 최고 속도: 저속 " << rc_cfg.v_max_low << "m/s / 고속 " + << rc_cfg.v_max_high << "m/s (CH" << rc_cfg.ch_speed + << " 전환) | 가속: " << accel_rate << "RPM/s | Jerk: " << jerk_rate + << "RPM/s² (제자리회전: " << spin_jerk_rate + << "RPM/s²) | 회전 곡선혼합: " << spin_arc_bias * 100.0f << "%\n"; + std::cout << " - RC 수신기: " << rc_cfg.port << " @" << rc_cfg.baud + << "bps | 조향 CH" << rc_cfg.ch_steer << " | 스로틀 CH" + << rc_cfg.ch_throttle << " | 브레이크 CH" << rc_cfg.ch_brake + << " | 속도모드 CH" << rc_cfg.ch_speed + << " | Fail-safe: " << rc_cfg.failsafe_timeout_ms << "ms\n"; std::cout << " - 휠 이상판정: 무부하(들뜸) 전류비 " << airborne_current_ratio << " | 걸림 속도비 " << stall_vel_ratio << " / 전류 " << stall_current_a << "A 이상\n"; @@ -783,7 +1051,7 @@ int main(int argc, char **argv) { if (!log_path.empty()) { log_stream.open(log_path); if (log_stream.is_open()) { - log_stream << "t_ms,state,ly,lx,rx," + log_stream << "t_ms,state,rc_steer,rc_throttle,rc_ok,brake,vmax,vx,omega," "cmd_fl,cmd_fr,cmd_rl,cmd_rr," "fb_fl,fb_fr,fb_rl,fb_rr," "amp_fl,amp_fr,amp_rl,amp_rr," @@ -809,26 +1077,11 @@ int main(int argc, char **argv) { } } - if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { - std::cerr << "[오류] SDL 조이스틱 초기화 실패: " << SDL_GetError() - << std::endl; - return 1; - } - - if (SDL_NumJoysticks() < 1) { - std::cerr << "[경고] 무선 Xbox 컨트롤러(조이스틱)가 연결되지 않았습니다.\n"; - SDL_Quit(); - return 1; - } - - SDL_Joystick *joystick = SDL_JoystickOpen(0); - if (!joystick) { - std::cerr << "[오류] 조이스틱 열기 실패!\n"; - SDL_Quit(); - return 1; - } - std::cout << "[정보] C++ Xbox 컨트롤러 연결 성공: " - << SDL_JoystickName(joystick) << std::endl; + RcReceiver rc(rc_cfg); + rc.start(); + std::cout << "[정보] RadioMaster Pocket / XR1 V1.0 RC 수신기 리더 시작 (" + << rc_cfg.port << "). 신호 수신 전까지는 안전을 위해 브레이크가 " + "걸린 상태로 대기합니다.\n"; SerialPort sp1, sp2; if (!sp1.openPort(port1)) @@ -887,8 +1140,9 @@ int main(int argc, char **argv) { } } - std::cout << "\n[정보] C++ 100Hz 초저지연 루프를 시작합니다. (종료: B 버튼 " - "또는 Ctrl+C, 라이다 토글: X 버튼)\n\n"; + std::cout << "\n[정보] C++ 100Hz 초저지연 루프를 시작합니다. (종료: Ctrl+C, " + "라이다 회피 " << (use_lidar ? "활성화" : "비활성화") + << " 상태로 시작 - 변경하려면 --no_lidar 옵션을 사용하세요)\n\n"; float target_fl = 0.0f, target_fr = 0.0f; float target_rl = 0.0f, target_rr = 0.0f; @@ -950,41 +1204,70 @@ int main(int argc, char **argv) { bool just_landed_rl = false, just_landed_rr = false; char wheel_status_str[5] = "OOOO"; bool fault_active = false; // 드라이버 알람(과전류/과부하 등) 발생 여부 + bool prev_brake_on = false; // 브레이크(CH5/Fail-safe) 직전 틱 상태 + bool prev_rc_ok = false; // RC 연결 직전 틱 상태 (Fail-safe 로그용) + float omega_max = (effective_w > 0.0f) ? (max_spin_v / (effective_w / 2.0f)) + : 0.0f; // CH1 조향 최대 각속도 while (g_running) { - SDL_Event event; - while (SDL_PollEvent(&event)) { - if (event.type == SDL_JOYBUTTONDOWN) { - if (event.jbutton.button == 0) { // A 버튼: 트립 리셋 - trip_initialized = false; - } else if (event.jbutton.button == - 2) { // X 버튼: 라이다 장애물 회피 토글 - use_lidar = !use_lidar; - std::cout << "\n[정보] 라이다 회피 기능: " - << (use_lidar ? "ON" : "OFF") << std::endl; - } else if (event.jbutton.button == 1 || - event.jbutton.button == 6) { // B or Back - g_running = 0; - } + // --------------------------------------------------------------------- + // RC 수신기 채널 읽기 (doc/joystick.md §2, §3 기능 명세서 기준) + // --------------------------------------------------------------------- + int raw_steer = rc_cfg.steer_center_lo, raw_throttle = 1500; + int raw_brake = 1011, raw_speed_mode = 1011; + bool rc_ok = rc.isConnected(); + rc.getChannel(rc_cfg.ch_steer, raw_steer); + rc.getChannel(rc_cfg.ch_throttle, raw_throttle); + rc.getChannel(rc_cfg.ch_brake, raw_brake); + rc.getChannel(rc_cfg.ch_speed, raw_speed_mode); + + if (!rc_ok && prev_rc_ok) { + std::cout << "\n[경고] RC 신호 Fail-safe 발동 (" << rc_cfg.failsafe_timeout_ms + << "ms 이상 미수신) -> 비상 정지.\n"; + } + prev_rc_ok = rc_ok; + + // 3.1 브레이크 최우선 로직 (CH5) - 미수신(Fail-safe) 상태도 동일하게 처리 + bool brake_on = !rc_ok || (raw_brake >= rc_cfg.brake_threshold); + + // 3.2 속도 제한 설정 (CH7) + float v_max_now = (raw_speed_mode >= rc_cfg.speed_threshold) + ? rc_cfg.v_max_low + : rc_cfg.v_max_high; + + float v_x = 0.0f; // 선속도 m/s + float omega = 0.0f; // 각속도 rad/s + + if (!brake_on) { + // 3.3 전후진 속도 계산 (CH2) + int t = std::clamp(raw_throttle, rc_cfg.throttle_min, rc_cfg.throttle_max); + if (t >= rc_cfg.throttle_center_lo && t <= rc_cfg.throttle_center_hi) { + v_x = 0.0f; + } else if (t < rc_cfg.throttle_center_lo) { + v_x = (static_cast(rc_cfg.throttle_center_lo - t) / + static_cast(rc_cfg.throttle_center_lo - rc_cfg.throttle_min)) * + v_max_now; + } else { + v_x = -(static_cast(t - rc_cfg.throttle_center_hi) / + static_cast(rc_cfg.throttle_max - rc_cfg.throttle_center_hi)) * + v_max_now; + } + + // 3.4 좌우 조향 각속도 계산 (CH1) + int s = std::clamp(raw_steer, rc_cfg.steer_min, rc_cfg.steer_max); + if (s >= rc_cfg.steer_center_lo && s <= rc_cfg.steer_center_hi) { + omega = 0.0f; + } else if (s < rc_cfg.steer_center_lo) { + omega = -(static_cast(rc_cfg.steer_center_lo - s) / + static_cast(rc_cfg.steer_center_lo - rc_cfg.steer_min)) * + omega_max; + } else { + omega = (static_cast(s - rc_cfg.steer_center_hi) / + static_cast(rc_cfg.steer_max - rc_cfg.steer_center_hi)) * + omega_max; } } - Sint16 lx_raw = SDL_JoystickGetAxis(joystick, 0); - Sint16 ly_raw = SDL_JoystickGetAxis(joystick, 1); - Sint16 rx_raw = SDL_JoystickGetAxis(joystick, 3); - - float ly = applyDeadzone(-static_cast(ly_raw) / 32767.0f); - float lx = applyDeadzone(static_cast(lx_raw) / 32767.0f); - float rx = applyDeadzone(static_cast(rx_raw) / 32767.0f); - - if (std::abs(lx) < 0.15f) - lx = 0.0f; - if (std::abs(rx) < 0.15f) - rx = 0.0f; - - float v_x = ly * max_v; // 선속도 m/s - float omega = 0.0f; // 각속도 rad/s - // --------------------------------------------------------------------- // LiDAR Obstacle Avoidance & Stopping Logic Integration // (요청에 따라 후진 시 측면 회피는 미적용 - 전진 시에만 좌우 회피 동작) @@ -1011,8 +1294,8 @@ int main(int argc, char **argv) { } } - // 2. Side Dodge Steering (전진 중에만 동작) - if (v_x > 0.01f && rx == 0.0f) { + // 2. Side Dodge Steering (전진 중, 사용자 조향 입력이 없을 때만 동작) + if (v_x > 0.01f && omega == 0.0f) { float right_intensity = 0.0f; float left_intensity = 0.0f; @@ -1054,17 +1337,18 @@ int main(int argc, char **argv) { } } - // 제자리 회전 여부: 왼쪽 스틱 전후(ly) 입력이 완전히 중립일 때만 진입한다. - // 그렇지 않으면(주행 중 오른쪽 스틱이 드리프트 등으로 미세하게라도 감지될 - // 경우) 전진 입력이 통째로 무시되고 제자리 회전 로직으로 튀어버려, 커브 - // 선회 중에 갑자기 이상하게 회전하려는 문제가 생긴다. ly는 applyDeadzone을 - // 거쳐 데드존 이하일 때 정확히 0.0f를 반환하므로 등호 비교가 안전하다. - bool is_spin_turn = std::abs(rx) > 0.0f && ly == 0.0f; + // 제자리 회전 여부: CH2(전후진) 입력이 완전히 중립(v_x == 0.0f)이면서 + // CH1(조향) 입력이 있을 때만 진입한다. v_x는 데드존 처리 시 정확히 + // 0.0f로 설정되므로 등호 비교가 안전하다. + bool is_spin_turn = (v_x == 0.0f) && (std::abs(omega) > 0.0f); if (is_spin_turn) { - // 제자리 회전 (Spin Turn) + 최소 회전반경용 미세 곡선 혼합 - omega = -rx * (max_spin_v / (effective_w / 2.0f)); - float v_bias = std::abs(rx) * max_spin_v * spin_arc_bias; + // 제자리 회전 (Spin Turn) + 최소 회전반경용 미세 곡선 혼합 (스크럽 + // 마찰 저항 감소를 위해 ICR을 로봇 중심에서 살짝 벗어나게 함) + float norm = (omega_max > 0.0f) + ? std::clamp(std::abs(omega) / omega_max, 0.0f, 1.0f) + : 0.0f; + float v_bias = norm * max_spin_v * spin_arc_bias; float v_l = v_bias - omega * (effective_w / 2.0f); float v_r = v_bias + omega * (effective_w / 2.0f); @@ -1073,33 +1357,13 @@ int main(int argc, char **argv) { target_rl = v_l * rpm_per_ms; target_rr = -v_r * rpm_per_ms; } else { - // 직진 및 차동 선회 Kinematics - if (std::abs(rx) == 0.0f && std::abs(lx) == 0.0f && - std::abs(omega) > 0.0f) { - // Automated avoidance steering active - float v_l = v_x - omega * k_skid; - float v_r = v_x + omega * k_skid; - target_fl = v_l * rpm_per_ms; - target_fr = -v_r * rpm_per_ms; - target_rl = v_l * rpm_per_ms; - target_rr = -v_r * rpm_per_ms; - } else { - // 선회 강도(omega)는 반드시 "현재 전진 속도(v_x)"에 비례해야 커브 - // 반경이 스로틀과 무관하게 일정하게 유지된다. 이전 구현은 상수인 - // max_v(최고속도)를 기준으로 omega를 계산해서, 저속 주행 중에는 - // v_x가 작은데도 omega*k_skid 항은 고속 기준 그대로 커서 안쪽 - // 바퀴(v_l 또는 v_r) 속도 부호가 뒤집혀 후진해버리는 문제가 있었다. - // (예: 저속으로 스틱을 왼쪽으로 조금만 꺾어도 로봇이 제자리 회전 - // 하듯 튀거나 뒤로 갔다 앞으로 갔다 하는 증상) - omega += -lx * (std::abs(v_x) / (effective_w / 2.0f)); - float v_l = v_x - omega * k_skid; - float v_r = v_x + omega * k_skid; - - target_fl = v_l * rpm_per_ms; - target_fr = -v_r * rpm_per_ms; - target_rl = v_l * rpm_per_ms; - target_rr = -v_r * rpm_per_ms; - } + // 직진 및 차동 선회 Kinematics (CH1 조향 + 라이다 회피 오프셋 포함) + float v_l = v_x - omega * k_skid; + float v_r = v_x + omega * k_skid; + target_fl = v_l * rpm_per_ms; + target_fr = -v_r * rpm_per_ms; + target_rl = v_l * rpm_per_ms; + target_rr = -v_r * rpm_per_ms; } // 직전 틱 피드백에서 무부하(들뜸)로 판정된 바퀴는 목표 속도를 0으로 낮춰 @@ -1114,7 +1378,26 @@ int main(int argc, char **argv) { if (airborne_rr) target_rr = 0.0f; - if (state == "STOPPED") { + // 3.1 브레이크 최우선 로직 (CH5/Fail-safe): 저크 램프를 건너뛰고 즉시 + // 0으로 스냅 후 브레이크를 잠근다. 해제되면 STOPPED 상태에서 아래 + // 상태머신이 정상적으로 재가속을 시작한다. + if (brake_on && !prev_brake_on) { + cmd_fl = cmd_fr = cmd_rl = cmd_rr = 0.0f; + accel_fl = accel_fr = accel_rl = accel_rr = 0.0f; + driver_front.setRPMs(0, 0); + if (driver_rear_ptr) + driver_rear_ptr->setRPMs(0, 0); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + driver_front.setBrakes(true); + if (driver_rear_ptr) + driver_rear_ptr->setBrakes(true); + state = "STOPPED"; + } + prev_brake_on = brake_on; + + if (brake_on) { + // target_fl..rr은 이미 0(v_x=omega=0)이며 STOPPED 상태를 유지한다. + } else if (state == "STOPPED") { if (std::abs(target_fl) > 0.1f || std::abs(target_fr) > 0.1f) { driver_front.setBrakes(false); if (driver_rear_ptr) @@ -1333,8 +1616,10 @@ int main(int argc, char **argv) { float t_ms = std::chrono::duration( std::chrono::steady_clock::now() - log_start_time) .count(); - log_stream << t_ms << ',' << state << ',' << ly << ',' << lx << ',' - << rx << ',' << cmd_fl << ',' << cmd_fr << ',' << cmd_rl + log_stream << t_ms << ',' << state << ',' << raw_steer << ',' + << raw_throttle << ',' << (rc_ok ? 1 : 0) << ',' + << (brake_on ? 1 : 0) << ',' << v_max_now << ',' << v_x << ',' + << omega << ',' << cmd_fl << ',' << cmd_fr << ',' << cmd_rl << ',' << cmd_rr << ',' << fl_fb << ',' << fr_fb << ',' << rl_fb << ',' << rr_fb << ',' << fl_amp << ',' << fr_amp << ',' << rl_amp << ',' << rr_amp << ',' << wheel_status_str[0] @@ -1344,9 +1629,10 @@ int main(int argc, char **argv) { << dist_axle << ',' << comm_ms << '\n'; } - printf("\r\033[K[%-8s] AXLE:%5.3fm | %-28s | I(A):FL%+4.1f FR%+4.1f " + printf("\r\033[K[%-8s] RC:%s%s AXLE:%5.3fm | %-28s | I(A):FL%+4.1f FR%+4.1f " "RL%+4.1f RR%+4.1f | WHL(FL/FR/RL/RR):%s%s | %4.1fms", - state.c_str(), dist_axle, lidar_telemetry.c_str(), fl_amp, fr_amp, + state.c_str(), rc_ok ? "OK" : "LOST", brake_on ? "[BRK]" : " ", + dist_axle, lidar_telemetry.c_str(), fl_amp, fr_amp, rl_amp, rr_amp, wheel_status_str, fault_active ? " [!!알람!!]" : "", comm_ms); fflush(stdout); @@ -1373,9 +1659,7 @@ int main(int argc, char **argv) { std::cout << "[정보] CSV 로그 저장 완료: " << log_path << "\n"; } - if (joystick) - SDL_JoystickClose(joystick); - SDL_Quit(); + rc.stop(); std::cout << "[정보] C++ 4WD 제어 프로그램이 성공적으로 종료되었습니다.\n"; return 0; diff --git a/xbox_motor_control_cpp b/xbox_motor_control_cpp index 417afb10131aee02b12ef4637dfa4eaa3ba45727..59e31672fea8fd65eba543d1c5a2ed35df6b2b71 100755 GIT binary patch literal 91704 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̾#oC1qob`zy%5Xf0KYl!kQQ!tEHyK>6NW+ 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 PFFajPo?pOF5M=)coqxg*