Baxter抓取物块——基于单应性矩阵(二)

2023-11-12

        之前写了Baxter抓取物块的视觉部分(见一),接下来说一说剩下的、比较简单的模块。

机械臂末端位姿获取:

         Baxter启动后会将自身各坐标系的变换关系发布到 '/tf' 话题中,我们只需要使用TF包(具体参考wiki)即可。定义的current_pose()函数是为了将矩阵转换为ROS的pose Message。

class tf_listener():
	def __init__(self):
		#订阅'/tf',使各坐标系变换实时更新
		rospy.Subscriber('/tf', TFMessage, self.frame_handler)
		#Baxter的坐标系变换
		self.tf_baxter = tf.TransformerROS()
		
		self.trans_left = None	
		self.trans_right = None		
	

	def frame_handler(self, tf_message):
		temp_msg = TransformStamped()
		#将收到的TFMessage中的各个坐标系的信息进行更新
		for i in range(0,len(tf_message.transforms)):
			temp_msg = tf_message.transforms[i]
			self.tf_baxter.setTransform(temp_msg)
		
		#Baxter中torso与base的坐标系姿态相同,求从left_gripper到基坐标系的变换
		try:
			self.trans_left = self.tf_baxter.lookupTransform('torso','left_gripper',rospy.Time())
			self.trans_right = self.tf_baxter.lookupTransform('torso','right_gripper',rospy.Time())
			
		except:
			rospy.loginfo("正在尝试与tf同步............. \n")
		
	def current_pose(self, name):	
		"""
	该函数用于获得当前左/右抓手的位姿
	"""
		if name == 'left':
			ans = Pose()				
			ans.position.x = self.trans_left[0][0]
			ans.position.y = self.trans_left[0][1]
			ans.position.z = self.trans_left[0][2]
			ans.orientation.x = self.trans_left[1][0]
			ans.orientation.y = self.trans_left[1][1]
			ans.orientation.z = self.trans_left[1][2]
			ans.orientation.w = self.trans_left[1][3]
			return ans
		else:
			ans = Pose()				
			ans.position.x = self.trans_right[0][0]
			ans.position.y = self.trans_right[0][1]
			ans.position.z = self.trans_right[0][2]
			ans.orientation.x = self.trans_right[1][0]
			ans.orientation.y = self.trans_right[1][1]
			ans.orientation.z = self.trans_right[1][2]
			ans.orientation.w = self.trans_right[1][3]
			return ans 

 

 Baxter内置的逆运动学求解器:

        这一部分参考Baxter sdk wiki,会调用Baxter的服务就行。

#Baxter内置的逆运动学求解器	
class baxter_ik_srv:
	def __init__(self):
		rospy.wait_for_service('/ExternalTools/left/PositionKinematicsNode/IKService')
		self.ik_service = rospy.ServiceProxy('/ExternalTools/left/PositionKinematicsNode/IKService',SolvePositionIK)	#创建服务原型
	def solve(self,pose):
		posestamped = PoseStamped()	#服务要求的输入为PoseStamped(多个,我们只送一个)
		posestamped.pose = pose	#传入的参数类型为Pose
		posestamped.header.stamp = rospy.Time.now()	#将pose打上stamp
		posestamped.header.frame_id = 'base'	
		req = SolvePositionIKRequest()	#请求实例
		req.pose_stamp.append(posestamped)
		rospy.wait_for_service('/ExternalTools/left/PositionKinematicsNode/IKService')	#等待服务可用
		try:
			resp = self.ik_service(req)	#请求服务
			if resp.isValid[0] == True:	#True代表有解,只送一个进去,故索引为0
				return resp
			else:
				rospy.logerr("反解器无解..........\n")
				return None
		except rospy.ServiceException as exc:
			rospy.logerr("请求服务出错:" + str(exc))

 

 Baxter控制模块:

        设置了抓手的最大抓取力矩,以防止抓手损坏(一个还是挺贵的),函数的用法均可以在Baxter sdk wiki上查找到。这里包装的也很简单,就不多做描述。

