当前位置: 首页 > article >正文

【2024最新开源】六足机器人控制算法

一、旋转矩阵变换 

坐标变换

二、算法代码(MATLAB) 


D-H参数
                            单位:mm
    关节转角    关节距离    连杆长度        转角
    Theta(n)     d(n)       a(n-1)     Alpha(n-1)    
    theta1        0           0             0
    theta2        0           54           pi/2
    theta3        0           61            0
      0           0           155           0

// 正运动解算
x = cos(theta1) * (L1 + L3 * cos(theta2 + theta3) + L2 * cos(theta2));
y = sin(theta1) * (L1 + L3 * cos(theta2 + theta3) + L2 * cos(theta2));
z = L3 * sin(theta2 + theta3) + L2 * sin(theta2);

// 逆运动解算
L1 = 0.054; %单位m
L2 = 0.061;
L3 = 0.155;
R = sqrt(x * x + y * y);
aerfaR = atan2(-z, R - L1); %使用atan2以获得正确的象限
Lr = sqrt(z * z + (R - L1) * (R - L1));
aerfa1 = acos((L2 * L2 + Lr * Lr - L3 * L3) / (2 * Lr * L2));
theta1_new = atan2(y, x); %atan2自动处理y=0的情况
theta2_new = aerfa1 - aerfaR;
aerfa2 = acos((Lr * Lr + L3 * L3 - L2 * L2) / (2 * Lr * L3));
theta3_new = -(aerfa1 + aerfa2);

 三、正逆运动学(C语言)

// 正运动学解算(输入关节角度计算足端坐标)
void Forward_kinematics(double theta1, double theta2, double theta3, uint8_t leg)
{	
	Myaxis_Init(&Pi3_axis[leg]);
	Pi3_axis[leg].x = cos(theta1) * (L1 + L3 * cos(theta2 + theta3) + L2 * cos(theta2));
	Pi3_axis[leg].y = sin(theta1) * (L1 + L3 * cos(theta2 + theta3) + L2 * cos(theta2));
	Pi3_axis[leg].x = L3 * sin(theta2 + theta3) + L2 * sin(theta2);
}
// 逆运动学解算(根据足端坐标计算出三个角度rad)
void Inverse_Kinematics(double x, double y, double z, uint8_t leg)
{
	Hexapod_thetas_Init(&Hexapod_leg[leg]);
	double R = sqrt(x * x + y * y);
	double aerfaR = atan2(-z, R - L1); // 使用atan2以获得正确的象限
	double Lr = sqrt(z * z + (R - L1) * (R - L1));
	double aerfa1 = acos((L2 * L2 + Lr * Lr - L3 * L3) / (2 * Lr * L2));
	Hexapod_leg[leg].Theta[0] = atan2(y, x); // atan2自动处理y=0的情况
	Hexapod_leg[leg].Theta[1] = aerfa1 - aerfaR;
	double aerfa2 = acos((Lr * Lr + L3 * L3 - L2 * L2) / (2 * Lr * L3));
	Hexapod_leg[leg].Theta[2] = -(aerfa1 + aerfa2);
}


http://www.kler.cn/a/375917.html

相关文章:

  • HTML静态网页成品作业(HTML+CSS)——自行车介绍网页设计制作(1个页面)
  • RabbitMQ最全教程-Part1(基础使用)
  • Ansible 部署应用
  • Pinpoint(APM)进阶--插件开发
  • 后台管理系统的通用权限解决方案(七)SpringBoot整合SpringEvent实现操作日志记录(基于注解和切面实现)
  • C++ 复习记录(个人记录)
  • buck电源中电感大小的计算
  • Ubuntu:通过ssh链接另外一台Ubuntu
  • npm入门教程13:npm workspace功能
  • 【基础语法】Java Scanner hasNext() 和 hasNextLine() 的区别
  • HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解
  • LeetCode100之二叉树的中序遍历(94)--Java
  • go语言中协程详解
  • Java8的新特性——Stream与completableFuture详解
  • 数字隔离器与光隔离器有何不同?---腾恩科技
  • 「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
  • spreadjs实现类似于企业微信的协同提示
  • Linux 查看 nginx 安装目录和配置文件路径
  • LeetCode994. 腐烂的橘子(2024秋季每日一题 54)
  • 智能护栏碰撞监测终端:内蒙古高速的安全守护者
  • vite和webpack
  • 在工作中常用到的 Linux 命令总结
  • 算法实现 - 快速排序(Quick Sort) - 理解版
  • 2. 从服务器的主接口入手
  • Android 蚂蚁面经
  • 第三十三章:docker 启动mysql web管理工具- MyWebSQL