1. 程式人生 > 其它 >ROS 問題系列(一):Robot State相關

ROS 問題系列(一):Robot State相關

技術標籤:rosros topicC++c++ROS

  1. Failed to fetch current robot state
    當在程式中使用move_group.getCurrentJointValues()獲取當前機器人的關節值時,程式執行到move_group.getCurrentJointValues()時,就會有如下報警。
Didn't received robot state (joint angles) with recent timestamp within 1 seconds.
Check clock synchronization if your are running ROS across multiple machines!
[ERROR] [1610024438.211652653]: Failed to fetch current robot state

原因分析
在1s的時間內,沒有等到robot state的更新。

通過對報警資訊的分析,發現函式呼叫關係為:move_group.getCurrentJointValues() → move_group_interface.cpp/getCurrentState() /current_state_monitor_->waitForCurrentState() → current_state_monitor.cpp/planning_scene_monitor::CurrentStateMonitor::waitForCurrentState(),報警直接原因是函式waitForCurrentState

()中while迴圈條件一直滿足,使得while內部處理滿足異常條件,導致報警。

繼續分析發現while迴圈條件中的current_state_time_值始終沒有更新,進一步分析發現更新current_state_time_值的回撥函式current_state_monitor.cpp/jointStateCallback() 沒有被呼叫到,而該回調函式current_state_monitor.cpp/jointStateCallback()是通過訂閱 topic /joint_states (<sensor_msgs::JointState>)實現的,而本人在使用函式move_group.getCurrentJointValues()過程前後,系統並沒有釋出topic /joint_states。

解決方案
專門建立一個節點或一個執行緒來發布topic /joint_states,類似於節點joint_state_publisher的功能,本人是專門建立一個執行緒定週期釋出 /joint_states。

補充
當時考慮到一個問題,系統為什麼需要訂閱topic /joint_states

個人想到一個解釋(不一定正確),move_group.getCurrentJointValues()獲取的資訊屬於機器人狀態(robot state)。對於機器人系統而言,一切狀態源於各關節軸的實際關節值,因此要想獲取機器人的某些狀態(笛卡爾位姿等),需要先知道關節狀態,因此需要訂閱topic /joint_states,所以需要有執行緒和節點來發布該topic。