机械臂仿真记录贴(3)

这次主要记录一些官方文档的解读

一、我对机械臂的操控:

1.加载demo.launch

2.另开一个终端来规划运动(rosrun)

二、对照官方文档的Motion Planning

我用的是movegroup接口,gpt对两个接口的解释如下↓,可以通过我的代码和motion planning代码的对比更好的理解“高层”和“底层”这两个相对的概念,平常使用的时候使用movegroup就够了!!

机械臂仿真记录贴(3)_第1张图片

我规划运动引用的头文件↓,来看看官方文档对motion planning的解读

#include 
#include 

#include 
#include 

#include 
#include 

#include 
#include 
#include 
#include "kinematics.h"
#include 

Motion Planning API — moveit_tutorials Melodic documentation

官方文档的实例代码par1:

const std::string PLANNING_GROUP = "panda_arm";
robot_model_loader::RobotModelLoader robot_model_loader("robot_description");
robot_model::RobotModelPtr robot_model = robot_model_loader.getModel();
/* Create a RobotState and JointModelGroup to keep track of the current robot pose and planning group*/
robot_state::RobotStatePtr robot_state(new robot_state::RobotState(robot_model));
const robot_state::JointModelGroup* joint_model_group = robot_state->getJointModelGroup(PLANNING_GROUP);

我的代码part1

//ros初始化需要的几行代码,创建一个 ROS 节点(Node),并启动一个异步的 ROS spinner。
ros::init(argc, argv, "move_group_interface_tutorial_zyw");
ros::NodeHandle node_handle;
ros::AsyncSpinner spinner(1);
spinner.start();
//可以用rosnode list来查看运行的节点


//和上面的官方文档对应的几行代码
static const std::string PLANNING_GROUP = "arm";
const robot_state::JointModelGroup* joint_model_group =move_group.getCurrentState()->getJointModelGroup(PLANNING_GROUP);

可以看到2-5行代码是没有的,因为我还运行了 一个demo.launch,里面有模型的加载

机械臂仿真记录贴(3)_第2张图片

官方文档part2:

显示加载moveit的运动插件,在我的代码里面没有这一部分,我使用的是moveit提供的高层接口MoveGroupInterface,里面很多设置都是默认的

if (!node_handle.getParam("planning_plugin", planner_plugin_name))
  ROS_FATAL_STREAM("Could not find planner plugin name");
try
{
  planner_plugin_loader.reset(new pluginlib::ClassLoader(
      "moveit_core", "planning_interface::PlannerManager"));
}
catch (pluginlib::PluginlibException& ex)
{
  ROS_FATAL_STREAM("Exception while creating planning plugin loader " << ex.what());
}
try
{
  planner_instance.reset(planner_plugin_loader->createUnmanagedInstance(planner_plugin_name));
  if (!planner_instance->initialize(robot_model, node_handle.getNamespace()))
    ROS_FATAL_STREAM("Could not initialize planner instance");
  ROS_INFO_STREAM("Using planning interface '" << planner_instance->getDescription() << "'");
}
catch (pluginlib::PluginlibException& ex)
{
  const std::vector& classes = planner_plugin_loader->getDeclaredClasses();
  std::stringstream ss;
  for (std::size_t i = 0; i < classes.size(); ++i)
    ss << classes[i] << " ";
  ROS_ERROR_STREAM("Exception while loading planner '" << planner_plugin_name << "': " << ex.what() << std::endl
                                                       << "Available plugins: " << ss.str());
}

官方文档part3

可视化,但是实际上也不用写到自己的代码里面,原因同上

自己的代码part3

获取机械臂现状态下的关节角,我直接用的是movegroup自带的getCurrentState函数

(moveit::planning_interface::MoveGroupInterface move_group(PLANNING_GROUP);)

const robot_state::RobotState& current_state = *move_group.getCurrentState();
std::vector current_joint_values;
current_state.copyJointGroupPositions(joint_model_group, current_joint_values);

std::cout << "Current Joint Values: ";
for (const auto& value : current_joint_values)
 {
  std::cout << value << " ";
 }
std::cout << std::endl;

你可能感兴趣的:(机器人)