moveit概述以及python接口

MOVEIT——移动它

在这里插入图片描述

用户可以通过以下三种方式之一访问move_group提供的操作和服务:
①在C ++中 -使用move_group_interface软件包,该软件包为move_group提供易于设置的C ++接口
②在Python中 -使用moveit_commander包
③通过GUI-使用Movi的Rviz插件(ROS可视化工具)
可以使用ROS参数服务器配置move_group,从该服务器还将获取机器人的URDF和SRDF。

组态

move_group是ROS节点。它使用ROS param服务器获取三种信息:
①URDF- move_group在ROS参数服务器上寻找robot_description参数,以获取机器人的URDF。
②SRDF- move_group在ROS参数服务器上寻找robot_description_semantic参数,以获取机器人的SRDF。SRDF通常由用户使用MoveIt Setup Assistant创建(一次)。
③MoveIt配置-move_group将在ROS参数服务器上查找MoveIt特定的其他配置,包括关节极限,运动学,运动计划,感知和其他信息。
这些组件的配置文件由MoveIt设置助手自动生成,并存储在机械手相应的MoveIt配置包的config目录中。

机器人界面

move_group通过ROS主题和动作与机器人对话。
它与机器人通信以获取当前状态信息(关节的位置等),从机器人传感器获取点云和其他传感器数据,并与机器人上的控制器通信。

Joint State Information

move_group listens on the /joint_states topic for determining the current state information - i.e. determining where each joint of the robot is. move_group is capable of listening to multiple publishers on this topic even if they are publishing only partial information about the robot state (e.g. separate publishers may be used for the arm and mobile base of a robot). Note that move_group will not setup its own joint state publisher - this is something that has to be implemented on each robot.

转换信息

move_group使用ROS TF库监视转换信息。这允许节点获取有关机器人姿势的全局信息(以及其他信息)。例如,ROS导航堆栈会将机器人的地图框架和基础框架之间的转换发布为TF。move_group可以使用TF找出此转换以供内部使用。请注意,move_group仅侦听TF。要从机器人发布TF信息,您将需要在机器人上运行robot_state_publisher节点。

控制器介面

move_group使用FollowJointTrajectoryAction接口与机器人上的控制器对话。这是一个ROS操作界面。机械手上的服务器需要执行此操作-move_group本身未提供此服务器。move_group将仅实例化客户端以与您的机器人上的该控制器操作服务器进行对话。

运动计划

运动计划插件
MoveIt通过插件界面与运动计划者一起使用。这使MoveIt可以与多个库通信并使用多个库中的不同运动计划器,从而使MoveIt易于扩展。运动计划者的接口通过ROS操作或服务(由move_group节点提供)。move_group的默认运动计划器使用OMPL和MoveIt Setup Assistant的OMPL的MoveIt接口进行配置。

运动计划要求
运动计划请求明确指定了您希望运动计划者执行的操作。通常,您将要求运动计划者将手臂移动到其他位置(在关节空间中)或将末端执行器移动到新姿势。默认情况下会检查冲突(包括自冲突)。您可以将一个物体附着到末端执行器(或机器人的任何部分)上,例如,如果机器人捡起一个物体。这样,运动计划者可以在规划路径时考虑对象的运动。您还可以指定运动计划者要检查的约束-MoveIt提供的内置约束是运动学约束:
①位置限制-将链接的位置限制在空间区域内
②方向约束-将链接的方向限制在指定的滚动,俯仰或偏航限制内
③可见性约束-限制链接上的点位于特定传感器的可见性圆锥内
④关节约束-限制关节位于两个值之间
⑤用户指定的约束-您还可以通过用户定义的回调指定自己的约束。

运动计划结果
移动组节点将响应您的运动计划请求生成所需的轨迹。该轨迹将使手臂(或任何一组关节)移动到所需位置。请注意,从move_group中得出的结果是一条轨迹,而不仅仅是一条路径-_move_group将使用所需的最大速度和加速度(如果指定)来生成一条轨迹,该轨迹在关节级别上服从速度和加速度约束。

