ROS 問題系列(一):Robot State相關
- 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迴圈條件中的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。