class baxter_control():
	def __init__(self):
		#手臂初始化
		self.IK_srv = baxter_ik_srv()	#启动逆运动学求解器
		self.left_arm = Limb('left')    #手臂实例
		self.left_arm.set_joint_position_speed(0.2)	#设置位置控制时的关节速度

		#末端执行器初始化,打开并设置最大力矩
		self.left_gripper = Gripper('left')	#抓手实例
		if self.left_gripper.calibrated() == False:	#若抓手未校准,则校准
			self.left_gripper.calibrate()
		self.left_gripper.open(block=True)
		self.left_gripper.set_velocity(5)	#设置抓手移动时的速度
		self.left_gripper.set_moving_force(10)	#设置抓手移动时的力(最大值)
		self.left_gripper.set_holding_force(5)  #抓住物体时的保持力矩

		#末端红外测距初始化(备用)
		self.left_range = AnalogIO('left_hand_range') 	#红外测距,有效距离30厘米

	def go(self,pose):
		"""
		输入参数——姿态pose
		经逆运动学求解后,控制机械臂抵达目标位置
		"""
		ik_response = self.IK_srv.solve(pose)
		try:
  	  		limb_joints = dict(zip(ik_response.joints[0].name, ik_response.joints[0].position)) #dict zip从两个列表构造字典
   			self.left_arm.move_to_joint_positions(limb_joints)
		except:
			rospy.logerr("无法抵达目标位置")

	def go_start_position(self):
		start_pose = Pose()	#设置起始位置并让手臂抵达
		start_pose.position.x = 0.65
		start_pose.position.y = 0.14
		start_pose.position.z = 0.27
		start_pose.orientation.x = 0.0
		start_pose.orientation.y = 1.0 
		start_pose.orientation.z = 0.0
		start_pose.orientation.w = 0.0
		self.go(start_pose)	#移动

主函数 :

        下面是一段比较简单的主函数,起始位置->找到物块->移动->下降并抓取。目标位置是由自身位置加上偏差获取的。


def main():
        rospy.init_node('pick_demo_no_moveit')
	baxter_ctrl = baxter_control()	#初始化Baxter移动控制器
	visual_processor = image_converter()	#开启相机图像处理
	pose_processor = tf_listener()	#开启坐标系变换追踪
	rospy.sleep(5)

        baxter_ctrl.go_start_position()
        delta_pose =  visual_processor._get_obj_world_pose('blue')	#得到应在桌面坐标系移动的距离	
        tar = pose_processor.current_pose('left')
        tar.position.x += delta_pose[0]	#根据偏差移动
	tar.position.y += delta_pose[1]
	self.go(tar)
        tar.position.z -= 0.21	#下降(抓取)姿态
	self.go(tar)	#移动
	self.left_gripper.close(block=True)	#抓手抓取

        整个程序仍然有很多地方可以改进,比如识别蓝色以外的物体,图像中有多个物体时如何处理,物体摆放的角度不同时要如何处理等等。注意在进行连续抓取时,单应性矩阵只需进行一次计算(当然每次抓取前都要回到起始位置所在的水平面),而不是每次都要识别棋盘格的存在。

         以上就是Baxter抓取物块的一个简单demo。

 

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

