第二章:机器人基础——运动学与抓取构型
各位同学好,我是老张。今天咱们聊聊机器人基础里最核心的几个概念。说实话,我当年刚入行时,觉得运动学就是背公式,直到第一次调试真实机器人,才发现理论跟实践之间隔着一条鸿沟。嗯,咱们今天就把这条鸿沟填平。
2.1 机器人运动学基础
运动学说白了,就是研究机器人怎么动。不涉及力,只关心位置、速度和加速度。我个人习惯把它分成两块:正解和逆解。
2.1.1 正运动学:从关节到末端
正运动学很简单:你告诉机器人每个关节转多少度,它告诉你末端在哪儿。就像你抬起胳膊,知道肩关节和肘关节的角度,自然就知道手的位置。
数学上,我们用齐次变换矩阵来描述。每个关节对应一个矩阵,把它们乘起来,就得到末端位姿。
// 伪代码示例:正运动学计算
T_0_1 = DH_transform(theta1, d1, a1, alpha1);
T_1_2 = DH_transform(theta2, d2, a2, alpha2);
T_2_3 = DH_transform(theta3, d3, a3, alpha3);
T_0_3 = T_0_1 * T_1_2 * T_2_3; // 末端位姿
我在项目中遇到过一个问题:正解算出来明明是对的,但机器人就是走不到那个点。后来发现是DH参数里的坐标系定义跟实际机器人不一致。所以,参数标定是正解准确的前提。
2.1.2 逆运动学:从末端到关节
逆解就反过来了:你告诉机器人末端要去哪儿,它算出每个关节该转多少。这比正解难得多,因为解不唯一,甚至可能无解。
你想想看,六轴机器人有6个关节,但末端位姿只有6个自由度(3个位置+3个姿态)。理论上解是有限的,但实际中因为关节限位、奇异点等问题,经常需要选最优解。
核心要点:逆解算法主要有两种——解析法和数值法。解析法快但依赖机器人构型,数值法通用但慢。我建议:能用解析法就别用数值法。
为什么会这样?因为数值法(比如牛顿-拉夫森法)需要迭代,可能不收敛,而且实时性差。我在做视觉抓取时,逆解必须在1ms内完成,数值法根本扛不住。
2.2 常用抓取构型
抓取构型,说白了就是机器人用什么「手」去抓东西。最常见的两种:平行夹爪和吸盘。
2.2.1 平行夹爪
平行夹爪像人的两根手指,从两侧夹住物体。优点是抓得稳,适合不规则物体。缺点是会占用空间,而且对物体尺寸有要求。
| 特性 | 平行夹爪 | 吸盘 |
|---|---|---|
| 适用物体 | 刚性、不规则 | 平整、轻质 |
| 抓取力 | 大 | 中等 |
| 速度 | 中等 | 快 |
| 成本 | 高 | 低 |
我曾经在产线上遇到过一个问题:用平行夹爪抓取金属零件,结果夹爪打滑。后来发现是夹爪表面太光滑,贴了一层防滑硅胶就解决了。嗯,细节决定成败。
2.2.2 吸盘
吸盘靠负压吸附物体。优点是速度快、不占空间,适合抓取平板、玻璃、纸箱等。缺点是对表面平整度要求高,而且不能抓太重的东西。
避坑指南:我曾经用吸盘抓取带孔的零件,结果漏气吸不住。后来改用多吸盘阵列,每个吸盘独立控制,才解决问题。记住:吸盘不是万能的,选型前一定要测试。
2.3 ROS2基础通信机制
ROS2是机器人开发的事实标准。它的通信机制,说白了就是节点之间怎么说话。我刚开始学ROS2时,觉得概念太多,其实核心就三个:话题、服务、动作。
2.3.1 话题(Topic)
话题是异步通信,发布者发消息,订阅者收消息。适合传感器数据、状态信息等持续更新的数据。
// 发布者示例
rclcpp::Publisher<sensor_msgs::msg::JointState>::SharedPtr pub;
pub = this->create_publisher<sensor_msgs::msg::JointState>("joint_states", 10);
// 订阅者示例
auto sub = this->create_subscription<geometry_msgs::msg::Pose>(
"target_pose", 10, callback);
我个人习惯用话题来传递视觉检测结果。比如相机检测到物体位置,就发布到/object_pose话题,规划节点订阅后计算抓取路径。
2.3.2 服务(Service)
服务是同步通信,客户端发请求,服务端回响应。适合一次性操作,比如「启动抓取」、「查询状态」。
// 服务端示例
rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr srv;
srv = this->create_service<std_srvs::srv::Trigger>(
"grasp",
[this](const std::shared_ptr<std_srvs::srv::Trigger::Request> req,
std::shared_ptr<std_srvs::srv::Trigger::Response> res) {
// 执行抓取
res->success = true;
});
注意:服务调用会阻塞,如果服务端处理时间太长,客户端会超时。我曾经在抓取服务里加了图像处理,结果超时了。后来把图像处理放到话题里,服务只做触发,问题就解决了。
2.3.3 动作(Action)
动作是服务的升级版,支持反馈和取消。适合长时间任务,比如「移动到目标点」、「执行抓取序列」。
// 动作客户端示例
rclcpp_action::Client<control_msgs::action::FollowJointTrajectory>::SharedPtr client;
client = rclcpp_action::create_client<control_msgs::action::FollowJointTrajectory>(
this, "joint_trajectory_action");
// 发送目标
auto goal_msg = control_msgs::action::FollowJointTrajectory::Goal();
goal_msg.trajectory = trajectory;
auto send_goal_options = rclcpp_action::Client<>::SendGoalOptions();
send_goal_options.feedback_callback = feedback_callback;
client->async_send_goal(goal_msg, send_goal_options);
你想想看,如果让机器人移动到目标点,用服务的话,你只能等它完成,中间不知道进度。用动作的话,你可以实时收到反馈,还能随时取消。所以,长时间任务首选动作。
2.4 知识体系总览
为了让大家更直观地理解本章内容,我画了一张图。这张图展示了机器人基础的核心逻辑:从运动学计算到抓取构型选择,再到ROS2通信实现。
这张图把本章的三个核心模块串起来了。运动学负责「算」,抓取构型负责「抓」,ROS2负责「通」。三者缺一不可。
总结一下:正解和逆解是机器人的「大脑」,平行夹爪和吸盘是机器人的「手」,ROS2是机器人的「神经系统」。搞懂这三块,视觉引导抓取就成功了一半。
好了,今天就到这儿。下一章咱们会深入视觉部分,讲讲相机标定和物体检测。嗯,到时候见。