本帖最后由 1五湖四海1 于 2021-12-24 14:02 編輯 % T _: e; b( b% n, @0 g" k
) {/ B; g8 c# E$ E7 _模塊化設(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)用模塊組成。 , F3 g1 D) w7 E6 h% h, e
舵機(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ì)象中供外部模塊使用。
, B# s/ Q& j1 A通訊模塊 主機(jī)與主控采用標(biāo)準(zhǔn)modbus通訊協(xié)議 ,通過共享內(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ī)通過寫入0x68到0x9f區(qū)域內(nèi)存,主控解析出關(guān)節(jié)信息去執(zhí)行舵機(jī)運(yùn)動(dòng)。 get_joint_move_cmd 這個(gè)函數(shù)是輪詢獲取主機(jī)是否有新數(shù)據(jù)到來。 get_joint_move_data 如果有新數(shù)據(jù)到來通過這個(gè)函數(shù)解析出關(guān)節(jié)角度數(shù)據(jù)。 get_joint_init 主控端啟動(dòng)后通過這個(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寫入寄存器里
4 a) k& q! o3 P# }4 m) ^陀螺儀相關(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ù)到寄存器里 : [3 s4 G& W, R3 b/ e6 J9 Q
控制相關(guān) get_master_ctl_cmd 獲取內(nèi)存中控制位數(shù)據(jù) set_master_ctl_cmd 設(shè)置控制數(shù)據(jù)到內(nèi)存里
, b* Q" h' \* r/ `# A: T5 X- S關(guān)節(jié)模塊 主要提供了和舵機(jī)ID的綁定與獲取函數(shù),關(guān)節(jié)角度與舵機(jī)位置之間的相互轉(zhuǎn)換功能,關(guān)節(jié)運(yùn)動(dòng)數(shù)據(jù)的生成與位置更新等功能。
P7 k$ O! a1 _% W- R腿部模塊 腿部模塊的創(chuàng)建需要先創(chuàng)建好關(guān)節(jié)模塊然后在腿部模塊里初始化各個(gè)關(guān)節(jié)。 leg_set_attribute 設(shè)置小腿,大腿長度,踝到重心長度等屬性。 leg_get_h_step_len 獲取當(dā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é)角度 ! {0 ?+ j0 f( V/ P+ B/ n
整體應(yīng)用模塊 1.創(chuàng)建各個(gè)模塊 其中包括,與上位機(jī)的modbus總線創(chuàng)建,紅外遙控設(shè)備創(chuàng)建,舵機(jī)模塊,寄存器模塊,管模塊,腿部設(shè)備模塊,姿態(tài)模塊的創(chuàng)建 $ C4 V7 }. c6 J' g
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è)置大腿小腿長度和踝到重心的距離 feet_robot_serch_dev 對(duì)舵機(jī)模塊進(jìn)行在線舵機(jī)搜索 robot_regs_data_set_joint_postion_last 設(shè)置舵機(jī)位置數(shù)據(jù)到寄存器中 - H) n% z# P% |# D8 D
3業(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ù) " Q4 _+ I( ?; D7 m9 _3 W
上面是運(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)
& c( e; G8 ~" H( }/ _5.4 遙控調(diào)試功能 紅外遙控框架包括解碼層,紅外中間件和紅外驅(qū)動(dòng)層,中間件提供了紅外事件回調(diào)
- h# i: }* ~' U- C注冊(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 0 n0 u' @0 L6 c' t6 Y
' p. b8 W6 W. e0 S4 j) }" k |