OMPL

OMPL(开放运动计划库)是一个开放源代码的运动计划库,主要实现随机运动计划器。MoveIt直接与OMPL集成,并将该库中的运动计划器用作其主要/默认计划器集。OMPL中的计划者是抽象的;即OMPL没有机器人的概念。相反,MoveIt配置OMPL并为OMPL提供后端以处理机器人技术中的问题。

规划场景

在这里插入图片描述
世界几何监视器
世界几何图形监视器使用来自机器人上的传感器和用户输入的信息来构建世界几何图形。它使用下面描述的占用地图监视器来构建机器人周围环境的3D表示,并使用关于planning_scene主题的信息对其进行扩充,以添加对象信息。

3D感知
MoveIt中的3D感知由占用地图监视器处理。占用地图监视器使用插件架构来处理不同类型的传感器输入,如上图所示。特别是,MoveIt具有处理两种输入的内置支持:
①点云:由点云占用地图更新程序插件处理
②深度图像:由深度图像占用图更新器插件处理

请注意,您可以将自己的更新程序类型作为插件添加到占用地图监视器。
传感器
外增传感器,返回机器人的关节信息

运动学插件

**MoveIt的默认逆运动学插件是使用KDL基于Jacobian数值的解算器配置的。**该插件由MoveIt安装助手自动配置。

moveit_commander

对python文件有一定了解后,决定从这里开始学习
对MoveIt!的基本功能进行了封装,包括:
①motion planning 运动规划
②computation of Cartesian paths 计算直角坐标系路径
③pick and place 抓取物体
通过moveit_commander_cmdline.py脚本提供了命令行接口。

moveit的python接口

使用python接口时,我们通常需要加载moveit_commander, 这是一个namespace package,里面会加载MoveGroupCommander, PlanningSceneInterface以及RobotCommander,另外加载一些用到的ROS messages。

import rospy, sys
from moveit_commander import RobotCommander, MoveGroupCommander, PlanningSceneInterface
from geometry_msgs.msg import PoseStamped, Pose
from moveit_msgs.msg import CollisionObject, AttachedCollisionObject, PlanningScene
from copy import deepcopy

初始化move_group的API,以及是初始化一个节点

        moveit_commander.roscpp_initialize(sys.argv)
        rospy.init_node('moveit_fk_demo', anonymous=True)

创建一个RobotCommander的对象。RobotCommander是针对整个机器人的控制。

robot= moveit_commander.RobotCommander()

创建一个PlanningSceneInterface的对象。PlanningSceneInterface是用于和机器人环境的交互(如添加物体是会用到)

scene = moveit_commander.PlanningSceneInterface()

创建MoveGroupCommander的对象。MoveGroupCommander是针对一个规划组进行控制。这里通过设置group_name = panda_arm控制机器人的手臂。以后研究机械臂就是用这个函数:

arm_group = moveit_commander.MoveGroupCommander(group_name)

获得末端执行器的名称——信息类函数

end_effector_link = arm.get_end_effector_link()

获得一个机器人中所有组的名字——信息类函数

group_names = robot.get_group_names()

打印这个组的末端执行器的连接名称

print "============ Reference frame: %s" % arm_group.get_end_effector_link()

获得机器人目前的状态

states=robot.get_current_state()

规划一个关节目标,这里就使用arm_group组

joint_goal = arm_group.get_current_joint_values()  #获得当前位置的关节数值

joint_goal[0] = 0
joint_goal[1] = -pi/4
joint_goal[2] = 0
joint_goal[3] = -pi/2
joint_goal[4] = 0
joint_goal[5] = pi/3
joint_goal[6] = 0 #是一个列表,可以进行改动

arm_group.go(joint_goal, wait=True)  #让机械臂运动到指定位置
group.stop() #然后停下

