本帖最后由 1五湖四海1 于 2021-12-24 14:02 編輯
1 m6 x. P u$ l Q7 u
1 o* E+ d4 U9 j5 t3 c$ u模塊化設(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)用模塊組成,。 6 b* l s; k; g1 W9 i
舵機(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ì)象中供外部模塊使用,。
2 Y! a- A8 b0 b3 p- g; Y4 R) Y* r通訊模塊 主機(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寫入寄存器里 9 H' A! Y E, c, {1 T
陀螺儀相關(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ù)到寄存器里 ! {, d5 ~, _- ]8 D
控制相關(guān) get_master_ctl_cmd 獲取內(nèi)存中控制位數(shù)據(jù) set_master_ctl_cmd 設(shè)置控制數(shù)據(jù)到內(nèi)存里 + e5 O- q! t9 O0 L( D4 o
關(guān)節(jié)模塊 主要提供了和舵機(jī)ID的綁定與獲取函數(shù),,關(guān)節(jié)角度與舵機(jī)位置之間的相互轉(zhuǎn)換功能,,關(guān)節(jié)運(yùn)動(dòng)數(shù)據(jù)的生成與位置更新等功能,。 : }3 J9 ~* J% i* a4 l
腿部模塊 腿部模塊的創(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é)角度 ; ?0 w! ?! I H" d& q# I! ~
整體應(yīng)用模塊 1.創(chuàng)建各個(gè)模塊 其中包括,,與上位機(jī)的modbus總線創(chuàng)建,,紅外遙控設(shè)備創(chuàng)建,,舵機(jī)模塊,寄存器模塊,,管模塊,,腿部設(shè)備模塊,姿態(tài)模塊的創(chuàng)建 ; \8 \/ \) S9 M* C* N4 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è)置大腿小腿長(zhǎng)度和踝到重心的距離 feet_robot_serch_dev 對(duì)舵機(jī)模塊進(jìn)行在線舵機(jī)搜索 robot_regs_data_set_joint_postion_last 設(shè)置舵機(jī)位置數(shù)據(jù)到寄存器中
( [# ~$ \5 C/ R! [. k7 W) A: O) S: L3業(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ù)
4 }4 c& M/ k7 q4 b% \: x9 z上面是運(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) , B/ B5 t8 I, o' q( T
5.4 遙控調(diào)試功能 紅外遙控框架包括解碼層,,紅外中間件和紅外驅(qū)動(dòng)層,,中間件提供了紅外事件回調(diào)
$ H5 H9 s* E) s2 U; }5 E4 b注冊(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 6 \* A0 U6 s5 g" U5 S6 N
% b. x% p, E/ G5 P$ x/ Y; j4 ~
|