跳到正文

Wiki

pb_teleop_twist_joy_node(手柄輸入與可替換控制入口)

約 23 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.pb_teleop_twist_joy_node(手柄輸入與可替換控制入口)

1.1.是否必須使用北極熊的手柄節點

可以不用,可以自己寫。對當前工程,更建議保留現成joy/joy_linux手柄驅動,繼續完善已有joy_bringup的映射與控制邏輯;北極熊節點保留作原工程復現參考。 自主導航需要目標請求和速度執行鏈,不要求必須通過本手柄節點發目標。

本節點提供兩種不同功能:manual_control把搖桿映射成底盤速度,auto_control把搖桿映射成相對機械人的導航目標;兩種模式都會把雲台搖桿積分成關節目標位置。當前配置為auto_control,因此底盤x、y的2.5/4.0在這條分支是目標偏移米數,不是實車速度上限。上游模式説明與源碼

方案 適用情況 對當前工程的建議
沿用pb_teleop_twist_joy 需要復現原包的手柄發Nav2前視目標、雲台聯動功能 可以作對照,但先核對本頁的目標、取消、限位和啓動問題
完善自己的joy_bringup 手動測試底盤/雲台,需要符合自己的協議與控制方式 建議作為後續維護方案;現有實現可繼續用,補齊使能、模式選擇和統一輸出出口
官方teleop_twist_joy加獨立雲台節點 主要需要通用Joy→Twist,願意分開處理雲台 可以複用底盤映射;官方通用節點不會自動提供本包的雲台積分或手柄發導航目標功能

上游README本身説明代碼較亂、不建議繼續基於它擴展,且README更新不及時;這可作為維護選擇的參考,具體功能仍以源碼為準。官方teleop_twist_joy提供Joy→Twist映射,同樣依賴joy處理輸入重發,不自帶整套機械人控制模式管理。北極熊README、官方Humble説明

1.1.1.當前“不使用北極熊節點”的註釋與啓動不一致

reality參數塊前面已經寫了“我們用的自己的teleop_twist_joy_node,不使用北極熊的節點”。但當前實物和仿真主入口仍無條件添加joy_teleop_launch;這個launch實際啓動joy的joy_node和pb_teleop_twist_joy_node,安裝副本也相同。註釋沒有停掉節點,本參數塊不能僅憑註釋標成已廢棄。

對應位置:實物入口、仿真入口、實際啓動節點。這裏只核對文件,沒有據此聲稱當前進程一定在運行。

自己的joy_bringup是另一套獨立啓動入口,不讀取本pb參數分組。若確定替換,應同時調整啓動入口、參數與速度出口;僅刪YAML塊會讓仍被啓動的pb節點改用源碼默認值,不等於禁用它。

北极熊当前auto_control:
    joy → 摇杆x/y × scale → 机器人参考系中的偏移点
        → TF换到map → NavigateToPose → Nav2规划/控制 → 速度链
    joy → 云台角速度 × ROS dt积分 → cmd_gimbal_joint目标位置

自己的joy_bringup:
    joy_linux → /joy → joy_node_cpp
        ├─ 直接底盘Twist → cmd_vel
        └─ 定时积分云台目标 → cmd_gimbal_joint
    不读取本块的enable_button、scale_chassis等参数

替换时的建议接线,尚未实施:
    导航最终速度 ─┐
                  ├─ 明确的模式/指令选择 → 唯一执行端输入
    手动速度 ─────┘
    两路先统一坐标、单位和自旋含义
