下面我将从入门级到高级,为您提供一份详细的 MATLAB 机器人程序指南,包括核心概念、代码示例和项目实践。

目录
- MATLAB 机器人工具箱 简介
- 入门级:创建和可视化一个简单的机器人
- 核心基础:正运动学 和逆运动学
- 进阶应用:路径规划与轨迹跟踪
- 高级应用:SLAM (Simultaneous Localization and Mapping)
- 项目实践:两轮差速机器人仿真
- 从仿真到现实:硬件接口
- 学习资源与总结
MATLAB 机器人工具箱 简介
您需要确保安装了 Robotics System Toolbox™,这是进行机器人开发的核心工具箱,您可以在 MATLAB 命令窗口输入 ver 并查找 Robotics System Toolbox 来确认是否已安装。
这个工具箱提供了丰富的类和函数,用于:
- 机器人模型定义:
rigidBodyTree,rigidBody,transformTree - 运动学分析:
forwardKinematics,inverseKinematics - 轨迹规划:
jointTrajectory,quinticpolytraj - 机器人可视化:
show,plot - 算法:
monteCarloLocalization(粒子滤波),occupancyMap(占据栅格地图)
入门级:创建和可视化一个简单的机器人
我们将创建一个最经典的机器人——2D 平面机械臂,并学习如何可视化它。
代码示例:创建一个两连杆机械臂
% 清理工作区和命令窗口
clear;
clc;
close all;
% --- 创建一个刚体树 来表示机器人 ---
robot = rigidBodyTree;
% --- 定义第一个连杆 ---
% 创建一个刚体对象
body1 = rigidBody('link1');
% 定义连杆的坐标系原点相对于其父坐标系的位置
body1.Joint.FixedTransform = trvec2tform([0.5, 0, 0]); % 连杆长度为0.5米
% 设置关节类型,'revolute' 表示旋转关节
body1.Joint.JointType = 'revolute';
% 设置关节的运动轴,这里是绕Z轴旋转(垂直于屏幕)
body1.Joint.Axis = [0 0 1];
% --- 定义第二个连杆 ---
body2 = rigidBody('link2');
body2.Joint.FixedTransform = trvec2tform([0.3, 0, 0]); % 连杆长度为0.3米
body2.Joint.JointType = 'revolute';
body2.Joint.Axis = [0 0 1];
% --- 将连杆添加到机器人树中 ---
% 第一个连杆没有父连杆,所以它的父是 'base'
addBody(robot, body1, 'base');
% 第二个连杆的父连杆是 'link1'
addBody(robot, body2, 'link1');
% --- 可视化机器人 ---
figure;
show(robot, 'Frames', 'on', 'AxisLimits', [-1 1 -1 1]); % 显示坐标系和坐标轴范围'两连杆机械臂');
xlabel('X (m)');
ylabel('Y (m)');
grid on;
% --- 让机器人动起来 ---
% 定义关节角度 (弧度)
% theta1 = 0, theta2 = pi/2 (90度)
angles1 = [0, pi/2];
% theta1 = pi/4 (45度), theta2 = -pi/4 (-45度)
angles2 = [pi/4, -pi/4];
% 创建一个简单的动画
for i = 0:0.1:1
% 插值计算当前时刻的关节角度
current_angles = angles1 * (1-i) + angles2 * i;
% 更新机器人可视化
show(robot, 'JointAngles', current_angles, 'Frames', 'on', 'AxisLimits', [-1 1 -1 1]);
drawnow; % 强制立即刷新图形
pause(0.05); % 暂停一下,形成动画效果
end
代码解释:

rigidBodyTree: 创建一个空的机器人模型骨架。rigidBody: 创建一个连杆(刚体),并指定其名称。trvec2tform: 将平移向量[x, y, z]转换为齐次变换矩阵T,定义了连杆的几何形状。addBody: 将连杆添加到机器人树中,并指定其父连杆。show: 核心可视化函数,'JointAngles'参数用于设置各个关节的角度,从而驱动机器人模型。
核心基础:正运动学 和逆运动学
这是机器人学的两大基石。
A. 正运动学
已知所有关节角度,求解机器人末端执行器在空间中的位姿(位置和姿态)。
代码示例:计算正运动学
% 假设我们使用上面创建的 'robot' 模型
% 设置一组特定的关节角度
joint_angles = [pi/4, pi/3]; % 45度 和 60度
% 计算末端执行器(通常是最后一个连杆)的位姿
% 'endeffector' 是默认的末端执行器名称
[pose, info] = forwardKinematics(robot, joint_angles, 'endeffector');
% 显示结果
disp('末端执行器的齐次变换矩阵 T:');
disp(pose);
% 从变换矩阵中提取位置信息
position = pose(1:3, 4);
fprintf('末端执行器的位置: [x, y, z] = [%.3f, %.3f, %.3f] 米\n', position(1), position(2), position(3));
B. 逆运动学
已知期望的末端执行器位姿,求解能够达到该位姿的关节角度。
代码示例:计算逆运动学
% 假设我们想让机械臂末端移动到 [0.6, 0.3, 0] 的位置
% 并且保持朝向为默认(沿X轴)
desired_pose = eye(4); % 单位矩阵表示原点,沿X轴正方向
desired_pose(1:3, 4) = [0.6; 0.3; 0]; % 设置目标位置
% 创建一个逆运动学求解器
ik_solver = inverseKinematics('RigidBodyTree', robot);
ik_params = struct('MaxIterations', 1000);
% 初始猜测的关节角度
initial_guess = [0, 0];
% 调用求解器
[q_sol, solution_info, error_info] = ik_solver(initial_guess, desired_pose, ik_params);
% 显示结果
fprintf('求解得到的关节角度: [theta1, theta2] = [%.3f, %.3f] 弧度\n', q_sol(1), q_sol(2));
fprintf(' = [%.1f, %.1f] 度\n', rad2deg(q_sol(1)), rad2deg(q_sol(2)));
% 验证结果:用求解出的关节角度计算正运动学,看是否与目标位姿匹配
[verified_pose, ~] = forwardKinematics(robot, q_sol, 'endeffector');
disp('验证:计算出的末端位姿与目标位姿的误差:');
disp(verified_pose - desired_pose);
进阶应用:路径规划与轨迹跟踪
机器人不能瞬间移动,需要平滑的轨迹。

代码示例:规划一条从 A 点到 B 点的平滑轨迹
% 假设机器人有两个关节
num_joints = 2;
% 定义起点和终点的关节角度
start_angles = [0, 0]; % 初始位置
end_angles = [pi/2, -pi/2]; % 目标位置
% 定义路径的总时间和中间点数量
total_time = 5; % 秒
num_waypoints = 50;
% 生成中间点(线性插值)
waypoints = linspace(start_angles, end_angles, num_waypoints)';
% 使用五次多项式生成平滑轨迹
% 这确保了位置、速度和加速度在轨迹起点和终点都为零(平滑启停)
[positions, velocities, accelerations, times] = quinticpolytraj(waypoints, total_time);
% 可视化轨迹
figure;
% 绘制关节角度位置图
subplot(3,1,1);
plot(times, positions);'关节角度轨迹');
xlabel('时间 (s)');
ylabel('角度 (rad)');
legend('关节 1', '关节 2');
grid on;
% 绘制关节速度图
subplot(3,1,2);
plot(times, velocities);'关节速度轨迹');
xlabel('时间 (s)');
ylabel('角速度 (rad/s)');
legend('关节 1', '关节 2');
grid on;
% 绘制关节加速度图
subplot(3,1,3);
plot(times, accelerations);'关节加速度轨迹');
xlabel('时间 (s)');
ylabel('角加速度 (rad/s^2)');
legend('关节 1', '关节 2');
grid on;
% 动画演示机器人沿轨迹运动
figure;
show(robot, 'AxisLimits', [-1 1 -1 1]);
for i = 1:length(times)
show(robot, 'JointAngles', positions(:,i), 'Frames', 'on');
drawnow;
pause(times(2) - times(1)); % 根据时间步长暂停
end
高级应用:SLAM (Simultaneous Localization and Mapping)
SLAM 是让机器人在未知环境中同时构建地图并确定自身位置的技术,MATLAB 工具箱提供了强大的支持。
概念和代码框架
这里我们以 基于粒子滤波的蒙特卡洛定位 为例,假设地图已知,机器人进行自定位。
% 1. 创建一个占据栅格地图
% 假设地图是一个 10x10 米的区域,有障碍物
map = occupancyMap(10, 10, 10); % 10x10 米,分辨率 10 像素/米
% 添加一些矩形障碍物
insertShape(map, 'rectangle', [2, 2, 1, 4]); % [x, y, width, height]
insertShape(map, 'rectangle', [6, 6, 3, 1]);
% 2. 创建一个机器人模型(例如差速驱动机器人)
robot = differentialDriveRobot;
% 3. 创建粒子滤波器
% 设置初始状态猜测 [x, y, theta],并添加不确定性
initial_state = [5, 5, pi/4]; % 初始位置和朝向
initial_state_covariance = diag([0.5^2, 0.5^2, (pi/12)^2]); % 初始状态协方差(不确定性)
% 设置运动和传感器噪声
motion_noise = [0.1, 0.1, 0.05]; % [x_noise, y_noise, theta_noise]
sensor_noise = 0.2; % 传感器读数噪声
% 创建粒子滤波器
pf = monteCarloLocalization(initial_state, initial_state_covariance, map, ...
'MotionNoise', motion_noise, 'SensorNoise', sensor_noise);
% 4. 仿真循环
num_steps = 100;
true_state = initial_state;
for i = 1:num_steps
% --- 真实世界的运动 ---
% 控制命令:前进0.2米,左转0.1弧度
v = 0.2; % 线速度
w = 0.1; % 角速度
dt = 0.1; % 时间步长
% 更新真实状态(简单的运动学模型)
true_state = true_state + [v*cos(true_state(3))*dt; v*sin(true_state(3))*dt; w*dt];
% --- 传感器读数 ---
% 模拟激光雷达扫描
ranges = scanSensor(true_state, map);
% --- 预测和更新粒子滤波器 ---
% 预测步骤:根据控制命令更新所有粒子
predict(pf, [v, w], dt);
% 更新步骤:根据传感器读量更新粒子权重
update(pf, ranges);
% 重采样步骤:去除低权重粒子,复制高权重粒子
resample(pf);
% --- 可视化 ---
if mod(i, 10) == 0
show(pf);
hold on;
% 绘制真实位置
plot(true_state(1), true_state(2), 'g*', 'MarkerSize', 10, 'LineWidth', 2);
hold off;
title(sprintf('粒子滤波定位 (Step %d)', i));
drawnow;
pause(0.05);
end
end
disp('仿真结束。');
项目实践:两轮差速机器人仿真
这是一个更完整的例子,模拟一个常见的移动机器人。
% 1. 创建差速驱动机器人模型
robot = differentialDriveRobot;
robot.WheelRadius = 0.1; % 轮子半径 0.1米
robot.WheelBase = 0.2; % 两轮间距 0.2米
% 2. 创建环境地图
map = occupancyMap(20, 20, 20);
insertShape(map, 'rectangle', [5, 5, 2, 10]);
insertShape(map, 'rectangle', [15, 5, 2, 10]);
insertShape(map, 'rectangle', [8, 15, 4, 2]);
% 3. 设置初始位置和目标
initial_pose = [1, 1, 0]; % [x, y, theta]
goal_pose = [18, 18, pi/4];
% 4. 规划路径(使用 A* 算法)
% 需要先安装 Navigation Toolbox
if ~license('test', 'Navigation_Toolbox')
error('需要 Navigation Toolbox 来运行 A* 路径规划。');
end
path = plannerAStar(map, 'GridStep', 0.5);
path = path(initial_pose(1:2), :); % 从起点开始规划
path = [path; goal_pose(1:2)']; % 添加终点
% 5. 生成轨迹
velocities = [0.3, 0.2]; % [v_max, w_max]
ref_path = referencePathFrenet(path);
trajectory = refPathTrajectory(ref_path, 'SampleTime', 0.1, 'MaxAngularVelocity', velocities(2), 'MaxLinearVelocity', velocities(1));
% 6. 仿真
figure;
show(map);
hold on;
show(robot, 'Mesh', 'on', 'Goal', goal_pose);
plot(path(1,:), path(2,:), 'r--', 'LineWidth', 2);'差速机器人路径跟踪仿真');
hold off;
state = initial_pose;
h_robot = plot(state(1), state(2), 'bo', 'MarkerSize', 8, 'MarkerFaceColor', 'b');
h_path = plot(state(1), state(2), 'g-', 'LineWidth', 2);
for t = 0:trajectory.SampleTime:trajectory.Duration
% 获取当前时刻的参考状态
ref_state = trajectory(t);
% 简单的 P 控制器来计算控制命令
Kp_linear = 1.0;
Kp_angular = 2.0;
v = Kp_linear * (ref_state(1) - state(1)); % 这是一个简化的控制,实际应为速度控制
w = Kp_angular * (ref_state(3) - state(3));
% 更新机器人状态
state = state + [v*cos(state(3)); v*sin(state(3)); w] * trajectory.SampleTime;
% 更新可视化
set(h_robot, 'XData', state(1), 'YData', state(2));
set(h_path, 'XData', [get(h_path, 'XData'), state(1)], 'YData', [get(h_path, 'YData'), state(2)]);
drawnow;
pause(trajectory.SampleTime);
end
从仿真到现实:硬件接口
MATLAB 的强大之处在于它能无缝连接硬件。
- ROS Toolbox: 可以连接到运行 ROS (Robot Operating System) 的机器人,您可以发布话题(
rospub)来发送控制命令,订阅话题(rosub)来接收传感器数据。 - Arduino Support Package: 直接与 Arduino 微控制器通信,读取传感器(如超声波、IMU)和控制电机。
- 支持包: 针对特定硬件(如 TurtleBot, DJI无人机)的支持包,提供了高级API。
示例:通过ROS发送速度命令
% 创建一个ROS节点
rosinit;
% 创建一个发布者,话题名为 '/cmd_vel',消息类型为 geometry_msgs/Twist
cmd_vel_pub = rospublisher('/cmd_vel', 'geometry_msgs/Twist');
% 创建一个Twist消息对象
msg = rosmessage('geometry_msgs/Twist');
% 设置线速度和角速度
msg.Linear.X = 0.2; % 前进 0.2 m/s
msg.Angular.Z = 0.1; % 左转 0.1 rad/s
% 发布消息
send(cmd_vel_pub, msg);
% 等待一段时间
pause(2);
% 停止机器人
msg.Linear.X = 0;
msg.Angular.Z = 0;
send(cmd_vel_pub, msg);
% 关闭ROS节点
rosshutdown;
学习资源与总结
如何开始学习?
- 官方文档是最好的老师:MathWorks 官网的文档和示例写得非常出色,搜索
Robotics System Toolbox,查看每个函数的详细说明和示例。 - MATLAB Onramp: 完成官方的 MATLAB 入门课程,熟悉基本语法。
- Robotics System Toolbox Onramp: 完成专门的机器人工具箱入门课程。
- 实践,实践,再实践:从上面的简单例子开始,尝试修改参数,添加功能,解决小问题。
MATLAB 为机器人学提供了一个极其高效的“闭环”开发环境: 建模 -> 仿真 -> 分析 -> 实现
无论您是学生、研究人员还是工程师,掌握 MATLAB 都能让您的机器人开发工作事半功倍,希望这份指南能帮助您顺利开启 MATLAB 机器人编程之旅!
标签: MATLAB机器人控制代码编写 机器人运动学MATLAB仿真实现 MATLAB机器人路径规划程序设计