本帖最后由 1五湖四海1 于 2021-12-24 14:02 编辑 / E0 ^; _, T6 g
1 u8 F) k% ], u模块化设计 机械需要模块化设计软件同样使用模块设计思想,设计出面向对象的模块设计,抽象出需要使用的对象,提供对外部使用的API方法。 双足机器人运动主控的软件架构主要分舵机驱动模块,通讯模块,关节模块,腿部模块,寄存器模块,整体应用模块组成。
5 M: E( }9 @. ~2 y2 b舵机驱动模块 该模块提供了舵机当前位置的初始化,舵机在线设备搜索,获取舵机是否运动,获取舵机温度,设置舵机pid参数,舵机的运动控制等功能。舵机设备对象创建后,这些方法注册到舵机设备对象中供外部模块使用。 , S) L9 d' O1 }+ K) I: I. [
通讯模块 主机与主控采用标准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写入寄存器里 , q: \. }; d( Z9 O
陀螺仪相关 get_body_euler_angle 获取存储在寄存器里的陀螺仪姿态数据 set_body_euler_angle 硬件陀螺仪数据写入到寄存器内存里 get_body_euler_pid 获取存储在寄存器里的pid参数 set_body_euler_pid 主控设置pid参数到寄存器里 1 P$ K% V4 N; z6 T% ~. _
控制相关 get_master_ctl_cmd 获取内存中控制位数据 set_master_ctl_cmd 设置控制数据到内存里
, K4 y2 f' y+ @$ {1 ?' t7 o- R) `关节模块 主要提供了和舵机ID的绑定与获取函数,关节角度与舵机位置之间的相互转换功能,关节运动数据的生成与位置更新等功能。
( R4 D7 r/ {+ s# s% y" Z; z; b$ V0 ]腿部模块 腿部模块的创建需要先创建好关节模块然后在腿部模块里初始化各个关节。 leg_set_attribute 设置小腿,大腿长度,踝到重心长度等属性。 leg_get_h_step_len 获取当前腿的高度和步长。 leg_get_barycnter_off 获取当前腿的重心偏移距离 leg_stretch 此函数提供了对腿部上下前后和重心移动等运动 leg_d_foot_touch_refactor 根据陀螺仪反馈数据调整双足支撑时身体姿态需要变化的关节角度
3 a8 B! \8 L; v' {! @0 d: y) x" L整体应用模块 1.创建各个模块 其中包括,与上位机的modbus总线创建,红外遥控设备创建,舵机模块,寄存器模块,管模块,腿部设备模块,姿态模块的创建 1 r, X8 M; ^1 t
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 设置舵机位置数据到寄存器中 v* e$ a; w8 {0 i
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 运动等待处理轮询函数 $ g7 {" K5 }, k. I. T
上面是运行执行任务处理逻辑 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 开始执行运动 3 p7 [" W9 J' A) e
5.4 遥控调试功能 红外遥控框架包括解码层,红外中间件和红外驱动层,中间件提供了红外事件回调 8 }6 K }, A" |' ]& T! s( @$ ~
注册好时间回调后,有按键按下后进行回调到处理函数,上面图中对按键进行了对应的运动控制 + 双腿支撑身体上升30mm - 双腿支撑身体下降30mm ← 身体向左重心移动 30mm → 身体向右重心移动30mm 0 双腿向前移动30mm C 双腿向后移动30mm 1 左腿伸展30mm 4 左腿弯曲30mm 2 右腿伸展30mm 5 有腿弯曲30mm 7 加速运动200mm/s 8 加速运动200mm/s
9 ]9 B- o" F) v# G% r
4 H) s8 C1 w5 r+ b# f: W2 g; Q |