實車上看到的現象 先核對什麼 當前源碼怎樣理解
已有自己的手柄節點,卻還出現pb發目標 主入口是否仍包含joy_teleop_launch 當前兩套主入口仍會啓動pb,註釋沒有改變啓動邏輯
把auto_control理解為MCU的自動模式 發佈的是Twist還是NavigateToPose 本字符串只選擇pb內部發送方式,不調用serial的set_mode
設scale_chassis.x=2.5,以為車速必為2.5 當前control_mode auto中為目標偏移2.5 m;manual才是線速度比例m/s
按R1沒按L1也能控制 turbo優先判斷 R1本身可進入turbo,不要求同時按L1
搖桿回中但上一導航目標仍在走 回中分支與取消分支 auto回中只不發新目標;釋放使能才走取消路徑
以為關節scale是目標角度上限 雲台積分公式 pitch/yaw scale是角速度比例,積分位置沒有本包內置上下限
自己節點空閒仍覆蓋導航速度 是否持續向最終cmd_vel發零 現有joy_bringup每10 ms發佈,失去輸入也發零;需要模式選擇,不能與導航直接競爭同一最終話題

本次本地及安裝pb包版本為1.0.2,安裝頭文件與本地一致;本地cpp/頭文件去除空白後與上游提交4a26966cb7958553677f4fe876d003c682c52b6d一致。原塊和安裝副本一致,simulation僅時鐘為True。本文保留參數説明,同時明確它是可替換的手柄入口,不是必須選用的導航組件。

1.2.參數

下面原樣保留髮送的24項參數及註釋。表格解釋pb實現,不會把這些值套到自己的joy_bringup。若以後從啓動中完整移除pb,本組參數才不再參與該節點運行。

pb_teleop_twist_joy_node:
  ros__parameters:
    use_sim_time: False
    robot_base_frame: gimbal_yaw
    control_mode: auto_control    # Option: auto_control, manual_control

    require_enable_button: true
    enable_button: 4              # L1 shoulder button
    enable_turbo_button: 5        # R1 shoulder button

    axis_chassis:
      x: 1                        # Left thumb stick vertical
      y: 0                        # Left thumb stick horizontal
      yaw: 6                      # button_left and button_right
    scale_chassis:
      x: 2.5
      y: 2.5
      yaw: 3.0
    scale_chassis_turbo:
      x: 4.0
      y: 4.0
      yaw: 6.0

    axis_gimbal:
      roll: -1                    # Disable
      pitch: 4                    # Right thumb stick vertical
      yaw: 3                      # Right thumb stick horizontal
    scale_gimbal:
      roll: 0.0
      pitch: -1.0
      yaw: 2.5
    scale_gimbal_turbo:
      roll: 0.0
      pitch: -1.5
      yaw: 3.5

1.2.1.ros__parameters(時鐘、參考系、模式與使能)

1.2.1.1.參數表
參數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
use_sim_time False;仿真True 不適用,布爾 上實物前必須核對並正確配置 決定雲台積分dt、目標節流時間和消息stamp使用的ROS時鐘 不適用 不適用 launch重寫已有鍵;本pb源碼沒有自己的斷流定時器;暫停/回跳/長間隔會影響積分和目標發送
robot_base_frame gimbal_yaw;源碼默認base_link 不適用,座標系名稱 上實物前必須核對並正確配置 auto中指定偏移點所在系,查詢map←此係TF 不適用 不適用 當前目標偏移沿實際雲台軸;manual默認Twist無frame_id,不因這個值自動換軸;Stamped模式僅寫header
control_mode auto_control;源碼默認manual_control 不適用,發送方式枚舉 根據實際功能需求開啓或設置 選擇手柄發送導航目標或直接底盤速度 不適用 不適用 auto走NavigateToPose,manual走Twist;不是MCU模式、不是導航接管仲裁;需用這兩個準確名稱
require_enable_button true;源碼默認True 不適用,布爾 通常保持當前值,不作為優先調試項 普通檔是否要求按enable_button才能發送底盤/雲台指令 不適用 不適用 True普通檔需L1;turbo另有優先分支,R1可單獨使能;False普通檔無需按鍵,不等於提供急停功能
enable_button 4;註釋L1 無量綱,Joy.buttons索引 上實物前必須核對並正確配置 普通檔使能按鈕 不適用,換成其他按鈕索引 不適用,換成其他按鈕索引 按實際Joy按鈕數組核對,註釋不保證所有手柄/驅動都相同;require=True且無turbo時使用
enable_turbo_button 5;註釋R1 無量綱,Joy.buttons索引 根據實際功能需求開啓或設置 優先選擇turbo檔並使能控制 不適用,換成其他按鈕索引 不適用;-1表示禁用turbo 兩鍵都按時turbo優先;R1無需L1;高速檔是否需要由真實操作需求決定
1.2.1.2.參數詳解
1.2.1.2.1.auto_control不是“開關自動駕駛模式”

