【Ros控制机械臂学习笔记】move_group C++interface接口学习

2023-05-16

       在完成机器人URDF模型建立,利用moveit_setup_assistant配置生成robot_moveit_config文件夹之后,接下来就是要的学习方向有两个。

        一个是向下位机走,即上图的右面,只是简单的修改配置文件(demo.launch\ros_controllers.yaml等文件),以此来控制机械臂运动,重点是编写Follow_joint_trajectory 这个Action的server端,因为moveit已经帮我们实现了.action文件和client端的编写,然后在编写自己机械臂的joint_state_pblisher节点,与机械臂的控制器程序相配合,就能实现ros对机械臂的控制 。

         另一个学习方向就行向上走,即图中move_group的左面,目的是实现更复杂的控制功能,这里ROS提供了RVIZ中的GUI、C++以及python三种接口让我们来对机械臂进行更复杂的运动控制。根据自己的理解,其中,gui只是在调试机械臂的时候用到的,因为他是在rviz中拖动坐标球进行目标点位设置的,要想让机械臂末端到达准确的坐标点位这种方式是无法实现的。所以要达到准确的目标点位设置和姿态设置,还是需要使用C++接口和python接口。由于没有python基础,所以打算从C++开始。

【学习课堂小笔记】

1、要用到哪些头文件呢?

头文件的功能目前我还没全部摸透,但是,看了几篇示例代码下来,我感觉,学习阶段,可以简单粗暴把以下头文件全部包括进来,编写程序的过程中,在慢慢摸索每个头文件的功能(因为头文件内部的东西实在太多了,真的是不想看,有几千行)

#include<moveit/move_group_interface/move_group_interface.h>
#include <moveit/planning_scene_interface/planning_scene_interface.h>
#include <moveit_msgs/DisplayRobotState.h>
#include <moveit_msgs/DisplayTrajectory.h>
#include <moveit_msgs/AttachedCollisionObject.h>
#include <moveit_msgs/CollisionObject.h>
#include <moveit_visual_tools/moveit_visual_tools.h>
#include <vector>
#include <iostream>

2、准备工作

这部分要设定在C++中要操作运动的规划组(就是在用配置助手生成包的时候设定的规划组),然后实例化一个PlanningSceneInterface类,用于操作rviz中的碰撞对象

//配置规划组  调用PlanningSceneInterface
//方式一 
 static const std::string PLANNING_GROUP = "arm";
 moveit::planning_interface::MoveGroupInterface group(PLANNING_GROUP);
//方式二
 moveit::planning_interface::MoveGroupInterface group("arm");

//用PlanningSceneInterface类在“虚拟世界”场景中添加和删除碰撞对象
  moveit::planning_interface::PlanningSceneInterface planning_scene_interface;  

3、操作机械臂动起来

这部分工作意图就很明显了,直接看代码实现方式

//-----------------------------------------------------------------------
 // 设置一个末端位置
  geometry_msgs::Pose target_pose1;
  target_pose1.orientation.w = 0.726282;
  target_pose1.orientation.x= 4.04423e-07;
  target_pose1.orientation.y = -0.687396;
  target_pose1.orientation.z = 4.81813e-07;  //用四元数确定末端的姿态

  target_pose1.position.x = 0.0261186;
  target_pose1.position.y = 4.50972e-07;
  target_pose1.position.z = 0.573659;
  group.setPoseTarget(target_pose1);        //设定末端的坐标


//这步操作相当于在rviz中点击plan 但是不执行(execute)
  moveit::planning_interface::MoveGroupInterface::Plan my_plan;
  moveit::planning_interface::MoveItErrorCode success = group.plan(my_plan); 
  ROS_INFO("Visualizing plan 1 (pose goal) %s",success.val ? "":"FAILED"); 
 
// 简单理解 就是点rviz里面的  execute
	group.move();	 
//-------------------------------------------------------------------------


//***************************************************************************************
 //创建一个PlanningSceneInterface对象,用于访问moveit中的场景  并对场景进行操作
   moveit::planning_interface::PlanningSceneInterface current_scene;
 //等待5S 等待对象实例化
   sleep(5.0);
 //在moveit中添加一个圆柱体 碰撞对象 名称是对象的ID   
   moveit_msgs::CollisionObject cylinder;

   cylinder.id = "seven_dof_arm_cylinder";//这个名字可以随便定义
 //设置碰撞对象的参数  定义了一个primitive的结构体
    shape_msgs::SolidPrimitive primitive;
    primitive.type = primitive.CYLINDER;
    primitive.dimensions.resize(3);
    primitive.dimensions[0] = 0.6;
    primitive.dimensions[1] = 0.2;
    primitive.dimensions[2] = 0.2;
 //设在碰撞对象的位置姿态
    geometry_msgs::Pose pose;
    pose.orientation.w = 1.0;
    pose.position.x =  0.0;
    pose.position.y = -0.4;
    pose.position.z =  0.4;
 //添加相对于碰撞检测对象的姿态——添加规划场景  就是把定义好的碰撞物体加载道规划场景中
    cylinder.primitives.push_back(primitive);
    cylinder.primitive_poses.push_back(pose);
    cylinder.operation = cylinder.ADD;
 //创建一个向量  将碰撞类型加入到该向量中
    cylinder.header.frame_id = "base_link";
    std::vector<moveit_msgs::CollisionObject> collision_objects;
    collision_objects.push_back(cylinder);
 //将添加的对象添加到当清的规划场景中
    current_scene.addCollisionObjects(collision_objects);
 //代码块功能:将碰撞对象加载到规划场景中
