找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 7292|回复: 9

小型双足机器人设计方案

[复制链接]
发表于 2021-12-23 14:04:35 | 显示全部楼层 |阅读模式
本帖最后由 1五湖四海1 于 2021-12-23 15:10 编辑 0 p+ m' x- L3 S" I2 W4 L
% x: R) D* Z2 y# S% d
仿生机器人主要是模仿人的步伐进行行走,从最开始的静态步伐发展到了像人一样的动态步伐,开发者们经历了漫长的时间研发,最终实现了接近人类的漂亮步伐,下面我来介绍下我们研发发双机器人软件架构和硬件构成。

3 w; D% p# s7 i2 G7 v0 c; X4 b# L4 x$ l1 u" Q/ l7 ^8 T
硬件控制板大体分为主控板和主机板
: y+ K6 W4 C: C4 p- k. Z
, a2 r" Y/ e8 Y# s
主控负责运动控制和采集传感器数据,采用stm32h743 跑rtthread RTOS系统。下面是主控上电启动的效果。

. S! x! m) ]5 V! h# T' a* G9 N  T( q- ?& ]
主机板主要负责运动具体控制,采用树莓派4b运行官方Raspbian系统,基于树莓派平台运行控制软件采用QT编写,并配有5寸hdmi显示屏和两个小音箱提供了多媒体功能。

) J9 X' R; A% v$ U* A
; K/ S" Q- E4 z
腿部结构部分是采用12个舵机作为关节提供动力,舵机是RS485总线方式与主控板进行通信。
7 J3 v4 q7 h% k9 k- i
主机与主控通信采用Mobus协议通信,主机作为客户端,主控作为服务端,在主控上的文件系统映射一个modbus寄存器区域。

4 J# ]7 ^1 F* C" r6 l$ }" {
$ x5 N* d; k) B% c; B& h# S) y
传感器分布
主控上有九轴陀螺传感器用于获取身体姿态
树莓派接8个tof激光测距传感器通过i2c总线连接,安装在双足的四个角上面用了测量双足触地情况。

2 f* V7 q' K+ j8 T
整体框架是PC机电脑和树莓派开发板上运行QT运动控制软件控制主控板完成各个关节运动控制,主控板映射一个寄存器内存需要,建立两个modbus服务器,一个用来连接PC机一个用来连接树莓派开发板。
具体模块介绍待续....

# w& J9 x1 ^: R2 J) g8 N& f2 |6 ?" t  T8 |; T

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
回复

使用道具 举报

 楼主| 发表于 2021-12-23 18:00:23 | 显示全部楼层
最早的控制策略是开环控制,根据控制模式计算出理论的步伐数据去执行,但实际中会受到地面不平等因素影响机器人走稳,所以需要采用闭环控制很有必要。下面的思路是通过陀螺仪传感器获取机器人姿态,然后通过pid控制器输出需要调整的角度,在把目标角度重新调整下,最后控制伺服电机带动关节转动。
! F* A. g/ \/ l$ ~6 ]
上位机需要根据用户输入的运动动作和速度参数转换为时间相等的小段运动动作,这个相等的时间就是pid控制周期。转换后的小段数据依次发送到主控端,运动数据需要做流控等待主控运动队列空闲空余时进行发送数据。

0 p' b* T7 W' z; f) i3 m' D3 ]
主控端接收运动队列的每一段运动数据,进行获取陀螺仪数据后进行pid控制器输出需要调整的角度,俯仰角是根据pid控制器的输出调整臀俯仰关节。横滚角是根据pid控制器的输出调整双足的高度重而调整身体横滚姿态。

  D: u# K: m/ T2 l