Baxter抓取物块——基于单应性矩阵(二) 的相关文章

  • 掌握VS2010调试 -- 入门指南

    1 导言 在软件开发周期中 测试和修正缺陷 defect defect与bug的区别 Bug是缺陷的一种表现形式 而一个缺陷是可以引起多种Bug的 的时间远多于写代码的时间 通常 debug是指发现缺陷并改正的过程 修正缺陷紧随debug之
  • vue 拖拽功能样式优化

    拖拽需求完成之后 发现拖拽的过程中很丑 放下的时候光标处也是禁止 虽然说功能不影响 但是用户体验还是不太好 不够专业 所以请做以下优化 1 把需要拖拽的图标加上可拖拽属性 div 需要拖拽的元素 div draggable true 2 在
  • 数据库表关系设计

    数据库表设计 设计原则 考虑问题时 一定要站在一头考虑 常用的关联关系 主外键关联 主外键设计原则 我自己的主键可以充当别人的外键 核心知识 主键不能重复的 外键可以重复 一对一 业务场景 用户 user 表与用户详情表 user info
  • sql如何查看数据库表的关联关系?

    SHOW CREATE TABLE 表名 不管是Navicat还是MySQL Workbench 要查询表的创建sql语句的话 在新建查询中执行以下sql SHOW CREATE Table BinLots 执行之后 Create Tabl
  • 在Jenkins管道中添加Webhook

    你有没有尝试过在Jenkins中添加GitHub webhook 在这篇博客中 我将演示在您的管道中添加webhook的最简单方法 首先 什么是webhook webhook的概念很简单 webhook是一个HTTP回调 当通过HTTP P
  • 【简单题】(2018)第九届蓝桥杯省赛 C/C++ A组(第一题、第二题)

    第一题 题目 标题 分数1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少 结果用分数表示出来 类似 3 2当然 这只是加了前2项而已 分子分母要求互质 注意 需要提交的是已经约分过的分数 中间任
  • Linux最全解压命令(*.tar *tar.gz *.gz *.tar.bz2 *.bz2 *tar.xz *.xz *tar.Z *.Z *.rar *.zip *.7z *.7za)

    压缩解压命令 这里重点介绍tar命令 它是一个打包程序 它可 以调用其它的命令 如 gzip bzip2 除此之外还有 rar zip命令 注 无特殊说明 代表文件夹 代表次一级文件夹 代表文件 一 tar 用法 tar 选项 FILE c
  • JavaScript 实现 -- 快速排序

    文章目录 快速排序 快排原理 代码实现 快排过程 时间复杂度 算法稳定性 快速排序 快速排序算法是在分治算法基础上设计出来的一种排序算法 和其它排序算法相比 快速排序算法具有效率高 耗费资源少 容易实现等优点 快排原理 选择一个基准数 通过
  • http://wp.qq.com/index.html,登录页

    1Tj HOKWyW28 TMmb Xf OJiNeTZg9K yE gt f oxqaOEW9 jFA LtDl6 zX wJXf lC nHKnU2Txt1ISzG1B3mhYAL90 e 9DBh8eGt gt u7b3F r Yl1
  • 如何做一个合格的微软技术工程师

    我是荔园微风 作为一名在IT界整整25年的老兵 今天我们来重新审视一下如何做一个合格的微软技术工程师 我认为要做一个合格的微软技术工程师 首先是要有兴趣从事这个职业 现在很多人是因为软件行业的薪资高才进入的 但我的看法是 工程师是没有办法一
  • chown -R 改不了软链接指向的文件权限?

    关于chown命令的奇怪问题 都知道在linux系统中 chown 命令用来修改文件或目录的属组 而 chown 后加 R 参数 则会修改指定目录即该目录下的所有文件的属组 那么 chown 命令修改一个软连接文件的权限呢 比如 chown
  • Android使用OKHttp访问网络获取Cookie和带Cookie的请求

    登录 取得Cookie public void login String username String userpwd FormBody body new FormBody Builder add email username add p
  • leetcode 028.实现strStr(),即查找重复字符串(KMP算法)

    前言 本题是经典的字符串单模匹配的模型 因此可以使用字符串匹配算法解决 常见的字符串匹配算法包括暴力匹配 Knuth Morris Pratt 算法 Boyer Moore 算法 Sunday 算法等 本文 前言 本题是经典的字符串单模匹配
  • Eigen中的基本函数

    Eigen中的基本函数 Eigen中矩阵的定义 include

