机械臂
绿竹巷人
不想做算法工程师的算法工程师
展开
-
C++点云区域生长利用PCL库
描述利用PCL库进行点云区域生长代码代码中的部分参数,还是要根据你的点云数据的实际情况,进行更改的。举例子,代码中有这样两句话pass.setFilterFieldName ("z"); pass.setFilterLimits (-1000, 1000); 按照相机的z轴方向过滤点,由于我的点单位是mm,所以是-1米到1米,如果你的点云单位是米,上面的参数很显然应该是-1和1完整的main.cpp#include <iostream>//点云需要的头文件#原创 2020-12-21 14:57:50 · 812 阅读 · 3 评论 -
点云相机手眼标定代码——利用PCL库的ICP算法完成手眼标定
描述我有一个点云相机,仅仅能输出点云数据,它要被装到一个机械臂上现在我需要进行手眼标定,如何完成呢? 本篇求出的手眼矩阵,是相机坐标系在手(机械臂末端或者工具末端)坐标系下的位姿。原理简单来说,2D相机通过张正友标定法,是提取黑白棋盘格的角点,来得到相机位姿变换的。点云相机呢,就需要利用它的点云数据了。原理用几句话说,就是: 在机械臂上安装好相机(需绝对固定),使用代码或者示教器变换多个位姿,让相机对着一个物体进行拍照。我们通过这几帧点云之间的变换关系,及采集这几帧点云时的机械臂位姿,就能得到原创 2020-12-11 16:22:11 · 8398 阅读 · 26 评论 -
机械臂沿末端xyz轴移动及旋转(python)
描述机械臂末端的位姿是p时,不想沿着基坐标系来移动,而是想沿着末端的xyz轴来移动接口代码核心函数# 移动def move_endEffector(axis, dist, x, y, z, rx, ry, rz): Rx = np.mat([[1, 0, 0], [0, math.cos(rx), -math.sin(rx)], [0, math.sin(rx), math.cos(rx)]]) Ry = np.mat([[math.cos(ry), 0, math.sin(ry)原创 2020-12-08 16:15:32 · 4189 阅读 · 8 评论 -
欧氏空间位姿与变换矩阵的转换
描述欧式空间6维位姿,与其变换矩阵,二者之间相互转换下面贴出来python和C++代码,先贴出来的是api函数,可以直接调用。不会用的人可以看最后,有使用例子接口代码(可直接使用)pythondef getPose_fromT(T): x = T[0,3] y = T[1,3] z = T[2,3] rx = math.atan2(T[2,1], T[2,2]) ry = math.asin(-T[2,0]) rz = math.atan2(T[1,原创 2020-12-08 15:46:46 · 2399 阅读 · 2 评论 -
Matlab求解AX=XB(手眼标定用)
描述使用matlab求解AX=XB的问题可以正确求出X的值,我已经成功验证了至于说X具体代表什么,要结合你自己推导出的公式AX=XB之中,A、X、B分别代表什么代码main.m包含我做手眼标定时的14组A和B然后使用X= tsai(A,B)一句话就可以求解出手眼矩阵Xclc;clear;num = 14;A=zeros(4,4,num);B=zeros(4,4,num);A(:,:,1)=[0.9997980101273221, -0.01607111192618671, -0.0原创 2020-11-17 20:50:46 · 7386 阅读 · 31 评论 -
C++求解AX=XB(手眼标定用)
描述C++求解AX = XB代码C++求解AX = XB代码网上有很多,这里贴出来两个。Tsai_HandEye和Navy_HandEyeTsai_HandEyeMat skew( Mat res ){ Mat result = (Mat_<double>(3, 3) << 0, -res.at<double>(2), res.at<double>(1), res.at<double>(2), 0, -res.at<原创 2020-11-05 15:59:28 · 3801 阅读 · 7 评论 -
点云相机手眼标定原理(AX=XB)
描述常见的机械臂手眼标定,都是通过相机检测棋盘格的方式来完成的。那么针对点云相机来说,在没有rgb图像的情况下, 该如何完成手眼标定呢我的方法是利用ICP算法,完成3D点云相机的手眼标定点云相机手眼标定原理2D相机的手眼标定过程,看起来是需要机械臂位姿和相机检测结果,事实上,它利用的也是公式 AX = XB 我们先来推一下公式,很简单手眼标定公式核心公式Tobject−in−base =Thand−in−baase⋅Tcamera−in−hand⋅Tobject−in−cameraT原创 2020-11-05 15:57:52 · 5236 阅读 · 0 评论 -
机械臂手眼标定原理及代码
描述本文将简要介绍机械臂手眼标定原理及相关知识基础知识了解手眼标定原理,就必须先了解一句话,叫做“右乘连体左乘基”这句话实际上是读硕士期间,机器人学课程上老师讲的,我会专门写一篇文章来介绍这个定则,这篇我们先不介绍,只用最后的结论。公式Tobject−in−base =Thand−in−baase⋅Tcamera−in−hand⋅Tobject−in−cameraT_{object-in-base\; }=T_{hand-in-baase}\cdot T_{camera-in-hand}\cd原创 2020-11-05 14:54:29 · 14520 阅读 · 19 评论 -
python机械臂坐标变换——实现机械臂末端相对移动
描述假设机械臂末端执行器在pose1位置,x方向正好是它的左侧,想要让它向左侧移动10cm。显然我们直接下发命令,令它的pose1.x = pose1.x + 0.1就好了。但是,如果我们的需求是机械臂在任何位姿下,都需要向它的左侧移动10cm呢(注意,任意位姿时它的正左侧不可能还是x轴正方向)原理及解决方案原理机械臂有pose1和pose2两个位姿,两个6维位姿 {x, y, z, rx, ry, rz }都能得到各自的变换矩阵T1和T2pose2位姿在pose1位姿坐标系下的表示,也就是变原创 2020-10-20 10:49:36 · 4916 阅读 · 14 评论 -
Camshift算法的C++实现
描述Camshift算法可以用来在视频或者摄像头开启时,跟踪某个固定的物体。原理:求待跟踪目标的颜色直方图模型,将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置。不足:受光照影响大,精度不足代码摄像头+鼠标框出物体下面这段代码,会打开摄像头,需要用鼠标框出要跟踪的物体,源代码地址在 https://github.com/prateekvjoshi/Object-Tracker-CAM原创 2020-10-06 20:02:06 · 768 阅读 · 2 评论 -
ROS下查看rviz中的机械臂位姿
描述ROS系统下,想要查看Rviz中机械臂的末端位姿命令在已经roslaunch某个文件,打开了gazebo和rviz后另起终端执行命令rosrun moveit_commander moveit_commander_cmdline.py执行命令use <group name>为自己程序中设置的,我执行的是默认的manipulatoruse manipulator执行命令currentcurrent命令将会返回运动组的当前状态,包括关节的状态(关节1,原创 2020-09-28 09:48:47 · 2665 阅读 · 1 评论 -
ROS下C++控制UR机械臂
描述ROS系统下,使用moveit和gazebo搭建UR机械臂控制的仿真环境,并使用C++编写一个节点来控制UR机械臂的移动ROS系统:kineticUR5机械臂电脑系统:Ubuntu16.04截图和运行效果gazebo的机械臂会先水平,然后依次移动到两个位置rviz中的机械臂移动和gazebo机械臂一致,但是会有一个透明效果的机械臂,沿着同样路径非常滞后的移动代码1. 特殊位置移动(Moveit中默认的位置)#include <moveit/move_group_interfa原创 2020-09-27 21:25:45 · 5909 阅读 · 18 评论 -
ROS下UR机械臂仿真控制失败(机械臂躺着)
描述在使用ROS的kinetic版本控制UR机械臂时,moveit规划成功但UR机械臂不运动的问题失败表现成功的截图如下注意到,MotionPlanning界面下的“Commands”下有四个按钮,分别是“plan”、“Execute”、“Plan and Execute”和“Stop”下面有一个提示,截图中是“Executed”,也即是我运动成功了,可以看到我的UR机械臂已经直立了这里没有截出失败的示意图。失败时,“Executed”的位置为“failed”。机械臂一直是倒下的状态。问题提原创 2020-09-24 14:12:47 · 3818 阅读 · 0 评论 -
ROS下UR机械臂仿真控制(kinetic版)
描述使用ROS的kinetic版本,在gazebo仿真系统下控制UR机械臂问题CMake Warning at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package): Could not find a package configuration file provided by "moveit_core" with any of the following names: moveit_core原创 2020-09-24 11:58:09 · 2784 阅读 · 0 评论 -
一文搞定Eigen基本操作
描述python使用Eigen库加载import numpy as npimport scipy.linalg as la1. 矩阵定义零矩阵m_matrix = np.zeros((5, 2))对角矩阵m_matrix = np.eye(5)2. 基本操作矩阵乘法,两种写法A = B @ CA = B.dot(C)3. 特殊矩阵转置矩阵A = m_matrix.T逆矩阵A = la.inv(m_matrix)4. 特征值和特征向量#原创 2020-08-17 20:58:27 · 6627 阅读 · 0 评论 -
C++Eigen库矩阵常见操作
描述使用C++语言的Eigen库进行一些常见操作代码头文件声明#include <Eigen/Dense>1. 矩阵声明n*n方阵(已知n)Eigen::Matrix2d m_matrix;m_matrix<< 2,3,2.2,1;std::cout << "m_matrix = \n"<< m_matrix<std::endl;注意矩阵里的值有2.2这个浮点型,因此定义Eigen::Matrix2i会出现问题(Matrix2原创 2020-08-17 11:57:36 · 17968 阅读 · 15 评论 -
Eigen矩阵colPivHouseholderQr().solve()求解Ax=b
描述使用eigen库求解Ax=b代码#include <Eigen/Dense>Eigen::Matrix2d A;A << 1,2, 4,5;Eigen::Vector2d b(3, 4);Eigen::Vector2d C = A.colPivHouseholderQr().solve(b);std::cout<<C<<std::endl;输出的结果是-2.33333 2.66667代码中的colPivHouseh原创 2020-07-30 22:35:37 · 9470 阅读 · 0 评论 -
弧度角归一化
描述在编写代码时,一般都是使用弧度角进行计算。弧度角可以是任意的,但作为工程处理来说,一般需要弧度角保持在 -π ~ π 之间代码实现方式是有很多的,这里贴出的是百度apollo代码中的实现方式#include <math.h>double NormalizeAngle(double angle) { double a = fmod(angle + M_PI, 2.0 * M_PI); if (a < 0.0) { a += (2.0 *原创 2020-07-30 15:41:52 · 2559 阅读 · 7 评论 -
二维数据坐标变换
描述存在两个坐标系,同一个点在两个坐标系下的表示关系坐标变换1. 基坐标系转到自定义坐标系基坐标系下有一个点,点为(x,y),自定义坐标系相对于基坐标系先绕原点O旋转角度为θθθ,再平移(xT,yTx^{T}, y^{T}xT,yT)则这个点在自定义坐标系下的位置(x’,y’)是[x′y′]= [cosθ sinθ−sinθ cosθ] [xy] + [xTyT]\left[ \begin{array}{c} x' \\ y' \end{array} \right]=\; \原创 2020-07-28 16:50:28 · 1266 阅读 · 0 评论 -
机械臂项目摘要
机械臂项目概述谈机械臂之前,首先简单介绍机器人吧。在工业技术中,机器人有着“皇冠顶端的明珠”的美誉。机器人的种类包括很多种,也有很多分类方式,我国的各种机器人发展报告中倾向将机器人分为三个大类:工业机器人服务机器人特种机器人关于机器人这里就不多阐述了,我们直奔主题——机械臂机械臂,机器人大家族的重要组成部分,其执行效率和精度高,在工业领域发挥着重要作用。机械臂项目的开发更是需要横跨多...原创 2019-12-10 22:13:31 · 2559 阅读 · 0 评论