//***************************************************************************************



//***************************************************************************************
 //创建一个PlanningSceneInterface对象,用于访问moveit中的场景  并对场景进行操作
    moveit::planning_interface::PlanningSceneInterface current_scene;
 //简单理解  就是调用下面这段话,可以将上面定义好的碰撞对象删除
    std::vector<std::string> object_ids;
    object_ids.push_back("seven_dof_arm_cylinder");//这里面的名字是在添加碰撞对象的时候定义的
    current_scene.removeCollisionObjects(object_ids);
 //代码块功能:将碰撞对象删除
//***************************************************************************************

//***************************************************************************************
 //向机械臂连杆上添加一个碰撞对象———实现抓取
 //开始 初始化启动ros
 	ros::init(argc, argv, "seven_dof_arm_planner");
	ros::NodeHandle node_handle;
	ros::AsyncSpinner spinner(1);
	spinner.start();
 //创建一个PlanningSceneInterface对象,用于访问moveit中的场景  并对场景进行操作
 	moveit::planning_interface::MoveGroupInterface group("arm");
	moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
	moveit::planning_interface::PlanningSceneInterface current_scene;
    sleep(2);
 //定义抓取对象  这部分 就和添加碰撞对象时的操作一样了
    moveit_msgs::CollisionObject grasping_object;
	grasping_object.id = "grasping_object";
    
	shape_msgs::SolidPrimitive primitive;
	primitive.type = primitive.BOX;
	primitive.dimensions.resize(3);
	primitive.dimensions[0] = 0.03;
	primitive.dimensions[1] = 0.03;
	primitive.dimensions[2] = 0.08;
 //将抓取对象的在环境中的空间位置设定在机械臂末端的位置上
	geometry_msgs::Pose pose;
	pose.orientation.w = 1.0;
	pose.position.x =  0.03;
	pose.position.y =  0.0;
	pose.position.z =  0.65;
    grasping_object.primitives.push_back(primitive);
	grasping_object.primitive_poses.push_back(pose);
	grasping_object.operation = grasping_object.ADD;
 //确定选用的参考坐标系,因为后面对对象的操作可能选用的参考系不一样
    grasping_object.header.frame_id = "base_link";
 //创建一个向量  将碰撞类型加入到该向量中
    std::vector<moveit_msgs::CollisionObject> collision_objects;
	collision_objects.push_back(grasping_object);
 //将添加的对象添加到当清的规划场景中	
    current_scene.addCollisionObjects(collision_objects);
	
	sleep(4);

 //*将被抓取的物体附着在机械臂的抓手上
 	ROS_INFO("Attaching object grasping_object to robot's body");
	//这个类里面有两个成员变量link_name  object
    moveit_msgs::AttachedCollisionObject attacched_object;   
    //link_name 确定末端执行器连杆名称
	attacched_object.link_name = "grasping_frame";
	attacched_object.object = grasping_object;
    //将附加的碰撞对象同步应用于move_group节点的规划场景。其他PlanningSceneMonitors将不会收到更新,除非他们订阅move_group的监控场景
	current_scene.applyAttachedCollisionObject( attacched_object );
	sleep(4);
  
    //将grasping_object 的参数改成remove 就是实现了将物体从抓手上释放
	ROS_INFO("Detaching object grasping_object to robot's body");
	grasping_object.operation = grasping_object.REMOVE;
	attacched_object.link_name = "grasping_frame";
	attacched_object.object = grasping_object;
	current_scene.applyAttachedCollisionObject( attacched_object );

	sleep(1);

	ros::shutdown();
    // 代码块的功能:添加抓取和放置的功能
//***************************************************************************************

心酸的学习历程,不知道哪些地方是错的,欢迎大家一起讨论啊

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Ros控制机械臂学习笔记】move_group C++interface接口学习 的相关文章

