Realsense-Realman手眼标定

news2024/12/27 2:52:58

硬件设备

Realsense D405
Realman 65b

软件环境搭建

软件环境依赖:

librealsense
		https://github.com/IntelRealSense/librealsense.git
ROS1.0
	ros-noetic-aruco
		sudo apt-get install ros-noetic-aruco*
	realsense_ros
		https://github.com/IntelRealSense/realsense-ros.git
	rm_robot
		https://github.com/RealManRobot/rm_robot.git

下载标定软件

mkdir -p handeye_ws/src && cd handeye_ws/src

​git clone https://github.com/HenryWJL/hand_eye_calibration

cd ../catkin_make

这里软件使用jaka虚拟机械比进行标定,因系需要进行适配。进入/home/kyle/ROS_Packages/handeye_ws/src/hand_eye_calibration/scripts修改hand_to_eye_calib.py代码以适配睿尔曼机械臂:

### 导入Pose包
from geometry_msgs.msg import TwistStamped, Pose

### 注释原有的位姿订阅callback

# def get_end2base_mat(pose):
#     # Calculating the gripper-to-base transformation matrix
#     tran = np.array((pose.twist.linear.x, pose.twist.linear.y, pose.twist.linear.z))
#     rot = tfs.euler.euler2mat(pose.twist.angular.x, pose.twist.angular.y, pose.twist.angular.z)
#     return rot, tran

### 订阅睿尔曼机械臂消息,并使用geometry_msgs.msg/Pose
### 有可能需要解算逆坐标
def get_end2base_mat(pose):
    # Calculating the gripper-to-base transformation matrix
    tran = np.array((pose.position.x, pose.position.y, pose.position.z))
    # rot = tfs.euler.euler2mat(pose.orientation.x, pose.orientation.y, pose.orientation.z)
    rot = tfs.quaternions.quat2mat([pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z])
    # invert
    # tran = -np.array(rot).T * tran
    # rot = np.array(rot).T
    return rot, tran

...
	### 机械臂订阅睿尔曼位姿话题
	rospy.Subscriber('/rm_driver/Pose_State', Pose, end_pose_callback, queue_size=10)

...
	### 打印不同形式位姿,方便检查
                    print("="*60)
                    print("R_cam2end")
                    print("Transform:")
                    print(cam2base)  # Transformation matrix
                    R_cam2base_quaternions = tfs.quaternions.mat2quat(R_cam2base)
                    cam2base_quaternions = np.concatenate((T_cam2base.reshape(3),
                                                           R_cam2base_quaternions.reshape(4)), axis=0)
                    print("Quaternions:")
                    print(cam2base_quaternions.tolist())  # Quaternions

                    R_cam2base_euler = tfs.euler.mat2euler(R_cam2base)
                    print("Euler angles:")
                    print(R_cam2base_euler[0]/np.pi*180, R_cam2base_euler[1]/np.pi*180, R_cam2base_euler[2]/np.pi*180)
                 

修改标定板识别参数,这里使用的是棋盘格标定板。/home/kyle/ROS_Packages/handeye_ws/src/hand_eye_calibration/launchcheckerboard_start.launch文件:

    <arg name="image_topic"       default="/camera/color/image_raw"/>
    <arg name="camera_info"       default="/camera/color/camera_info"/> 
    <arg name="cornerX"          default="6"/>
    <arg name="cornerY"          default="3"/>    
    <arg name="gridLength"        default="0.05"/> 

标定过程(眼在手上)

原理见下图,总的过程为采集数据,解一个方程 AX=XB。
原理图

#console1
roslaunch rm_control rm_65_control.launch &
roslaunch rm_bringup rm_65_robot.launch

#console2
roslaunch realsense2_camera rs_camera.launch

#console3
roslaunch hand_eye_calibration checkerboard_start.launch

#console4
rosrun hand_eye_calibration hand_to_eye_calib.py

标定程序启动后,不停摆动机械臂位姿,均使相机拍摄标定板。采集样本输入r命令,计算位姿输入c命令,退出输入q命令,采集样本>3个。