####同样也可以这样,功能也是一样的
joint_positions = [0.391410, -0.676384, -0.376217, 0.0, 1.052834, 0.454125]
arm_group.set_joint_value_target(joint_positions)
arm_group.go()
arm_group.stop()

定义一个姿态目标

pose_goal = geometry_msgs.msg.Pose()  #先设置一个实例,就可以使用函数,获得数值,四元数。
pose_goal.orientation.w = 1.0
pose_goal.position.x = 0.4
pose_goal.position.y = 0.1
pose_goal.position.z = 0.4
arm_group.set_pose_target(pose_goal)
arm_group.go()
arm_group.stop()

笛卡尔路径设置

waypoints = []   #先设置一个空列表

wpose = group.get_current_pose().pose   #获得在世界坐标系下的位置,一般也是基坐标系
wpose.position.z -= scale * 0.1  # 先动z
wpose.position.y += scale * 0.2  # z再动y
waypoints.append(copy.deepcopy(wpose))    #深拷贝等于在原来的基础经过运算后得到的数值,重新拷贝,原来的保持不变,加到列表上

wpose.position.x += scale * 0.1  # Second move forward/backwards in (x)
waypoints.append(copy.deepcopy(wpose))

wpose.position.y -= scale * 0.1  # Third move sideways (y)
waypoints.append(copy.deepcopy(wpose))

(plan, fraction) = arm.compute_cartesian_path (
		                            waypoints,   # waypoint poses,路点列表
		                            0.01,        # eef_step,终端步进值
		                            0.0,         # jump_threshold,跳跃阈值
		                            True)        # avoid_collisions,避障规划

return plan, fraction  #fraction路径规划覆盖率,最大值为1

执行计算出来的路径

arm_group.execute(plan, wait=True)

在rviz中显示路径。调用group.plan()规划路径的时候回自动在rviz中显示。
也可以手动进行显示,创建一个 DisplayTrajectory
的消息对象,然后发布到’/move_group/display_planned_path’话题。
DisplayTrajectory消息主要有两个属性,起始点trajectory_start 和 路径trajectory。

display_trajectory = moveit_msgs.msg.DisplayTrajectory()
display_trajectory.trajectory_start = robot.get_current_state()
display_trajectory.trajectory.append(plan)
# Publish
display_trajectory_publisher.publish(display_trajectory);

在场景中设置/移除若干个物品

 scene.remove_world_object('table')   #移除场景中名为table的物块```
```bash
table_pose = geometry_msgs.msg.PoseStamped()   #放置一张类似桌子的物块,也就是创建一个实例
table_pose.header.frame_id = "base_link"      #设置放置的位置
table_pose.pose.orientation.w = 1.0
table_name = "box"
scene.add_box(table_name, table_pose, size=[0.1, 0.1, 0.1])  #分别是实物的名字,实物的姿态(四元数),实物的三维大小

绑定物体到机械臂
在用机械臂操纵物体的时候,为了防止MoveIt把某些link和物体的正常接触当做是碰撞而报,可以把这些link加入到touch_links,这样就会忽略这些link和物体的碰撞

scene.remove_attached_object(end_effector_link, 'tool')  #移除绑在末端执行器上的一个实体
# 设置tool的位姿
        tool_pose = PoseStamped()
        tool_pose.header.frame_id = end_effector_link
        tool_pose.pose.position.x = tool_size[0] / 2.0 - 0.025
        tool_pose.pose.position.y = -0.015
        tool_pose.pose.position.z = 0.0
        tool_pose.pose.orientation.x = 0
        tool_pose.pose.orientation.y = 0
        tool_pose.pose.orientation.z = 0
        tool_pose.pose.orientation.w = 1
        
        # 将tool附着到机器人的终端
        scene.attach_box(end_effector_link, 'tool', tool_pose, tool_size)

等待Rviz初始化

rospy.sleep(10)
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值