move_group_interface是MoveIt!提供的主要的API接口。支持C++和Python。
該接口使得MoveIt!更容易在ROS中使用。ROS API主要通過constraints等來配置,一個末端執行器的位置約束或者整個機器人的關節約束。
move_group_interface允許用戶直接來將這些約束配置設置到一個期望位置,方向。或者做整個機器人的關節配置。
1. 規划到一個姿態目標
下面的代碼是展示通過C++ API規划一個機器人到目標姿態。
1 moveit::planning_interface::MoveGroup group("right_arm"); 2 3 geometry_msgs::Pose target_pose1; 4 target_pose1.orientation.w = 1.0; 5 target_pose1.position.x = 0.28; 6 target_pose1.position.y = -0.7; 7 target_pose1.position.z = 1.0; 8 group.setPoseTarget(target_pose1); 9 10 moveit::planning_interface::MoveGroup::Plan my_plan; 11 bool success = group.plan(my_plan);
2. 規划到一個關節目標
1 std::vector<double> group_variable_values; 2 group.getCurrentState()->copyJointGroupPosition(group.getCurrentState()->getRobotModel()->getJointModelGroup(group.getName()),group_variable_values); 3 4 group_variable_values[0] = -1.0; 5 group_setJointValueTarget(group_variable_values); 6 7 moveit::planning_interface::MoveGroup::Plan my_plan; 8 success = group.plan(my_plan);
首先,我們為group獲得當前關節的值。然后,我們設置一個關節值來指定新的目標。如果目標是關節限制以外的,就無法進行規划。
3. 移動到目標關節或者姿態。
移動到目標姿態和關節的進程和規划時候基本上是一樣的。只是到最后,我們調用的是move()函數而不再是plan()函數。
success = group.move(my_plan);
4. 向環境中添加物體對象。
使用C++或者Python 的API能夠很容易的通過Rviz的運動規划插件向環境中添加物體。這個運動規划插件允許用戶直接導入.STL文件。可以用來調整的主要參數是添加對象的碰撞模型和物體的定位。MoveIt!允許使用不同類型的碰撞模型,包括像一些基本形狀(box,cylinder,sphere,cone)和mesh models網狀模型。網狀模型應當設置為盡可能少的三角形數量。
工作隔間組件可以直接使用PlanningScenceInterface類來添加。
1 moveit::planning_interface::PlanningSceneInterface planning_scene_interface; 2 moveit_msgs::CollisionObject collision_object; 3 collision_object.header.frame_id = group.getPlanningFrame(); 4 collision_object.id= "box1"; 5 6 /* Define a box to add to the world. */ 7 shape_msgs::SolidPrimitive primitive; 8 primitive.type = primitive.Box; 9 primitive.dimensions.resize(3); 10 primitive.dimensions[0] = 0.4; 11 primitive.dimensions[1] = 0.1; 12 primitive.dimensions[2] = 0.4; 13 14 geometry_msgs::Pose box_pose; 15 box_pose.orientation.w = 1.0; 16 box_pose.orientation.x = 0.6; 17 box_pose.orientation.y = -0.4; 18 box_pose.orientation.z = 1.2; 19 20 collision_object.primitives.push_back(primitive); 21 collision_object.primitives_poses.push_back(box_pose); 22 collision_object.operation = collision_object.ADD; 23 24 std::vector<moveit_msgs::CollisionObject> collision_object; 25 collision_objects.push_back(collision_object); 26 27 planning_scene_interface.addCollisionObjects(collision_objects);
在環境中attach和detach這些碰撞對象也是很簡單的。最重要的呢就是要保證在attach之前已經將對象添加到了環境中。
/* Attach the object */ group.attachObject(collision_object.id); /* Detach the object */ group.detachObject(collision_object.id);
5. 有用的一些提示
萬一所有的事情並沒有按照預期進行的話,就需要用戶進行debug了。這里有一些有用的提示,來告訴我們當錯誤出現時如何進行修復。
- 機器人不動: 如果機器人的關節限制不合適的話,機器人是不會動的。檢查機器人的URDF文件,確保每個關節有一個可移動的范圍值。檢查並確保最大關節值比最小關節值大。
- 當我定義軟限制時機器人不移動: 如果在機器人的URDF文件中定義軟限制,這些限制都會被MoveIt!所使用,所以一定要確保它們是可用的。
- 運動規划沒能正確產生:檢查關節配置中有沒有兩部分產生了自沖突。尤其是你在URDF中添加了新的部分但是還沒有用MoveIt! Setup Assistant進行配置時。如果有機器人部件變紅,則是他們產生了沖突。運行MoveIt! Setup Assistant來為配置整個機器人以確保碰撞檢測。
- GUI接口不能正確工作:6個或者更多自由度的機器人能夠在Rviz中很好地運行。少於6個自由度的機器人是比較難通過這個插件進行使用的。
- 動作規划到碰撞區域去了:MoveIt!用一個離散值來檢查每一個運動規划片段,如果這個離散值太大的話,運動片段就不能被合適的檢查,就有可能產生沖突。這個值在ompl_planning.yaml文件中的longest_valid_segment參數來配置。如果使用Rviz,請確保你在規划之前已經按下了Publish Planning Scene按鈕。
6. 參考資源
moveit.ros.org/documentation/tutorials/