vrep/coppeliasim+matlab,机器视觉,机械臂轨迹巡线,利用matlab提取像素轨迹,再转换到机械臂坐标系下,让机械臂末端沿着轨迹走;

最近在捣鼓机械臂轨迹复现的项目,发现用CoppeliaSim+MATLAB搞视觉引导巡线真是妙啊!咱们可以直接用摄像头拍张轨迹图,让MATLAB当大脑处理图像,最后指挥机械臂描着线走。整个过程就像教机器人临摹字帖,只不过这次用的是像素坐标和齐次矩阵。

先甩个图像处理的代码片段:

% 读取轨迹图像并二值化
traj_img = imread('black_line.jpg');
gray_img = rgb2gray(traj_img);
bw_img = imbinarize(gray_img, 0.5); 

% 提取轨迹边缘点
edge_points = edge(bw_img, 'canny');
[y, x] = find(edge_points);
scatter(x, y, 3, 'filled'); % 可视化提取结果

这段代码先用经典canny算子抓边缘,有意思的是我故意把阈值调到0.5来应对光照不均。实际跑起来发现,要是遇到反光区域,得加个形态学闭运算填洞,不然轨迹线会断成贪吃蛇。

坐标转换才是重头戏!这里有个空间魔术:

% 手眼标定参数(需要提前标定)
pixel2meter = 0.0012; 
cam_offset = [0.15, -0.08]; % 相机与机械臂基座偏移

function world_pt = pixel2world(pixel_pt)
    world_x = (pixel_pt(1)*pixel2meter) + cam_offset(1);
    world_y = (size(bw_img,1)-pixel_pt(2))*pixel2meter + cam_offset(2); 
    world_pt = [world_x, world_y, 0.05]; % Z轴固定抬升高度
end

转换函数里那个size(bwimg,1)-pixelpt(2)是精髓——图像坐标系Y轴是反的,这个翻转操作坑过我两次。z轴0.05是安全高度,实际跑的时候得先走这个高度再下降,避免撞到工作台。

vrep/coppeliasim+matlab,机器视觉,机械臂轨迹巡线,利用matlab提取像素轨迹,再转换到机械臂坐标系下,让机械臂末端沿着轨迹走;

机械臂控制部分用CoppeliaSim的远程API挺方便:

% 连接V-REP
vrep = remApi('remoteApi');
clientID = vrep.simxStart('127.0.0.1', 19997, true, true, 5000, 5);

% 获取机械臂句柄
[~, arm] = vrep.simxGetObjectHandle(clientID, 'UR5', vrep.simx_opmode_blocking);

% 逆运动学求解
function setArmPosition(pos)
    target = vrep.simxGetObjectHandle(clientID,'target',vrep.simx_opmode_blocking);
    vrep.simxSetObjectPosition(clientID, target, -1, pos, vrep.simx_opmode_oneshot);
    vrep.simxCallScriptFunction(clientID,'UR5',vrep.sim_scripttype_childscript,'moveToTarget',[],[],[],vrep.simx_opmode_blocking);
end

这里偷懒用了目标拖拽法,其实更硬核的玩法是直接调逆解算法。注意simxopmodeblocking会阻塞直到操作完成,要是轨迹点太密集得改用异步模式,不然机械臂动作会卡成PPT。

最后来个主循环收尾:

% 按顺序走点
path_points = sortrows([x y], 1); % 按X坐标排序
for i = 1:5:length(path_points) % 间隔采样防抖动
    target_pos = pixel2world(path_points(i,:));
    setArmPosition(target_pos);
    pause(0.3); % 等机械臂到位
end

间隔采样是个实用技巧,原始轨迹点可能有几百个,全走一遍得走到天亮。实际测试发现步长设5,延时0.3秒时,UR5机械臂能走出丝滑效果。要是出现抖动,八成是逆解存在多解,得加个关节空间插值滤波。

这套方案在捡零件场景下特别好使,下次试试在曲面上投影轨迹应该也适用。不过要吐槽下CoppeliaSim的MATLAB API文档,有些参数说明写得跟谜语似的,得靠试错法才能搞明白。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