ROS-Industrial 之 industrial_robot_client Overview
按照在ROS-Industrial Overview路線部分所說的,在完成ROS-I框架最底的一層之後,還要分析理解simple_message和industrial_robot_client兩大部分才算相對完整的理解ROS-I如何與已有的機器人控制器進行融合,此前的simple_message的概述中大體的說明了一些與simple_message相關的資訊,而在此文章中繼續從總體的角度先來了解一下industrial_robot_client。
概述
概括起來說就是一句話:industrial_robot_client包含通用的客戶端,用於連線內部包含有遵循simple_message協議的伺服器的工業機器人控制器。
industrial_robot_client提供標準的基
最主要的,這個package提供了industrial_robot_client庫,其目的是通過這個庫利用標準的C++的派生類機制,實現特定於機器人的程式碼重用,以避免當前工業機器人驅動程式實現中的大量複製/貼上操作。有關如何修改相應的庫程式碼以適應新機器人的方法將在文章下一部分進行說明。
industrial_robot_client中還提供了通用的程式碼用於展示其基本功能,如果機器人不需要特定的客戶端程式碼,那麼完全可以執行package中的標準節點。
針對機器人特定需求的修改
通常,由於製造商所提供的介面以及其機器人設計上的差異,需要對industrial_robot_client庫中提供的基本參考實現進行修改。關節耦合、速度縮放和通訊協議都是導致機器人專用控制程式碼的潛在原因。
例子
接下來的例項用來說明如何用絕對速度計算演算法替換參考速度計算方法(速度為最大速度百分比的參考速度計算方法)。
- 建立一個新的繼承 JointTrajectoryDownloader (或者 JointTrajectoryStreamer)的驅動類。
class myRobot_JointTrajectoryDownloader : JointTrajectoryDownloader
{
...
}
- 重寫具體的函式功能。比如速度計算函式。
class myRobot_JointTrajectoryDownloader : JointTrajectoryDownloader
{
public:
bool calc_velocity(const trajectory_msgs::JointTrajectoryPoint& pt, double* rbt_velocity)
{
if (pt.velocities.empty())
*rbt_velocity = SAFE_SPEED;
else
*rbt_velocity = std::min(pt.velocities.begin(), pt.velocities.end());
return true;
}
}
- 使用適當派生類的例項實現一個新節點。
int main(int argc, char** argv)
{
// initialize node
ros::init(argc, argv, "motion_interface");
myRobot_JointTrajectoryDownloader motionInterface;
motionInterface.init();
motionInterface.run();
return 0;
}
更深入的例子
更加深入一點的例子可以參考ABB client。
generic_implementation
industrial_robot_client/generic_implementation中描述瞭如何啟動和接入由industrial_robot_client包提供的通用機器人介面節點,這些節點可以不經修改用來控制“標準”的機器人,但要定製機器人的控制程式則還是要回去研究industrial_robot_client。
在執行節點之前,使用者必須首先確定機器人端伺服器程式碼所需的位置控制方法。ROS-Industrial規範給出了幾種不同的位置控制方法,這取決於應用程式的需要和機器人的能力。所有支援的方法都與/joint_path_command和 /joint_states話題相容以支援ROS arm_navigation和MoveIt。
流介面(Streaming Interface)
流介面將軌跡指令線上的傳送給機器人,即機器人是一邊執行接收到的軌跡指令一邊接收新的軌跡資訊。在ROS級別這在功能上等同於下載介面,特別是一些機器人要求在驅動程式級別點資料以流的形式進行傳送,其啟動命令如下所示:
roslaunch industrial_robot_client robot_interface_streaming.launch robot_ip:=<value>
下載介面(Download Interface)
下載介面是在機器人執行運動指令之前將整個軌跡下載到機器人控制器。
roslaunch industrial_robot_client robot_interface_download.launch robot_ip:=<value>
引數(Parameters)
通用的機器人介面節點需要關鍵引數對控制節點的行為,一些引數是在launch檔案中直接設定的,一些則需要進行手動設定。
- robot_ip_address
設定機器人控制器的IP地址,在launch檔案或命令列中手動指定都可以。 - controller_joint_names(可選)
列出用於ROS trajectory topics的關節名稱,名稱要匹配URDF檔案,名稱順序要匹配控制器資料解析順序,可以被用來進行關節的重新排序,預設設定為”joint_1, joint_2, … joint_6”。 - robot_description(可選)
機器人的URDF檔案描述,用來獲取機器人每個關節的速度限制與速度縮放比例,同時還要匹配控制器中的速度資訊,預設設定JointTrajectoryInterface 中會規定一個安全速度“safe”。
節點(Nodes)
所有industrial_robot_client的啟動檔案都提供相同的節點和主題。
robot_state
從工業機器人控制器中反饋機器人的位置和狀態資料。
Published Topics
- joint_states (control_msgs/JointState)
Joint trajectory feedback messages. - feedback_states (control_msgs/FollowJointTrajectoryFeedback)
Joint trajectory feedback messages. - robot_status (industrial_msgs/RobotStatus)
Robot status messages.
Parameters
- robot_ip_address (string)
機器人控制器的IP地址。
motion_*_interface
向工業機器人控制器傳送軌跡資訊。
Subscribed Topics
- joint_path_command (trajectory_msgs/JointTrajectory)
關節軌跡命令資料。
Parameters
- robot_ip_address (string)
控制器IP地址。
joint_trajectory_action
控制機器人運動的Action介面。
Subscribed Topics
- joint_trajectory_action/goal(control_msgs/FollowJointTrajectoryActionGoal)
描述機器人要跟蹤的軌跡。 - joint_trajectory_action/cancel (actionlib_msgs/GoalID)
用於取消目標的請求。 - feedback_states (control_msgs/FollowJointTrajectoryFeedback)
監聽控制器的狀態。
Published Topics
- joint_path_command (trajectory_msgs/JointTrajectory)
向機器人控制器傳送關節軌跡。 - joint_trajectory_action/feedback(control_msgs/FollowJointTrajectoryActionFeedback)
反饋機器人對軌跡的跟蹤進度。 - joint_trajectory_action/status (actionlib_msgs/GoalStatusArray)
提供傳送到Action的目標狀態資訊。 - joint_trajectory_action/result(control_msgs/FollowJointTrajectoryActionResult)
命令的執行結果。