auto按axis_chassis.x/y讀取搖桿,再乘當前檔scale,作為robot_base_frame中的目標位置偏移,查詢最新map←robot_base_frame TF轉換後發NavigateToPose。節流為ROS時間至少間隔0.25 s,名義最多4 Hz;實際頻率還取決於Joy回調、搖桿幅度和TF。目標生成

當前普通檔搖桿x=1表示在雲台軸前方取2.5 m偏移,turbo取4 m;不是要求底盤分別以2.5/4 m/s行駛。實際速度由Nav2控制器及速度鏈決定。目標會隨新Joy更新成新的前視點,不是直接轉發搖桿速度,也不通過axis_chassis.yaw給目標設朝向。

源碼只填寫局部Pose的position.x/y,沒有給orientation設置單位四元數;目標姿態構造需要修正/核對,不能把這條分支直接當作已經驗證的完整導航目標接口。沒有等待Action服務就緒或保留本節點的已接受目標句柄,本次未調用該Action驗證結果。

manual則直接發縮放後的Twist,不經本節點TF換軸,也沒有內置加減速平滑。默認輸出cmd_vel,當前導航平滑器訂閲的是cmd_vel_controller;不能因導航有velocity_smoother就認為手柄直髮速度也自動經過它。速度鏈與範圍

1.2.1.2.2.鬆開使能、搖桿回中與斷流

enable_turbo_button先判斷,滿足時直接turbo;否則檢查普通檔使能。失去使能時,在此前已發送過控制的條件下調用一次sendZeroCommand:auto向navigate_to_pose取消當前時刻以前的目標,同時發佈零Twist;不是持續發送零,也不等待確認取消已經完成。按鍵分支與停止

auto中abs(縮放後x)≤0.1且abs(縮放後y)≤0.1,只提前返回,不會取消上一目標。仍按着使能而鬆開搖桿時,車可能繼續完成此前目標,不能用“搖桿回中”代替Nav2取消。0.1比較的還是縮放後的座標偏移,普通檔與turbo對應的原始搖桿範圍不同。

取消按時間作用於同一個navigate_to_pose服務端,不只限定本節點保存的某個目標句柄;若其他決策客户端也發目標,需核對目標所有權。自己實現時宜保存並取消本次手柄目標,而不是靠跨客户端的時間取消充當模式仲裁。

本pb節點沒有Joy輸入年齡檢查,完全斷流時不會再進入釋放按鍵回調。雲台積分dt也沒有限制長間隔或回跳;重新來消息時可能把新角速度乘整個間隔。頭文件的sent_disable_msg_沒有顯式初始化,這個停止標誌還需要修正後才能依賴其初始狀態。上述為源碼邊界,本次沒有斷流或運動驗證。

1.2.2.底盤軸與比例(auto目標偏移、manual速度)

1.2.2.1.參數表

這裏使用完整參數名,明確每個分組的作用。軸索引是Joy.axes,不是Joy.buttons;註釋中的左右按鈕可能由驅動表達為一根軸,需核對實際消息。

