跳到正文

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、速度、關節或導航目標,未做實車/模擬運動驗證。