Wiki
pb_teleop_twist_joy_node(手柄輸入與可替換控制入口)
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
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可能覆蓋導航,必須處理接線與控制權 |
源碼:自己的手柄控制器、實物啓動、仿真啓動。源碼中有這些路徑,不代表已驗證編譯後的運動效果;本次沒有啓動它。
繼續完善自己的方案時,優先明確以下四件事:
- 啓動選擇: 替換後主入口只啓動選定的手柄驅動和控制器;移除/關閉pb的Include,不靠刪參數來停節點,避免兩套驅動與映射一起啓動。
- 指令出口與模式: 導航和手動輸入分別進入可辨認的話題,由一個模式選擇環節送到執行端;手動未取得控制權時不要持續向最終話題發零。切換時處理已有導航目標和雲台目標所有權。
- 座標與單位: 導航最後cmd_vel按實際gimbal_yaw軸表達。自己的源碼只直接拷貝搖桿,未查詢TF;手動速度究竟按底盤還是雲台軸定義,必須與MCU協議一致。輸出JointState仍按pitch、yaw位置rad理解。當前最終速度約定
- 使能、限值與反饋: 保留已有斷流和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、速度、關節或導航目標,未做實車/仿真運動驗證。