參數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
axis_chassis.x 1 無量綱,axes索引 上實物前必須核對並正確配置 選擇底盤前後輸入軸 不適用,改輸入軸 不適用;-1禁用 auto用於目標x偏移,manual用於linear.x;不是速度或距離數值
axis_chassis.y 0 無量綱,axes索引 上實物前必須核對並正確配置 選擇底盤左右輸入軸 不適用,改輸入軸 不適用;-1禁用 auto用於目標y偏移,manual用於linear.y;需與參考系正方向一致
axis_chassis.yaw 6 無量綱,axes索引 當前運行不使用這個參數,暫不調整 manual選擇底盤旋轉輸入軸 不適用,改輸入軸 不適用;-1禁用 當前auto目標僅取x、y,不用此軸生成底盤轉角;6不是buttons[6]
scale_chassis.x 2.5 當前auto為m/單位軸值;manual為m/s/單位軸值 根據實際功能需求開啓或設置 普通檔前後目標偏移/速度比例 正值增大時偏移更遠;manual目標速度更大 正值減小時偏移更近;manual速度更小 當前是目標偏移,不是Nav2速度限制;係數符號決定方向
scale_chassis.y 2.5 當前auto為m/單位軸值;manual為m/s/單位軸值 根據實際功能需求開啓或設置 普通檔左右目標偏移/速度比例 正值增大時橫向偏移更遠;manual橫移更快 正值減小時偏移更近;manual橫移更慢 auto的輸入門檻在乘比例後檢查;不按合距離統一限幅
scale_chassis.yaw 3.0 rad/s/單位軸值,僅manual 當前運行不使用這個參數,暫不調整 普通檔底盤角速度比例 manual正值增大時轉動幅值更大 manual正值減小時轉動幅值更小 當前auto未使用;不是自動導航目標yaw或雲台角速度
scale_chassis_turbo.x 4.0 當前auto為m/單位軸值;manual為m/s/單位軸值 根據實際功能需求開啓或設置 turbo前後偏移/速度比例 正值增大時目標更遠;manual速度更大 正值減小時目標更近;manual速度更小 R1檔才使用;manual4 m/s直髮不自動受導航2.5限制
scale_chassis_turbo.y 4.0 當前auto為m/單位軸值;manual為m/s/單位軸值 根據實際功能需求開啓或設置 turbo左右偏移/速度比例 正值增大時橫向目標更遠;manual橫移更快 正值減小時目標更近;manual橫移更慢 x、y分別乘比例,若軸均1,auto偏移模長約5.66 m;這是計算例
scale_chassis_turbo.yaw 6.0 rad/s/單位軸值,僅manual 當前運行不使用這個參數,暫不調整 turbo底盤角速度比例 manual正值增大時轉動幅值更大 manual正值減小時轉動幅值更小 當前auto未使用;與fake_vel_transform的cmd_spin是不同輸入

getVal按axes[index]×scale計算;-1、缺少映射或超過消息軸數時返回0。它沒有把輸入軸統一夾到[-1,1]、檢查有限值或在這裏做死區;假定正常軸值範圍的滿杆輸出只是映射推算,不能當作異常輸入的硬上限。手柄型號、joy與joy_linux驅動不同,索引和正負方向均須用實際Joy消息核對。

1.2.3.雲台軸與比例(角速度積分成目標位置)

