MoveIt!之ROS1Melodic版本發布(MoveItCpp教程)
moveit!(1.0.5)之ROS1Melodic版本發布~~
moveit_cpp:
對于通過C++類方便地訪問MoveIt!功能的用戶,有一個全新的高級API。
官方文檔:https://ros-planning.github.io/moveit_tutorials/doc/getting_started/getting_started.html
教程版本:專業級
這是正在積極開發的最新版本。對于初學者,我們推薦穩定的Melodic教程。如果仍在運行Kinetic版本,請使用Kinetic教程。
MoveItCpp教程
介紹
MoveItCpp是一個新的高級接口,它是不需要使用ROS操作,服務和消息即可訪問核心MoveIt! 功能的統一C++ API,并且是現有MoveGroup API的替代方法(不是完全替代),建議該界面適用于需要更多實時控制的高級用戶或行業應用。PickNik Robotics已根據許多商業應用開發了此接口。
入門
如果尚未這樣做,請確保已完成“入門”中的步驟。
運行代碼
打開一個shell,運行啟動文件:
roslaunch moveit_tutorials moveit_cpp_tutorial.launch
注意:本教程使用RvizVisualToolsGui面板逐步演示。要將此面板添加到RViz,請遵循“?可視化教程”中的說明。
片刻之后,將出現RViz窗口,其外觀類似于此頁面頂部的窗口。要通過每一步演示或者按進度在接下來的按鈕RvizVisualToolsGui在屏幕的底部面板或選擇關鍵工具的工具,在屏幕的頂部面板,然后按你的鍵盤上N,此時RViz為活動窗口。
整個代碼
完整的代碼可以在MoveIt GitHub項目中找到。接下來,逐步地講解代碼,解釋其功能。
配置
static const std::string PLANNING_GROUP = "panda_arm"; static const std::string LOGNAME = "moveit_cpp_tutorial"; /* Otherwise robot with zeros joint_states */
/ *否則,機器人的關節編號為零* /
ros::Duration(1.0).sleep(); ROS_INFO_STREAM_NAMED(LOGNAME, "Starting MoveIt Tutorials..."); auto moveit_cpp_ptr = std::make_shared
可視化
MoveItVisualTools軟件包提供了許多功能,用于可視化RViz中的對象,機器人和軌跡以及調試工具(例如腳本的逐步自省)
moveit_visual_tools::MoveItVisualTools visual_tools("panda_link0", rvt::RVIZ_MARKER_TOPIC, moveit_cpp_ptr->getPlanningSceneMonitor()); visual_tools.deleteAllMarkers(); visual_tools.loadRemoteControl(); Eigen::Isometry3d text_pose = Eigen::Isometry3d::Identity(); text_pose.translation().z() = 1.75; visual_tools.publishText(text_pose, "MoveItCpp Demo", rvt::WHITE, rvt::XLARGE); visual_tools.trigger();
開始演示
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to start the demo");
使用MoveItCpp進行規劃
在以下計劃示例中說明了設置規劃開始和目標狀態的多種方法。
規劃1
我們可以將規劃的開始狀態設置為機器人的當前狀態
planning_components->setStartStateToCurrentState();
設置計劃目標的第一種方法是使用geometry_msgs :: PoseStamped ROS消息類型,如下所示
geometry_msgs::PoseStamped target_pose1; target_pose1.header.frame_id = "panda_link0"; target_pose1.pose.orientation.w = 1.0; target_pose1.pose.position.x = 0.28; target_pose1.pose.position.y = -0.2; target_pose1.pose.position.z = 0.5; planning_components->setGoal(target_pose1, "panda_link8");
現在,調用PlanningComponents來計算規劃并對其進行可視化。請注意,我們只是在規劃
auto plan_solution1 = planning_components->plan();
檢查PlanningComponents是否成功找到規劃的解
if (plan_solution1) {
在Rviz中可視化起始姿勢
visual_tools.publishAxisLabeled(robot_start_state->getGlobalLinkTransform("panda_link8"), "start_pose"); visual_tools.publishText(text_pose, "Start Pose", rvt::WHITE, rvt::XLARGE);
在Rviz中可視化目標姿勢
visual_tools.publishAxisLabeled(target_pose1.pose, "target_pose"); visual_tools.publishText(text_pose, "Goal Pose", rvt::WHITE, rvt::XLARGE);
在Rviz中可視化軌跡
visual_tools.publishTrajectoryLine(plan_solution1.trajectory, joint_model_group_ptr); visual_tools.trigger(); /* Uncomment if you want to execute the plan */ /* planning_components->execute(); // Execute the plan */ }
開始下一個規劃
visual_tools.deleteAllMarkers(); visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
規劃2
在這里,我們將使用moveit :: core :: RobotState設置規劃的當前狀態。
auto start_state = *(moveit_cpp_ptr->getCurrentState()); geometry_msgs::Pose start_pose; start_pose.orientation.w = 1.0; start_pose.position.x = 0.55; start_pose.position.y = 0.0; start_pose.position.z = 0.6; start_state.setFromIK(joint_model_group_ptr, start_pose); planning_components->setStartState(start_state);
將重用曾經的舊目標并對其進行規劃。
auto plan_solution2 = planning_components->plan(); if (plan_solution2) { moveit::core::RobotState robot_state(robot_model_ptr); moveit::core::robotStateMsgToRobotState(plan_solution2.start_state, robot_state); visual_tools.publishText(text_pose, "Start Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(robot_state.getGlobalLinkTransform("panda_link8"), "start_pose"); visual_tools.publishText(text_pose, "Goal Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(target_pose1.pose, "target_pose"); visual_tools.publishTrajectoryLine(plan_solution2.trajectory, joint_model_group_ptr); visual_tools.trigger(); /* Uncomment if you want to execute the plan */
/ *如果要執行計劃,請取消注釋* /
/* planning_components->execute(); // Execute the plan */ }
開始下一個規劃
visual_tools.deleteAllMarkers(); visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
規劃3
我們還可以使用moveit :: core :: RobotState設置規劃的目標
auto target_state = *robot_start_state; geometry_msgs::Pose target_pose2; target_pose2.orientation.w = 1.0; target_pose2.position.x = 0.55; target_pose2.position.y = -0.05; target_pose2.position.z = 0.8; target_state.setFromIK(joint_model_group_ptr, target_pose2); planning_components->setGoal(target_state);
將重用以前的開始,并從中規劃。
auto plan_solution3 = planning_components->plan(); if (plan_solution3) { moveit::core::RobotState robot_state(robot_model_ptr); moveit::core::robotStateMsgToRobotState(plan_solution3.start_state, robot_state); visual_tools.publishText(text_pose, "Start Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(robot_state.getGlobalLinkTransform("panda_link8"), "start_pose"); visual_tools.publishText(text_pose, "Goal Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(target_pose2, "target_pose"); visual_tools.publishTrajectoryLine(plan_solution3.trajectory, joint_model_group_ptr); visual_tools.trigger(); /* Uncomment if you want to execute the plan */
/ *如果要執行計劃,請取消注釋* /
/* planning_components->execute(); // Execute the plan */ }
開始下一個規劃
visual_tools.deleteAllMarkers(); visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
規劃4
我們可以將規劃的開始狀態設置為機器人的當前狀態,可以使用熊貓機器人的組狀態名稱來設置計劃的目標,我們為“ panda_arm”計劃組命名為“ ready”的機器人狀態參見panda_arm.xacro
/* // Set the start state of the plan from a named robot state */
/ * //從已命名的機器人狀態設置計劃的開始狀態* /
/* planning_components->setStartState("ready"); // Not implemented yet */
從命名的機器人狀態設置計劃的目標狀態
planning_components->setGoal("ready");
再次,我們將重用我們曾經的舊起點并從中計劃。
auto plan_solution4 = planning_components->plan(); if (plan_solution4) { moveit::core::RobotState robot_state(robot_model_ptr); moveit::core::robotStateMsgToRobotState(plan_solution4.start_state, robot_state); visual_tools.publishText(text_pose, "Start Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(robot_state.getGlobalLinkTransform("panda_link8"), "start_pose"); visual_tools.publishText(text_pose, "Goal Pose", rvt::WHITE, rvt::XLARGE); visual_tools.publishAxisLabeled(robot_start_state->getGlobalLinkTransform("panda_link8"), "target_pose"); visual_tools.publishTrajectoryLine(plan_solution4.trajectory, joint_model_group_ptr); visual_tools.trigger(); /* Uncomment if you want to execute the plan */
/ *如果要執行計劃,請取消注釋* /
/* planning_components->execute(); // Execute the plan */ }
啟動文件
整個啟動文件是這里?GitHub上。本教程中的所有代碼都可以從MoveIt設置中包含的moveit_tutorials包中運行。
附加功能:
允許時間最優軌跡生成的輸入軌跡密度的參數化
通過ompl_planning.yaml在ModelBasedPlanningContext中添加對雜交/內插標志的支持
提高PlanningSceneDisplay的響應速度
在PlanningComponent中使用plan_request_params
提供在rviz中縮放大網格
加快PlanningSceneDisplay
添加對PS4游戲桿的支持
將use_rviz添加到setup_assistant配置助手中的demo.launch
Bug修復:包括異常行為,程序段故障,內存泄漏和Python3支持等。
機器人
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。