【机器人学】使用解析法求解6轴机械臂的逆运动学解

        本文是承接上一篇求3轴拟人机械臂逆解内容(链接),扩展到求6轴机械臂的逆解,研究的仍然是目前比较流行的工业机械臂构型:拟人臂+球形腕关节(如下图1和图2所示),因为这种构型的机械臂具有闭合形式的逆运动学解,并且可以将机械臂末端的位置和方向分开求解,即根据手腕的位置可求出前三个关节的值,根据手腕的姿态可求出后三个关节(手腕关节)的值。


这里写图片描述

图1 工业机械臂

这里写图片描述

图2 拟人臂+球形手腕

        我们已经知道拟人臂(链接)和球形手腕(链接)的求逆解方法,现在介绍一种方法可以将求6个关节的值的步骤分成以上求臂和求手腕两个过程。对带球形腕的机械臂而言,可以将一个点 W W 定位于3个手腕关节的转轴交点,一旦末端执行器的位置和姿态由pe Re=[neseae] R e = [ n e s e a e ] (或者 Re=[x6y6z6] R e = [ x 6 y 6 z 6 ] )指定,就可以找到手腕的位置为: pw=ped6ae p w = p e − d 6 a e (或 pw=ped6z6 p w = p e − d 6 z 6 ),如图1所示,可按照如下伪代码来编程,即可求得拟人臂的8组解,然后根据实际情况来删减不符合的解。

        具体求解的伪代码如下:
这里写图片描述

         需要注意的是,在建立机械臂坐标系的时候,可以按照图2所示建立坐标系,但是会发现图2中拟人臂和腕关节的第3个坐标系是不一致的,在建立坐标系的时候可以在这两个坐标系之间增加一个常变换矩阵,这样可以使两坐标系共线,这一操作会影响求解代码过程中的第4个步骤。

参考文献:
布鲁诺・西西里安诺.《机器人学:建模,规划和控制》 西安交通大学出版社 2015

  • 8
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7自由度机械运动学解析非常复杂,需要用到复杂的数学方和算,但是可以通过一些库和工具来简化决过程。 以下是一个使用 ROS 中的 MoveIt! 库决 7 自由度机械运动学的示例代码: ```c++ #include <ros/ros.h> #include <moveit/move_group_interface/move_group_interface.h> #include <moveit/planning_scene_interface/planning_scene_interface.h> #include <moveit_msgs/DisplayTrajectory.h> #include <moveit_msgs/RobotTrajectory.h> #include <moveit_msgs/RobotState.h> #include <moveit_msgs/Constraints.h> #include <moveit_msgs/JointConstraint.h> #include <moveit_msgs/MoveGroupActionResult.h> #include <moveit_msgs/PlanningScene.h> #include <moveit/kinematics_plugin_loader/kinematics_plugin_loader.h> #include <moveit/robot_state/conversions.h> #include <moveit/robot_trajectory/robot_trajectory.h> int main(int argc, char** argv) { ros::init(argc, argv, "moveit_ik_demo"); ros::NodeHandle node_handle; ros::AsyncSpinner spinner(1); spinner.start(); static const std::string PLANNING_GROUP = "arm"; moveit::planning_interface::MoveGroupInterface move_group(PLANNING_GROUP); moveit::planning_interface::PlanningSceneInterface planning_scene_interface; const robot_state::JointModelGroup* joint_model_group = move_group.getCurrentState()->getJointModelGroup(PLANNING_GROUP); // 设置目标位置 geometry_msgs::Pose target_pose; target_pose.orientation.w = 1.0; target_pose.position.x = 0.4; target_pose.position.y = -0.2; target_pose.position.z = 0.4; move_group.setPoseTarget(target_pose); // 执行规划和移动 moveit::planning_interface::MoveGroupInterface::Plan my_plan; bool success = (move_group.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS); ROS_INFO("Visualizing plan 1 (pose goal) %s", success ? "" : "FAILED"); move_group.move(); ros::shutdown(); return 0; } ``` 该示例代码中,首先设置了机械的规划组和目标位置,然后调用 MoveIt! 库中的 `plan()` 方进行运动规划,最后调用 `move()` 方执行运动。这样,就可以实现机械的自动运动学解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值