1.2.3.1.參數表
參數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
axis_gimbal.roll -1 無量綱,axes索引 當前運行不使用這個參數,暫不調整 配置了roll映射,當前禁用 不適用,換軸 不適用,-1禁用 fillJointStateMsg實際上只輸出pitch與yaw,改此軸不會新增roll關節控制
axis_gimbal.pitch 4 無量綱,axes索引 上實物前必須核對並正確配置 選擇雲台pitch輸入軸 不適用,換軸 不適用,-1禁用 兩種control_mode都使用;方向由比例正負及機械零位共同核對
axis_gimbal.yaw 3 無量綱,axes索引 上實物前必須核對並正確配置 選擇雲台yaw輸入軸 不適用,換軸 不適用,-1禁用 兩種control_mode都使用;是雲台相對關節目標,不是底盤旋轉
scale_gimbal.roll 0.0 當前未進入關節計算 當前運行不使用這個參數,暫不調整 保存普通檔roll比例 當前實現無roll輸出變化 當前實現無roll輸出變化 不是已實現的roll限位或角度設置
scale_gimbal.pitch -1.0 rad/s/單位軸值 上實物前必須核對並正確配置 普通檔pitch積分速度比例,負號反向 負值向0提高時速度幅值減小 負值更負時速度幅值增大 不是pitch目標角度下限;持杆位置按dt累計,沒有本包內置軟限位
scale_gimbal.yaw 2.5 rad/s/單位軸值 根據實際功能需求開啓或設置 普通檔yaw積分速度比例 正值增大時目標角累計更快 正值減小時累計更慢 不是yaw目標角度上限;沒有自動按實際關節反饋重新對齊
scale_gimbal_turbo.roll 0.0 當前未進入關節計算 當前運行不使用這個參數,暫不調整 保存turbo的roll比例 當前實現無roll輸出變化 當前實現無roll輸出變化 改此值不產生roll關節命令
scale_gimbal_turbo.pitch -1.5 rad/s/單位軸值 上實物前必須核對並正確配置 turbo的pitch積分速度比例 負值向0提高時幅值減小 負值更負時幅值增大 R1檔使用,當前幅值為普通檔1.5倍;仍需另行處理pitch位置限位
scale_gimbal_turbo.yaw 3.5 rad/s/單位軸值 根據實際功能需求開啓或設置 turbo的yaw積分速度比例 正值增大時累計更快 正值減小時累計更慢 R1檔使用;比例不是輸出位置的限幅
1.2.3.2.雲台積分、初始位置與時間

源碼保存從0開始的static pitch、yaw,每次已使能Joy回調更新:

pitch_target += axes[4] × 当前档pitch比例 × ROS dt
yaw_target   += axes[3] × 当前档yaw比例   × ROS dt
发布JointState:name=[gimbal_pitch_joint, gimbal_yaw_joint]
                position=[pitch_target, yaw_target]

position單位為rad,比例單位為rad/s;例如普通檔pitch軸為+1且dt=0.05 s,一次目標增量為-0.05 rad。這是公式示例,不是實測雲台角度。兩個目標沒有按當前實測關節初始化,也沒有pitch夾緊、yaw行程保護或dt異常保護。積分實現

鬆開使能不會發布新的雲台停止位置,而是停止調用該積分發送分支;末次位置是否繼續執行由接收端決定。控制節點也沒有自己的固定積分定時器,回調頻率由上游Joy消息和重發決定。當前PB joy launch配置deadzone=0.3、autorepeat_rate=20 Hz,這兩項屬於輸入驅動配置,不在原24項參數中。

1.2.4.相關源碼默認項(原YAML未顯式配置)

1.2.4.1.參數表

下面僅補兩項與底盤輸出格式有關的默認值,沒有向原YAML追加。pb源碼另有其他映射與發佈功能,本頁不把未發送的配置當作已經完整關閉全部額外輸出。

參數名 當前值 單位 實車處理建議 作用 調大效果 調小效果 生效條件/備註
publish_stamped_twist False,源碼默認 不適用,布爾 通常保持當前值,不作為優先調試項 選擇cmd_vel發佈Twist還是TwistStamped 不適用 不適用 當前接收鏈用Twist;True只加header,不自動轉換參考系,也不能與Twist訂閲器直接匹配
inverted_reverse False,源碼默認 不適用,布爾 當前運行不使用這個參數,暫不調整 manual倒退且linear.x<0時,可反轉底盤angular.z 不適用 不適用 當前auto不走fillCmdVelMsg;不是反轉雲台yaw/pitch,也不是通用座標轉換

除use_sim_time由rclcpp時間源管理外,本頁pb功能參數在構造時讀取,沒有對應的參數更新回調。運行中改control_mode、按鍵或比例,不等於已有成員和Action客户端已經聯動改變;需重啓該節點再核對。也不能把自己的節點命名成同一個名字,就認為它自動擁有這些參數實現。

1.2.5.自己的joy_bringup已經有哪些功能,還缺什麼

本次讀到自己的Joy_Node/joy_node_cpp源碼及已安裝launch:

