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