0 v) Z1 l1 Z4 g1 ]( x1 c  n* H& D. U

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
 楼主| 发表于 2021-12-24 13:15:54 | 显示全部楼层
本帖最后由 1五湖四海1 于 2021-12-24 13:18 编辑 ( R2 r8 {0 _- e% a3 f3 y: n: U

; ?5 T" f9 d& B+ F4 l" T, M" Y+ t' n/ |# h
上图是站立姿态腿部膝盖俯仰角,髋俯仰角,踝俯仰角的示意图。
最终需要计算出a,b,c三个角度。已知d,h,L1,L3参数。
L1,L3是腿长固定的数据,d踝到重心的垂直距离。根据用户输入高度参数h输出三个关节角度。
步骤1.已知d和h通过勾补定理计算出L2
步骤2.已知L1,L3和L2,通过公式计算出三角。
a = arcos (L12+L32-L22 / 2 * L1 * L3)
b = arcos (L12+L22-L32 / 2 * L1 * L2)
c = arcos (L22+L32-L12 / 2 * L2 * L3)

+ \8 s( |6 w& W
根据上面的思路加入腿部的前后的移动,计算方法也类似首先计算出L2再根据三边计算出三角,不同的是需要根据三个关节的角度计算出d是正负,上图是d为负数的情况。
" r4 j6 \& B8 M" S
如果已知的三角计算同样可以计算出步长d和高度h。
- b( R% F7 ^5 `. T! S7 z/ e! w

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
 楼主| 发表于 2021-12-24 13:56:05 | 显示全部楼层
本帖最后由 1五湖四海1 于 2021-12-24 14:02 编辑
1 L- }9 e* N- `) n
1五湖四海1 发表于 2021-12-24 13:15! `" Y( J' v4 v- b8 y6 C
上图是站立姿态腿部膝盖俯仰角,髋俯仰角,踝俯仰角的示意图。最终需要计算出a,b,c三个角度。已知d,h ...
2 A$ b2 x; n  L4 A$ O: _
模块化设计
机械需要模块化设计软件同样使用模块设计思想,设计出面向对象的模块设计,抽象出需要使用的对象,提供对外部使用的API方法。
双足机器人运动主控的软件架构主要分舵机驱动模块,通讯模块,关节模块,腿部模块,寄存器模块,整体应用模块组成。

3 @) P: H' B2 c* b
舵机驱动模块
该模块提供了舵机当前位置的初始化,舵机在线设备搜索,获取舵机是否运动,获取舵机温度,设置舵机pid参数,舵机的运动控制等功能。舵机设备对象创建后,这些方法注册到舵机设备对象中供外部模块使用。
) J$ f$ ^' I6 M
通讯模块
主机与主控采用标准modbus通讯协议 ,通过共享内存区的数据进行通讯,主控作为服务端存储内存数据,主机作为客户端可以对内存进行写入与读取。下面是基于modbus实现的功能。
运动相关
上位机通过写入0x68到0x9f区域内存,主控解析出关节信息去执行舵机运动。
get_joint_move_cmd                      这个函数是轮询获取主机是否有新数据到来。
get_joint_move_data                      如果有新数据到来通过这个函数解析出关节角度数据。
get_joint_init                                 主控端启动后通过这个函数读取内存中每个关节对应舵机id数                                                据
set_joint_init                                 主控端设置关节参数到寄存器内存里
set_joint_pos_last                          设置舵机位置数据到寄存器里
get_joint_pos_last                          获取存储在寄存器里的舵机位置数据
set_move_id                                 主控执行运动队列的id写入寄存器里
9 ^2 V0 S  e* `+ M. |/ G0 I
陀螺仪相关
get_body_euler_angle                   获取存储在寄存器里的陀螺仪姿态数据
set_body_euler_angle                   硬件陀螺仪数据写入到寄存器内存里
get_body_euler_pid                      获取存储在寄存器里的pid参数
set_body_euler_pid                      主控设置pid参数到寄存器里
: ?# q& N' \7 G8 B; i4 e( L& U
控制相关
get_master_ctl_cmd                     获取内存中控制位数据
set_master_ctl_cmd                     设置控制数据到内存里

0 u6 ~6 V6 ]* Z0 h$ G
关节模块
主要提供了和舵机ID的绑定与获取函数,关节角度与舵机位置之间的相互转换功能,关节运动数据的生成与位置更新等功能。
6 N6 H" c/ @. o; j3 ^' l' q0 o8 E
腿部模块
腿部模块的创建需要先创建好关节模块然后在腿部模块里初始化各个关节。
leg_set_attribute                            设置小腿,大腿长度,踝到重心长度等属性。
leg_get_h_step_len                         获取当前腿的高度和步长。
leg_get_barycnter_off                     获取当前腿的重心偏移距离
leg_stretch                                    此函数提供了对腿部上下前后和重心移动等运动
leg_d_foot_touch_refactor               根据陀螺仪反馈数据调整双足支撑时身体姿态需要变化的关节角度

6 O( A1 a5 V2 l2 r6 U- i8 @" O5 b
整体应用模块
1.创建各个模块
其中包括,与上位机的modbus总线创建,红外遥控设备创建,舵机模块,寄存器模块,管模块,腿部设备模块,姿态模块的创建

9 l4 v% w0 J; b/ J; G' H
2模块的注册与初始化
需要用到的模块创建后依次注册到机器人robot_api_dev中,然后按照顺序依次完成初始化工作。
feet_robot_sms_dev_init                                      初始化舵机设备
robot_regs_data_read_joint_init_param        
robot_leg_create                                                 在寄存器中读取关节初始参数后创建腿部模块
robot_leg_set_attribute                                        设置大腿小腿长度和踝到重心的距离
feet_robot_serch_dev                                          对舵机模块进行在线舵机搜索
robot_regs_data_set_joint_postion_last                 设置舵机位置数据到寄存器中

, b1 K: h% Y. b! b4 @7 _
3业务逻辑
有两个任务处理业务逻辑,一个是主应用用于轮询处理函数,一个是运动执行任务,该任务负责接收运动队列并执行运动控制
上面是主任务需要处理的函数
robot_regs_data_get_joint_move_cmd                        在寄存器内存中获取运动标志
robot_regs_data_joint_move_cmd_handle                   如果运动标志置位进行解析运动数据并发送                                                                                                                                                         到运动队列
robot_servo_monitoring                                             每五秒进行一次舵机温度检查
robot_pid_controller_loop                                           轮询上位机是否打开pid控制,如果打开进行                                                                                                                                                         pid参数设置
robot_wait_move_fin_loop                                         运动等待处理轮询函数
4 q! e; X# e: Q! h1 f7 s
上面是运行执行任务处理逻辑
joint_move_data_recv_mq                                         阻塞接收运动队列数据
robot_regs_data_set_move_id                                    运动id写入到寄存器
robot_regs_data_joint_move_refactor                         姿态控制打开时进行关节角度微调
robot_move_wait_timer_set_period                             根据运动队列参数设定下一次运动等待时间
robot_joint_update_pos                                             更新舵机位置
robot_regs_data_joint_move_exeute                           开始执行运动

0 s9 s$ ~8 P( k5 }$ q9 `' w# ^
5.4 遥控调试功能
红外遥控框架包括解码层,红外中间件和红外驱动层,中间件提供了红外事件回调
: n- B. @4 a) {% Q0 u) u
注册好时间回调后,有按键按下后进行回调到处理函数,上面图中对按键进行了对应的运动控制
+                  双腿支撑身体上升30mm
-                   双腿支撑身体下降30mm
←                 身体向左重心移动 30mm
→                 身体向右重心移动30mm
0                   双腿向前移动30mm
C                   双腿向后移动30mm
1                  左腿伸展30mm
4                  左腿弯曲30mm
2                  右腿伸展30mm
5                  有腿弯曲30mm
7                  加速运动200mm/s
8                  加速运动200mm/s

& v& f; P7 e1 m  {) j+ c: I$ A0 [

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
发表于 2021-12-24 15:05:53 | 显示全部楼层
大牛
回复

使用道具 举报

 楼主| 发表于 2021-12-24 15:59:16 | 显示全部楼层
本帖最后由 1五湖四海1 于 2021-12-24 21:51 编辑 ' x. a+ K: t5 I. b: a' p$ t

) N) c7 m9 L+ w) s足底着地检测传感器
3 \( W) C, d3 r% V& D) I6 H3 W+ H0 G/ E
一共采用了8个tof 时间飞行测距传感器型号是st的vl530。
下面是编写的上位机测量模块和实际安装位置。
0 U5 }* `6 u1 c  X" k

' r- }+ I1 [0 M. Z. J
! X! [7 w5 m! X0 F
% V  N) n5 S5 o# x* w
这八个tof模块初始化比较耗时放在了树莓派端进行采集,tof vl530类中初始化tof的步骤是,首先使能第一个tof传感器电源重新配置tof模块地址完成初始化,然后基于这个地址加一作为下一个tof模块地址,然后使能第二个tof模块电源进行初始化,后面的模块安装上面的方法一次初始化tof模块。tof模块I2C物理通讯接口采用树莓派的BCM2835库进行读写控制。
" _, m2 e3 P1 F9 A# q

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
发表于 2021-12-25 11:05:01 | 显示全部楼层
可以
% ^2 Y* m6 e; ^: j
回复

使用道具 举报

 楼主| 发表于 2021-12-27 14:41:45 | 显示全部楼层
1五湖四海1 发表于 2021-12-24 15:59
, Y+ E0 K# s5 s  T: b足底着地检测传感器
. g+ Q. r3 H. q6 G. o) G9 q! H3 r& a5 l. a, G+ B4 j# a0 W! o
一共采用了8个tof 时间飞行测距传感器型号是st的vl530。下面是编写的上位机测量模块 ...
0 P; c5 T6 C$ o3 B. b3 h

6 r; S5 h1 }6 b6 G树莓派开发板获取8个 tof vl530传感器代码
) o- o& y4 V8 z" I3 e$ C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
发表于 2023-8-29 10:05:06 | 显示全部楼层
楼主大牛 能否加个好友qq2074772922
发表于 2023-10-19 14:33:36 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-8-3 12:22 , Processed in 0.066087 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表