內容 自己的當前實現 相對於本塊的含義
手柄讀取 joy_linux_node,/dev/input/js0,配置50 Hz重發 可繼續複用驅動,不必從USB設備讀取重新寫起
底盤映射 vx=axes[1]、vy=axes[0]、wz=axes[6]×π 沒讀取pb的2.5/4.0或L1/R1;按正常軸範圍為±1 m/s、±π rad/s的請求
雲台映射 yaw速度axes[3]×2.5,pitch速度axes[4]×1.0 pitch符號與pb的-1.0不同;結合機械和操作方向核對,不憑註釋認定哪邊正確
雲台積分 10 ms牆鍾定時,按ROS dt積分;僅0<dt≤0.1時積分 已處理暫停、回跳及過長dt;不是pb的Joy回調間隔積分
輸入保護 檢查至少7軸和已用軸有限值;steady_clock超過0.5 s置零速度 已有斷流置零路徑,不依賴再收到鬆開按鍵消息
pitch範圍 當前源碼夾到[-0.60,0.45] rad 已有軟限位,但這是當前代碼值,仍需核對真實機械範圍
按鍵與檔位 未讀取Joy.buttons,未做L1/R1使能和turbo 不是完整復刻本pb配置,按需要補功能即可
導航/手動切換 沒有Nav2目標客户端或統一指令選擇;每10 ms發Twist 空閒也持續發零,若與導航共享最終cmd_vel可能覆蓋導航,必須處理接線與控制權

源碼:自己的手柄控制器、實物啓動、仿真啓動。源碼中有這些路徑,不代表已驗證編譯後的運動效果;本次沒有啓動它。

繼續完善自己的方案時,優先明確以下四件事:

  1. 啓動選擇: 替換後主入口只啓動選定的手柄驅動和控制器;移除/關閉pb的Include,不靠刪參數來停節點,避免兩套驅動與映射一起啓動。
  2. 指令出口與模式: 導航和手動輸入分別進入可辨認的話題,由一個模式選擇環節送到執行端;手動未取得控制權時不要持續向最終話題發零。切換時處理已有導航目標和雲台目標所有權。
  3. 座標與單位: 導航最後cmd_vel按實際gimbal_yaw軸表達。自己的源碼只直接拷貝搖桿,未查詢TF;手動速度究竟按底盤還是雲台軸定義,必須與MCU協議一致。輸出JointState仍按pitch、yaw位置rad理解。當前最終速度約定
  4. 使能、限值與反饋: 保留已有斷流和dt保護,按需要加手柄使能、速度範圍、雲台初始化和實際機械限位;auto若要用手柄發導航目標,再單獨實現有效Pose和目標句柄管理。

替換手柄節點不要求重寫Nav2的規劃器、控制器或速度平滑器,也不要求同時改MCU協議;是否需要改協議由當前接口是否能表達選定控制方式決定。本次只提供選擇和適配依據,沒有代替用户修改啓動、手柄代碼或協議。

1.2.6.本次核對與驗證範圍

  • 已核對: pb包1.0.2與頭文件、固定上游源碼;24項原參數和兩套安裝副本;實物/仿真入口及joy_teleop安裝副本;自己的joy_bringup源碼、輸入驅動配置和安裝launch;串口訂閲cmd_vel及cmd_gimbal_joint。
  • 源碼能確認: auto偏移與manual速度的不同單位;turbo優先使能;雲台角速度積分;當前yaw/roll不使用項;啓動註釋與實際Include不一致;兩套節點在指令輸出上的適配缺口。
  • 建議: 繼續完善自己的joy_bringup,保留北極熊配置作參考;如暫時完整復現北極熊auto功能,可先使用其節點,但須處理本頁列出的實現條件,不能同時任由兩套節點向同一執行入口發送。
  • 本次範圍: 僅整理文檔與目錄,未更改主入口、節點配置或原始碼,未查詢/改變當前控制模式,未發送Joy、速度、關節或導航目標,未做實車/仿真運動驗證。