随机推荐

  • static 静态成员变量 静态成员函数 类中使用

    关于在类中使用static的一些情况 xff1a 静态成员函数和静态成员变量的调用格式 xff0c 尽量采用类名 成员的格式 xff0c 不要以对象来调用 1 static func静态成员函数 1 其地址可以直接由函数指针来存储 xff0
  • ucosii消息队列学习

    近期在学习ucosii的内容使用的平台为STM32F103C8T6最小系统板 今日关于消息队列的使用遇到了一些问题 基本情况 xff1a 移植代码为正点原子ucosiii消息队列 信号量集和软件定时器例程 主要新建两个任务post task
  • day41—编程题

    文章目录 1 第一题1 1题目1 2思路1 3解题 2 第二题2 1题目2 2思路2 3解题 1 第一题 1 1题目 描述 xff1a Emacs号称神的编辑器 xff0c 它自带了一个计算器 与其他计算器不同 xff0c 它是基于后缀表达
  • SLAM学习笔记

    编译环境参考之前的笔记 cmake文件 cmake minimum required VERSION 3 0 project odometry set CMAKE BUILD TYPE 34 Release 34 add definitio
  • eclipse配置Tomcat

    文章目录 前言一 预先工作1 Tomcat是什么 xff1f 2 Tomcat下载3 安装Eclipse for Java EE 二 在eclipse中配置Tomcat 前言 目前开始了j2ee的学习 xff0c 为了给以后的学习做准备 x
  • MATLAB学习笔记(一)上:MATLAB基础知识

    笔记配套课程 xff1a 科学计算与MATLAB语言 中国大学MOOC 慕课 icourse163 org PART ONE xff1a MATLAB系统环境 1 命令行窗口中 xff0c 如果一条命令很长 xff0c 我们可以分成两行来输
  • H3C路由器基本配置命令

    1 system view 进入系统视图 2 sysname R1 配置路由器名字为R1 3 display clock 查看当前系统时间 4 clock datetime 00 00 00 2 26 2023 用户模式下修改系统时间 配置
  • ubuntu18.04双系统卸载并重装

    卸载ubuntu18 04 原文档 xff08 稍作整理 xff0c 方便自己使用 xff09 下载diskgenius工具 xff1a diskgenius 删除Ubuntu系统使用的几个分区 xff08 包括EFI分区 xff09 xf
  • 安装zed-ros-wrapper 并解决一些报错

    创建工作空间 如果没有工作空间 xff0c 先根据如下命令建立工作空间 source opt ros melodic setup bash mkdir p catkin ws src cd catkin ws catkin make cat
  • rtabmap+orbslam2+D435i建图

    配置rtabmap 参考 xff1a rtabmap安装与使用 配置orbslam2参考 xff1a ubuntu18 04 安装orb slam2并结合ZED运行 建图参考 xff1a Rtabmap 43 ORB SLAM2 43 D4
  • matlab2018a帮助文档设置为中文

    版本 xff1a matlab2018a 1 主页 预设 2 帮助 文档位置 xff08 第二个 xff09 简体中文 应用 确定 3 结果展示
  • Vue2与Vue3的生命周期一览

    Vue2与Vue3的生命周期 生命周期前言介绍Vue2的生命周期钩子函数Vue3的生命周期钩子函数setup函数Vue3新增生命周期 生命周期 前言介绍 生命周期也称生命周期回调函数 生命周期函数 生命周期钩子 每个 Vue 组件实例在创建
  • FreeRTOS入门

    文章目录 一 FreeRTOS简介二 学习任务三 学习内容多任务程序实现1 相关文件2 头文件的添加3 路径添加4 修改主函数main c 中代码5 将程序烧录到stm32开发板中6 最终结果 四 参考资料 一 FreeRTOS简介 Fre
  • 嘉立创SMT贴片打板流程

    说明 xff1a 打板平台 嘉立创下单助手 使用嘉立创EDA画板可参考以下过程 使用AD画板 xff0c 不同点是 xff08 1 xff09 导出的文件是PCB源文件压缩包 43 BOM表 43 坐标文件 xff08 2 xff09 确保
  • Android Studio安装超详细步骤(包括SDK安装不成功,模拟器无法创建等问题)

    本文主要介绍CPU 为AMD锐龙 和英特尔 两种类型在安装中出现的一些问题 xff0c 两种解决的方案不同 xff0c 所以首先查看属于哪种 xff0c 然后找相对应的安装方法 Android Studio的安装需要准备两个安装文件 xff
  • HTML+CSS仿写京东页面附代码(web前端大作业)

    学习前端时间不多 xff0c 看了两晚上就开始赶实训作业 xff0c 大家看看就行 先来看看效果 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • DIY组装无人机电机+电调+电池+桨叶搭配知识

    以下内容转载至下网址 有一点点修改 DIY组装无人机电机 43 电调 43 电池 43 桨叶搭配知识 xff08 转贴 xff09 多旋翼 模吧 moz8 com https www moz8 com forum php mod 61 vi
  • (每日一练)MATLAB二维插值

    在前面介绍了学习MATLAB的一维插值方法 xff0c 今天来学习MATLAB二维插值方法 首先来看二维插值函数的使用格式 xff1a z1 61 interp2 x y z x1 y1 39 method 39 其中x y z分别是我们给
  • Ubuntu18.04安装D435iSDK和ROS Wapper

    实验室新到D435i深度相机 xff0c 我想来跑跑开源算法 xff0c 安装驱动各种帖子很多 xff0c 我把我看到两篇最有用的帖子整理一下 帖子连接放在文末 1 安装Intel RealSense SDK 2 0 参考 xff1a ht
  • 【Ros控制机械臂学习笔记】move_group C++interface接口学习

    在完成机器人URDF模型建立 xff0c 利用moveit setup assistant配置生成robot moveit config文件夹之后 xff0c 接下来就是要的学习方向有两个 一个是向下位机走 xff0c 即上图的右面 xff