随机推荐

  • 微服务和分布式一些概念

    2 1分布式一些基本概念 2 1 1微服务概述 微服务 对应用程序而言 微服务架构风格 就像是把一个单独的应用程序开发为一套小服务 每个小服务运行在自己的进程中 并使用轻量级机制通信 通常是HTTP API 这些服务围绕业务能力来构建 并通
  • 创建线程池的七种方式

    在 Java 语言中 并发编程往往都是通过床架线程池来实现的 而线程池的创建方式也有很多种 每种线程池的创建方式都对应了不同的使用场景 总结来说线程池的创建可以分为两大类 通过 Executors 创建 通过 ThreadPoolExecu
  • Java Double类型出现科学计数法问题解决

    问题描述 Double num1 0 0004 问题分析 1 当数据足够小或者足够大时 Double会将数据自动变成科学计数法 解决办法 将Double类型先变成String类型 再将String类型变为BigDecimal即可 Doubl
  • Pycharm的git密码填错了的修改方法

    本篇文章主要讲解Pycharm的git密码填错了的修改方法 日期 2022年2月18日 作者 任聪聪 填写错误密码发现提交不了git 解决办法 步骤一 打开搜索框 步骤二 搜索控制面板 步骤三 打开面板 找到用户凭据管理 步骤四 点击管理w
  • 关掉linux ssh终端后,让程序继续执行的方法

    最近买了个树莓派 发现中移动的物联网云平台挺好 就想玩玩 用树莓派上自动获取温度上报到云端 通过web显示 测试时希望在ssh上执行完命令后 关闭电脑或者ssh命令行终端后 树莓派继续运行 1 使用 nohup 命令 说明 网上有的说输入下
  • vue3+vue3-video-player+vue3-danmaku实现直播和弹幕

    视频组件 vue3 video player 首先下载vue3 video player 官方文档 Vue3VideoPlay 下载 npm i vue3 video play save 在main ts js注册 import creat
  • MongoDB 基础入门

    MongoDB 是什么 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统 由 C 编写的 MongoDB 提供了 面向文档 的存储方式 操作起来比较简单和容易 支持 无模式 的数据建模 可以存储比较复杂的数据类型
  • 030_Message消息提示

    1 Message消息提示 1 1 Message消息提示常用于主动操作后的反馈提示 与Notification的区别是后者更多用于系统级通知的被动提醒 1 2 Options 参数 说明 类型 可选值 默认值 message 消息文字 s
  • [JAVAee]spring-Bean对象的执行流程与生命周期

    执行流程 spring中Bean对象的执行流程大致分为四步 启动Spring容器 实例化Bean对象 Bean对象注册到Spring容器中 将Bean对象装配到所需的类中 启动Spring容器 在main方法中获取spring上下文对象并配
  • 算法分析与设计期末复习

    第一章 算法概述 1 算法 解决问题的一种方法或过程 由若干条指令组成的有穷指令 2 算法的性质 输入 有零个或多个输入 输出 有至少一个输出 确定性 每条指令是清晰的 无歧义的 有限性 每条指令的执行次数和时间都是有限的 3 算法与程序的
  • Win10下安装Intel Visual Fortran2019具体步骤及初始调试过程。

    相关程序安装包可以搜索微信公众号 火耳软件 他们的公众号上基本所有软件都能下载到 Win10下安装Intel Visual Fortran2019具体步骤及初始调试过程 先装Visual Studio2017 安装步骤省略 可在网上找到 再
  • eclipse异常类之自定义异常和assert

    1 在实际开发中 可以利用异常的处理机制来处理业务逻辑错误 就是使用自定义异常 例如用户名密码输入错误 自定义异常通常都是通过继承一个异常来实现 1 Throwable 2 Exception 3 RuntimeException 自定义异
  • Scrapy框架爬取新闻!

    步骤 创建一个scrapy项目 分析网页 完成代码 保存CSV文件 创建一个scrapy项目 本次爬取网站为 https wz sun0769 com app politics index cmd切换目录scrapy startprojec
  • 基于Netty手撕RPC框架

    基于Netty手撕RPC框架 文章目录 基于Netty手撕RPC框架 1 项目结构 2 api 3 provider 1 自定义注解 2 实现UserServiceInterface 3 NettyServer的客户端 4 NettyHan
  • 你参与的APP开发项目安全吗?

    Android将安全设计贯穿系统架构的各个层面 覆盖系统内核 虚拟机 应用程序框架层以及应用层各个环节 力求在开放的同时 也恰当保护用户的数据 应用程序和设备的安全 Android安全模型主要提供以下几种安全机制 进程沙箱隔离机制 应用程序
  • Qt内存管理(五) 自动垃圾回收机制

    实现自动垃圾回收的工具主要是Qt对象清理器 也就是QObjectCleanupHandler类 它监视多个QObject对象的生命期 当你想知道被别人拥有的QObject对象是否被删除时 这个类就派上了用场 例如引用 referencing
  • mysql报错:1264-Out of range value for column ‘字段‘ at row 1

    发现程序部分内容写不到数据库 于是来排查是否为数据库的问题 mysql数据库报错 1264 Out of range value for column guild leader id at row 1 如图所示 通过设计表 发现该字段的值超
  • java定位_java调用百度定位api服务获取地理位置示例

    package test import java io BufferedReader import java io IOException import java io InputStream import java io InputStr
  • C++智能指针之unique_ptr(保姆级教学)

    目录 unique ptr 概述 涉及程序 初始化 手动初始化 std make unique函数 C 14 unique ptr常规操作 不支持操作 该指针不支持拷贝和赋值操作 所以不能拷贝到容器里 移动语义std move releas
  • Baxter抓取物块——基于单应性矩阵(二)

    之前写了Baxter抓取物块的视觉部分 见一 接下来说一说剩下的 比较简单的模块 机械臂末端位姿获取 Baxter启动后会将自身各坐标系的变换关系发布到 tf 话题中 我们只需要使用TF包 具体参考wiki 即可 定义的current po