本帖最后由 1五湖四海1 于 2021-12-24 14:02 編輯 0 \' [ G3 w& s4 `4 q- u& H
" \6 c& \, f& O/ ~8 ^模塊化設計 機械需要模塊化設計軟件同樣使用模塊設計思想,,設計出面向對象的模塊設計,抽象出需要使用的對象,,提供對外部使用的API方法,。 雙足機器人運動主控的軟件架構主要分舵機驅動模塊,通訊模塊,,關節(jié)模塊,,腿部模塊,寄存器模塊,,整體應用模塊組成,。
8 m q `. v3 f- n w9 D0 M( o5 B- u舵機驅動模塊 該模塊提供了舵機當前位置的初始化,舵機在線設備搜索,,獲取舵機是否運動,,獲取舵機溫度,設置舵機pid參數(shù),,舵機的運動控制等功能,。舵機設備對象創(chuàng)建后,這些方法注冊到舵機設備對象中供外部模塊使用,。 . \1 n( B j* E+ ]
通訊模塊 主機與主控采用標準modbus通訊協(xié)議 ,,通過共享內存區(qū)的數(shù)據(jù)進行通訊,,主控作為服務端存儲內存數(shù)據(jù),,主機作為客戶端可以對內存進行寫入與讀取,。下面是基于modbus實現(xiàn)的功能。 運動相關 上位機通過寫入0x68到0x9f區(qū)域內存,,主控解析出關節(jié)信息去執(zhí)行舵機運動,。 get_joint_move_cmd 這個函數(shù)是輪詢獲取主機是否有新數(shù)據(jù)到來。 get_joint_move_data 如果有新數(shù)據(jù)到來通過這個函數(shù)解析出關節(jié)角度數(shù)據(jù),。 get_joint_init 主控端啟動后通過這個函數(shù)讀取內存中每個關節(jié)對應舵機id數(shù) 據(jù) set_joint_init 主控端設置關節(jié)參數(shù)到寄存器內存里 set_joint_pos_last 設置舵機位置數(shù)據(jù)到寄存器里 get_joint_pos_last 獲取存儲在寄存器里的舵機位置數(shù)據(jù) set_move_id 主控執(zhí)行運動隊列的id寫入寄存器里
5 ^3 @% @' l0 B5 o/ B' z8 P; ]/ W陀螺儀相關 get_body_euler_angle 獲取存儲在寄存器里的陀螺儀姿態(tài)數(shù)據(jù) set_body_euler_angle 硬件陀螺儀數(shù)據(jù)寫入到寄存器內存里 get_body_euler_pid 獲取存儲在寄存器里的pid參數(shù) set_body_euler_pid 主控設置pid參數(shù)到寄存器里 6 N# Z3 J9 g6 Y* E! Y
控制相關 get_master_ctl_cmd 獲取內存中控制位數(shù)據(jù) set_master_ctl_cmd 設置控制數(shù)據(jù)到內存里
6 T" G( ?! Q0 U3 U關節(jié)模塊 主要提供了和舵機ID的綁定與獲取函數(shù),,關節(jié)角度與舵機位置之間的相互轉換功能,關節(jié)運動數(shù)據(jù)的生成與位置更新等功能,。
$ w3 k% C Y7 g' P0 \4 [+ U1 n6 U; F腿部模塊 腿部模塊的創(chuàng)建需要先創(chuàng)建好關節(jié)模塊然后在腿部模塊里初始化各個關節(jié),。 leg_set_attribute 設置小腿,大腿長度,,踝到重心長度等屬性,。 leg_get_h_step_len 獲取當前腿的高度和步長。 leg_get_barycnter_off 獲取當前腿的重心偏移距離 leg_stretch 此函數(shù)提供了對腿部上下前后和重心移動等運動 leg_d_foot_touch_refactor 根據(jù)陀螺儀反饋數(shù)據(jù)調整雙足支撐時身體姿態(tài)需要變化的關節(jié)角度 , {* M: Q$ M1 I# r- c: E5 e
整體應用模塊 1.創(chuàng)建各個模塊 其中包括,,與上位機的modbus總線創(chuàng)建,,紅外遙控設備創(chuàng)建,舵機模塊,,寄存器模塊,,管模塊,腿部設備模塊,,姿態(tài)模塊的創(chuàng)建
0 U# `9 N4 I8 K2模塊的注冊與初始化 需要用到的模塊創(chuàng)建后依次注冊到機器人robot_api_dev中,,然后按照順序依次完成初始化工作。 feet_robot_sms_dev_init 初始化舵機設備 robot_regs_data_read_joint_init_param robot_leg_create 在寄存器中讀取關節(jié)初始參數(shù)后創(chuàng)建腿部模塊 robot_leg_set_attribute 設置大腿小腿長度和踝到重心的距離 feet_robot_serch_dev 對舵機模塊進行在線舵機搜索 robot_regs_data_set_joint_postion_last 設置舵機位置數(shù)據(jù)到寄存器中
/ _+ C* K- |! |3業(yè)務邏輯 有兩個任務處理業(yè)務邏輯,,一個是主應用用于輪詢處理函數(shù),,一個是運動執(zhí)行任務,該任務負責接收運動隊列并執(zhí)行運動控制 上面是主任務需要處理的函數(shù) robot_regs_data_get_joint_move_cmd 在寄存器內存中獲取運動標志 robot_regs_data_joint_move_cmd_handle 如果運動標志置位進行解析運動數(shù)據(jù)并發(fā)送 到運動隊列 robot_servo_monitoring 每五秒進行一次舵機溫度檢查 robot_pid_controller_loop 輪詢上位機是否打開pid控制,,如果打開進行 pid參數(shù)設置 robot_wait_move_fin_loop 運動等待處理輪詢函數(shù) a& ^! F9 a( r6 B9 L/ I# ?! }* f
上面是運行執(zhí)行任務處理邏輯 joint_move_data_recv_mq 阻塞接收運動隊列數(shù)據(jù) robot_regs_data_set_move_id 運動id寫入到寄存器 robot_regs_data_joint_move_refactor 姿態(tài)控制打開時進行關節(jié)角度微調 robot_move_wait_timer_set_period 根據(jù)運動隊列參數(shù)設定下一次運動等待時間 robot_joint_update_pos 更新舵機位置 robot_regs_data_joint_move_exeute 開始執(zhí)行運動 $ Y7 N" c0 ^! u8 I
5.4 遙控調試功能 紅外遙控框架包括解碼層,,紅外中間件和紅外驅動層,中間件提供了紅外事件回調 % k& E" b3 F P/ w f# B
注冊好時間回調后,,有按鍵按下后進行回調到處理函數(shù),,上面圖中對按鍵進行了對應的運動控制 + 雙腿支撐身體上升30mm - 雙腿支撐身體下降30mm ← 身體向左重心移動 30mm → 身體向右重心移動30mm 0 雙腿向前移動30mm C 雙腿向后移動30mm 1 左腿伸展30mm 4 左腿彎曲30mm 2 右腿伸展30mm 5 有腿彎曲30mm 7 加速運動200mm/s 8 加速運動200mm/s ! U- j% C* O6 ^6 v
* k3 H8 S, B' j) P |