Record: r, Calculate: c, Save: s, Quit: q
r
[[-0.7599338   0.0060974   0.64997188]
 [ 0.04182341  0.99834257  0.03953361]
 [-0.64865354  0.05722697 -0.75892928]]
1 samples have been recorded

record1

Record: r, Calculate: c, Save: s, Quit: q
r
[[-0.74060468  0.49582793  0.45349683]
 [ 0.56793266  0.82259485  0.02811064]
 [-0.35910612  0.27837454 -0.89081447]]
2 samples have been recorded

record2

rRecord: r, Calculate: c, Save: s, Quit: q

[[-0.81163333 -0.14185728  0.56668144]
 [-0.26747336  0.95265154 -0.14461342]
 [-0.51933548 -0.26894526 -0.81114679]]
3 samples have been recorded
Record: r, Calculate: c, Save: s, Quit: q
r
[[-0.67410916  0.1870448   0.71455657]
 [ 0.22764802  0.97292509 -0.03991421]
 [-0.70267576  0.13576085 -0.69843809]]
4 samples have been recorded
c
Record: r, Calculate: c, Save: s, Quit: q
============================================================
R_cam2end
Transform:
[[ 0.02341403  0.96697815  0.25378148 -0.08822873]
 [-0.99964886  0.01949493  0.01794709  0.00566516]
 [ 0.01240699 -0.25411258  0.96709506  0.07756586]
 [ 0.          0.          0.          1.        ]]
Quaternions:
[-0.08822872609559883, 0.005665157492463942, 0.07756585852038214, 0.7088730522093655, -0.09594795174349201, 0.08512613400089308, -0.6935751781297171]
Euler angles:
-14.72216660609419 -0.7108864356472807 -88.65824916327023

通过结构数据对比标定参数,可知rotation误差基本在0.3度以内,translation误差在3mm左右。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1665627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

