The move_group_interface


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM