从头手搓一台ros2复合机器人(带机械臂)

本文介绍了机器人运动中空间坐标系的基础概念,包括参考坐标系的选择、位置与姿态的描述,以及位姿(位置+姿态)的重要性。重点讲解了旋转矩阵在描述姿态关系中的应用,涉及坐标平移、旋转和平移旋转复合变换,以及右手坐标系的确定。结尾部分给出了课后练习,鼓励读者深入理解这些概念。
摘要由CSDN通过智能技术生成

一.前言

        从今天开始跟着小鱼老师学习了机器人运动的入门篇并记录了自己的学习过程,这一部分主要是学习空间坐标系中位姿之间的关系,第一遍学习时还是有点懵逼,但我将学习的内容加入了自己的见解,理解起来可能会相对容易一些,课后有一道练习题,大家记得看一下。好的,话不多说,马上开始!

二.ros2学习

         前四小节内容可以订阅往期博客。

5.空间坐标描述

首先,我们要明白无论是在二维空间还是在三维空间,我们想要描述一个物体的位置姿态第一步就是确定一个参考坐标系,物体的位置和姿态描述我们都是以这个坐标系作为参考的。(注意:不要混淆位置和姿态的概念)

参考坐标系,这一点很重要,因为没有绝对的坐标,只有相对的坐标。

假如我们确定了一个空间直角坐标系A,我们就可以使用x,y,z来确定A坐标系中任意一点P的位置,可以记作:

再比如:

所以参考坐标系{A}中一点P也可以写作:

好,位置的表示大概就是以上内容,接下来介绍一下什么是姿态

我们已经知道坐标系A中的一个点P的位置,我们如何描述P点在{A}坐标系下的姿态呢?

上图是使用RVIZ2绘制的,红色代表x轴,绿色代表y轴,蓝色代表z轴。

从图中可以看出,坐标系{P}的每一个轴和参考坐标系的每一个轴之间都有一个角度,比如Px轴和Ax,Ay,Az三个轴之间存在三个角度,通过这三个角度我们就可以确定Px轴和参考坐标系{A}之间的关系,以此类推,我们也可以确定Py轴和Pz轴分别与{A}之间的关系。

每个轴的相对姿态关系确定了,坐标系之间的姿态也就确定了,点的姿态也就确定了。

我们将上述坐标系{P}的三个轴相对于参考坐标系{A}三个轴的共九个角度的余弦值,组成一个3*3的矩阵,该矩阵就是旋转矩阵,因该矩阵是{P}相对于{A}的姿态关系的表示,故记作:

两个向量的点乘为两个向量的长度与它们夹角余弦的积,所以可以表示为单位向量Px​与Ax​的点积,旋转矩阵就可以写为下面的形式

注意:

  • 当两个坐标系之间姿态没有变化,即坐标系间x,y,z轴方向对应重合,则旋转矩阵为单位矩阵
  • 从矩阵的角度看,矩阵的逆等于矩阵的转置,则该矩阵为正交矩阵,显而易见,旋转矩阵是正交矩阵

 okok,接下来就是个人感觉最难理解的部分啦,希望能挨个字认真理解

        通过位置矢量我们可以描述一个点在特定参考坐标系下的位置,通过旋转矩阵可以描述一个点在特定参考坐标系下的姿态。

        在机器人当中位置和姿态一般会一起出现,所以我们将其组合就叫做位姿(位姿=位置+姿态。书面性的概念我就不过多介绍了,接下来根据具体应用例子来理解。

        位姿是相对的,同一个物体在不同的参考坐标系下的位姿数据肯定是不同的。比如在手眼系统中,我们可以通过视觉算法获取到工件坐标系P相机坐标系C之间的关系,我们想要控制机械臂的末端运动到工件坐标系P进行夹取,那么我们就要知道工件坐标系P机器人基坐标系B下的位姿,这就需要进行坐标变换了。

5.1 平移坐标变换

如图,坐标系{A}、{B}、{C}的姿态是相同的,其之间的姿态对应的旋转矩阵都是单位矩阵。(图片

中一个格子长度为1)

坐标平移方程:

5.2 旋转坐标变换

如果坐标系之间姿态不同,同一个点的位姿在不同参考姿态下的位置和姿态也会不一样。

上图中,坐标系{A}鱼坐标系{B}原点重合

这个问题就稍微有点复杂了,我们一步步来说:
1.因为{B}鱼{C}姿态相同,所以{A}参考坐标系下{C}的姿态和{A}参考坐标系下{B}的姿态是相同的,即:

3D Rotation Converter我们可以使用这个工具进行验证:

我们接着来举一反三

{B}绕着{A}的z轴旋转了45度我们计算出来了,那如果{B}绕着{A}的z轴旋转θ角度该如何呢?

如果不是绕着z轴旋转,而是绕着x轴或y轴呢?依葫芦画瓢都能算出来

注意:{C}的参考坐标系从{B}变成了{A},{C}在空间中的位置并没有发生变化

5.3 平移旋转复合变换

        在我们平时搞机器人时,一般情况下两个坐标系原点不重合姿态也不相同。

        我们将坐标变换拆分成先绕参考坐标系旋转,再绕参考坐标系平移两步,这样我们就得到了坐标的复合变换方程

        说白了,我们可以先假想一个坐标系A'(姿态与A相同)与坐标系B原点重合,然后先用旋转坐标变换把坐标系C的分量变换到A'上,最后再通过平移坐标变换把A'还原到A

5.4 右手坐标系

用右手确定的坐标系就是右手坐标系

拿起右手,先给竖起大拇指,然后打开手掌,将大拇指的方向朝向下图中的蓝色z轴,让剩下的四根手指朝向红色的x轴,此时朝向手心外的就是绿绿的y轴的方向了。

5.5 课后练习

        算旋转矩阵时,第一列的三个值分别是用所求坐标的x轴与参考系的x,y,z轴夹角的余弦值,第二列的三个值分别是用所求坐标的y轴与参考系的x,y,z轴夹角的余弦值,第三列的三个值分别是用所求坐标的z轴与参考系的x,y,z轴夹角的余弦值

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在ROS2中安装适当的机械臂控制软件包,例如ros2_control和ros2_controllers。然后,需要实现一个控制器节点,该节点可以订阅来自机械臂的当前状态信息(例如位置、速度、加速度等)和目标状态信息,并计算控制器输出,例如PID控制器的输出。最后,需要将控制器输出发布到机械臂的控制接口(例如ROS2服务或话题)。以下是一个C++示例代码框架,其中您可以替换控制器的实现。 ```c++ #include <rclcpp/rclcpp.hpp> #include <std_msgs/msg/Float64.hpp> #include <sensor_msgs/msg/JointState.hpp> class ArmPIDController : public rclcpp::Node { public: ArmPIDController() : Node("arm_pid_controller") { // Initialize subscribers and publishers joint_state_sub_ = this->create_subscription<sensor_msgs::msg::JointState>( "joint_states", 10, std::bind(&ArmPIDController::jointStateCallback, this, std::placeholders::_1)); target_position_sub_ = this->create_subscription<std_msgs::msg::Float64>( "target_position", 10, std::bind(&ArmPIDController::targetPositionCallback, this, std::placeholders::_1)); arm_position_pub_ = this->create_publisher<std_msgs::msg::Float64>("arm_position", 10); // Initialize PID controller parameters kp_ = 0.1; ki_ = 0.01; kd_ = 0.001; error_sum_ = 0.0; last_error_ = 0.0; } private: void jointStateCallback(const sensor_msgs::msg::JointState::SharedPtr joint_state) { // Update controller state with joint state information // ... // Compute PID controller output double error = target_position_ - current_position_; error_sum_ += error; double d_error = error - last_error_; double output = kp_ * error + ki_ * error_sum_ + kd_ * d_error; last_error_ = error; // Publish controller output std_msgs::msg::Float64 arm_position; arm_position.data = output; arm_position_pub_->publish(arm_position); } void targetPositionCallback(const std_msgs::msg::Float64::SharedPtr target_position) { // Update controller state with target position information target_position_ = target_position->data; } rclcpp::Subscription<sensor_msgs::msg::JointState>::SharedPtr joint_state_sub_; rclcpp::Subscription<std_msgs::msg::Float64>::SharedPtr target_position_sub_; rclcpp::Publisher<std_msgs::msg::Float64>::SharedPtr arm_position_pub_; double kp_; double ki_; double kd_; double error_sum_; double last_error_; double current_position_; double target_position_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<ArmPIDController>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值