萤火虫优化算法(Firefly Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 萤火虫优化算法&#xff0c;是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁…

Python | Leetcode Python题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; class Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head:return headcur headwhile cur.next:if cur.val cur.next.val:cur.next cur.next.nextelse:cur cur.nextreturn head

PDF文件恢复:四种实用方法全解析

如何恢复已删除的PDF文件&#xff1f; PDF是Portable Document Format&#xff08;便携式文档格式&#xff09;的缩写&#xff0c;是一种由Adobe Systems开发的文件格式。PDF文件可以包含文本、图形、链接、多媒体以及其他各种元素&#xff0c;并且能够在各种操作系统和设备上…

XXE-lab靶场搭建

源码下载地址 https://github.com/c0ny1/xxe-lab1.php_xxe 直接放在php web页面下即可运行。 2.java_xxe java_xxe是serlvet项目&#xff0c;直接导入eclipse当中即可部署运行。 3.python_xxe: 安装好Flask模块python xxe.py 4.Csharp_xxe 直接导入VS中运行 phpstudy…

树莓派遇到ping的奇葩问题解决办法

首先&#xff0c;先 ping raspberrypi 一下。获得树莓派的ip 然后开始配置静态ip winR后输入命令ipconfig查询当前网关ip 输入命令sudo nano /etc/dhcpcd.conf 在最末尾输入以下信息 -----------------------------------------------------------------------------------…

波动性悖论:为何低风险股票长期跑赢高风险对手?

从去年开始&#xff0c;“红利低波”类的产品净值稳步向上&#xff0c;不断新高&#xff0c;让很多人关注到了A股“分红高”、“波动率低”这两类股票。分红高的公司更受投资者青睐&#xff0c;这从基本面的角度很容易理解&#xff0c;那么波动率低的股票明明波动更小&#xff…

8、QT——QLabel使用小记2

前言&#xff1a;记录开发过程中QLabel的使用&#xff0c;持续更新ing... 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 一、基本属性 技巧&#xff1a;对于Qlabel这类控件的属性有一些共同的特点&am…

使用html和css实现个人简历表单的制作

根据下列要求&#xff0c;做出下图所示的个人简历&#xff08;表单&#xff09; 表单要求 Ⅰ、表格整体的边框为1像素&#xff0c;单元格间距为0&#xff0c;表格中前六列列宽均为100像素&#xff0c;第七列 为200像素&#xff0c;表格整体在页面上居中显示&#xff1b; Ⅱ、前…

猜猜歇后语

页面 在输入框中填写你猜的答案&#xff0c;点击“显示答案”按钮&#xff0c;显示正确答案。 页面代码 function showAnswer(element){var elem$(element);elem.next().show();} //# // 初始化DataGrid对象 $(#dataGrid).dataGrid({searchForm: $(#searchForm),columnModel:…

Django性能之道:缓存应用与优化实战

title: Django性能之道&#xff1a;缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 tags: 缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践 引言 在当今的互联网时代&#xff0c;用户对网站和应用…

Virtualbox7.0.10+Ubuntu20.04网络配置

虚拟机部署在服务器上时&#xff0c;需要进行网络配置&#xff0c;使虚拟机和服务器在同网段下&#xff0c;以保证内网的终端可以访问到虚拟机 1. 设置虚拟机 打开虚拟机设置&#xff0c;选择“网络”&#xff0c;将网卡设为桥接网卡 注&#xff1a;设置前&#xff0c;需要先…

JavaScript 防抖与节流——以游戏智慧解锁实战奥秘

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3ae; 引言❓ 什么是防抖和节流&#x1f3f9; 防抖(Debounce) - 锁定追击&#xff0c;精确无误&#x1f4cc; 基础概念&#x1f4cc; 适用场景&#x1f4cc; 实战代码&#xff1a;防抖 应用于输入框的实时搜索 &…

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下&#xff0c;工业机器人使用默认工具坐标系示教的一系列运动点位&#xff0c;要保持原本点位位置不变的情况下&#xff0c;改变机器人工具坐标的参数&#xff0c;就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

基于Django实现的校园疫情监控平台

基于Django实现的校园疫情监控平台 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页&#xff0c;想要使用其他功能都会…

百度GL地图实现某一段路的路况(new BMapGL.DrivingRouteLine)

功能描述&#xff1a; 1.百度地图实现点击地图出现起点&#xff0c;再次点击出现终点&#xff08;起点终点能拖动&#xff09;绘制完终点后获取该路的路况并且起点和终点可以拖动实现实时更新&#xff08;新绘制的路段的&#xff09;路况 2.地点搜索 效果如下&#xff1a; 关键…

Python计算器程序代码

from tkinter import * import random class App: def __init__(self, master): self.master master self.initwidgets() #表达式的值 self.expr None def initwidgets(self): #定义一个输入组件 self.show Label(relief SUNKEN, font (Courier New, 24), width 25, bg …

taro3兼容支付宝/微信小程序的自定义拖拽排序组件

描述&#xff1a;列表可以完成拖拽排序 此组件是根据支付宝原生文档改编成taro-vue3的形式&#xff0c;只保留了拖拽的部分&#xff0c;其他功能都去除了&#xff0c;测试下来可以兼容支付宝和微信小程序。 支付宝原生文档&#xff1a; https://opendocs.alipay.com/support/…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

【JavaEE】Maven简介与实用指南:项目构建和依赖管理的高效工具

目录 Maven什么是 Maven为什么学 Maven创建一个Maven项目依赖传递依赖排除 Maven 仓库本地仓库中央仓库私服 Maven设置国内源配置当前项⽬setting设置新项⽬的setting Maven 什么是 Maven 官⽅对于 Maven 的描述: Maven 是⼀个项⽬管理⼯具。基于 POM(Project Object Model,…

RS3236-ADJ8YF5功能和参数介绍及PDF资料

RS3236-ADJ8YF5功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: SOT-23-5 描述: 输出电压可调(参考电压0.81V),Iout500mA(Max),Vin7.5V(Max),带过温保护 输出类型: 可调 最大输入电压: 7.5V 输出电压: 810mV~6.6V 最大输出电流…