5 電機
5.1 為了增加扭力,每種電機上都有減速箱,通過電機連接的微型齒輪降低轉速。
5.2 轉矩
轉矩是一種力矩,力矩=力*力臂 (N * m)
堵轉轉矩和標稱轉矩反應了電機在啟動和政策工作狀態下驅動力的大小。
堵轉轉矩是指當電機轉速為0時的轉矩,如膝關節電機在啟動或維持半蹲狀態都處於堵轉狀態。
額定轉矩是電機可以長期穩定運行的轉矩。
5.3 位置檢測
所有的關節都是伺服控制的結構,傳輸給電機的力或力矩指令都是根據檢測到的關節位置與
期望位置之間的差值而給定的。每個關節都有位置傳感器,直接安裝在電機的軸上,根據電機
軸的位置可以計算得到真實的關節轉角。
5.4 電流控制
每個點擊電路板上都有一個電流傳感器,如果電流達到電流傳感器最大值,通過控制電路的
反饋機制,能夠減小電流直到返回到最大值以下。
NAO使用剛度控制電機電流,值為0~1.0
6 ALRobotPosture模塊
6.1 主要方法
goToPosture(postureName, speed):
轉到預定義姿勢。阻塞調用。
getPosture():
返回當前姿勢名稱,如果當前姿勢不是預定義姿勢,返回unknow。阻塞調用。
getPostureList():
返回預定義姿勢列表。阻塞調用。
applayPosture(postureName, speed):
將機器人關節設置為預定義姿勢對應的狀態(沒有中間動作)。阻塞調用。
stopMove():
停止當前動作。
7 ALMotion模塊
包括與機器人動作相關的API,分為剛度控制、關節控制、運動控制等方面。
ALMotion運行頻率是50HZ. 在ALMotion中,當調用API去執行一個動作時,要創建一個'運動任務'
處理這個任務,每隔20ms,這個’運動任務‘將計算基本命令(電機角度和剛度變化)執行這個動作,
設置角度或剛度變化時,time.sleep(1.0)。
7.1 剛度控制方法
Nao使用剛度控制電機最大電流。電機的轉矩(驅動力)與電流相關,設置關節的剛度相當於設置電
機的轉矩限制。
剛度為0.0,關節位置不受電機控制,關節是自由的。
剛度為1.0,關節使用最大轉矩功率轉到指定位置。
剛度為0.0~1.0,關節電機的轉矩介於0與最大值直接(如果關節移動到目標位置所需要的轉矩高於剛、
度的限制,關節不會到達目標位置)。
wakeUp():
喚醒機器人(啟動電機
robotIsWakeUp():
機器人為喚醒狀態返回Ture。
setStiffnesses(names, stiffnesses):
設置一個或多個關節剛度,names為關節名或關節組名。非阻塞調用。注:剛度設置結果略有誤差, 誤差范圍約為0~2%)
rest():
轉到休息姿勢。
getStiffnesses(jointName):
獲取關節或關節組剛度,返回為一個或多個剛度值,jointname為關節名
或關節組名。
stiffnessInterpolation(names,stiffnessLists,timeLists): 將一個或多個關節按時間序列設置剛度旭烈治,
names為關節名或關節組名,stiffnessLists為剛度列表,timeLists為時間列表。阻塞調用。
7.2 關節控制方法
關節運動與身體平衡:
當關節運動時,機器人的重心會發生變化,嚴重時機器人會摔倒。為保持身體平衡,不僅需要同時改變
多個關節的角度,通常還需要同時調節關節運動速度。
(1)插值方法,阻塞調用,類似於動畫,在起始位置和終止位置間定時插入若干中間值。
(2)反應式方法,非阻塞式調用,通常在反應控制中多次調用。NAO可能得到一組相互矛盾的命令序列,
調用反應式方法可以保證運動平滑且速度連續。
angleInterpolation(names, angleLists, timelists, isAbsolution):
插值運動。name是關節名稱,angleLists是角度、或二維角度列表,單位為弧度,timeLists是為達到目標
角度的時間、時間列表或二維時間列表,isAbsolute為Ture,代表絕對角度,為False,代表相對角度。阻塞調用。
angleInterpolationWithSpeed(names, targetAngles, maxSpeedFraction):
插值運動(帶速度限制)。maxSpeedFraction為最大速度比。阻塞調用。
angleInterpolationBezier(joinNames, times, controlPoints):
貝塞爾角度插值。joinNames為關節名稱列表,times為時間列表,controlPoints為控制點列表。阻塞調用。
setAngles(names,angles, fractionMaxSpeed):
設置關節角度。names是關節名稱;angles為一個或多個角度;maxSpeedFraction為最大速度百分比。非阻塞調用。
changeAngles(names,angles, fractionMaxSpeed):
改變關節角度。names是關節名稱;angles為一個或多個角度;maxSpeedFraction為最大速度百分比。非阻塞調用。
getAngles(names, useSensors):
獲取關節角度。names為關節名;useSensors為True返回關節傳感器角度,為False返回執行器角度。
closeHand(handName):
合上手掌。handName取值:LHand,RHand。阻塞調用。
openHand(handName):
打開手掌。handName取值:LHand,RHand。阻塞調用。
7.3 運動控制方法
在每一個ALMotion周期中采集來自傳感器的實際關節位置信號,與位移和身體的傾斜角度等期望值進行比較后,利用
控制算法計算出控制量,驅動電機實現隊關節的實時控制。
每步包括雙腳支撐和單腳支撐兩個階段,其中,雙腳支持時間占1/3.行走初始階段和結束階段雙腿支撐時間為0.6。腳
運動軌跡是一條平滑曲線,利用初始速度和關鍵點,使用SE3插值方法計算出,腳部符合速度限制又能夠保持平穩。
運動位置使用Pose2D類定義。在描述左腳時,以右腳為參照點。
7.3.1 步態參數
名稱 含義 缺省 最小 最大 可修改
MaxStepX 沿X方向的最大向前平移(m) 0.040 0.001 0.080 是
MinStepX 沿X方向的最大向后平移(m) -0.040 否
MaxStepY 沿Y方向的最大平移絕對值(m) 0.140 0.101 0.160 是
MaxStepTheta 沿Z軸旋轉角度最大絕對值(°) 0.349 0.001 0.524 是
MaxStepFrequency 最大步頻 1.0 0.0 1.0 是
MinStepPeriod 最小步周期 0.42 否
MaxstepPeriod 最大步周期 0.6 否
StepHeight Z軸方向抬腳最大高度(m) 0.020 0.005 0.040 是
TorsoWx 軀干與X軸間最大角度(°) 0.000 -0.122 0.122 是
TorsoWy 軀干與Y軸間最大角度(°) 0.000 -0.122 0.122 是
FootSeparation Y方向兩腳之間距離(m) 0.1 否
MinFootSeparation Y方向兩腳之間最小距離(m) 0.088 否
7.3.2 Nao行走控制主要的三種方式
moveTo:
使機器人移動到指定位置,阻塞調用。
(1).moveTo(x, y, theta), 移動到指定位置。
(2)moveTo(x, y, theta, MoveConfig), 按給定的步態參數移動到指定位置。moveConfig為自定義步態參數列表,列表
中的內容為步態參數鍵值對。
(3)moveTo(controlPoints),沿控制點移動到指定位置,controlPoints為控制點列表。
(4)moveTo(controlPoints, moveConfig), movetoConfig為自定義步態參數列表。
move:
move方法是機器人按指定速度行走,非阻塞調用。
(1)move(x, y, theta), 按指定速度行走,x為繞X方向速度(m/s), theta為繞Z軸旋轉角速度(rad/s), 負數表示順時針
轉動。非阻塞調用方法,需要time.sleep()延時,延時時間除了行走過程時間外,應還包括機器人走過程的初始化階段和終止階段。
(2)move(x, y, theata, moveConfig), 按給定的步態參數和指定速度行走。其中x為X方向,moveConfig為自定義步態參數列表
可以分別設置左腳和右腳的步態參數。
moveToward:
moveToward()方法是機器人按指定速度行走,非阻塞調用方法。
(1)moveToward(x, y, theta), 按指定速度行走,其中x為X方向速度,取值范圍[-1, 1], theta為繞Z軸旋轉速度。
(2)moveToward(x, y, moveConfig), 按給定的步態參數、指定速度行走。
7.3.3 運動控制的幾個關鍵問題
(1)初始化問題,在NAO啟動行走進程前,NAO首先要執行初始化過程,goToPosture("StandInit", 0.5)。
(2)同步問題,moveTo()方法為阻塞調用,執行完成后,與原線程同步可以使用如下兩種方法:
1)waitUntilMoveIsFinished:
self.motion.post.moveTo(1.0, 0.0, 0.0)
self.motion.waitUntilMoveIsFinished()
2)moveIsActive
self.motion.post.moveTo(1.0, 0.0, 0.0)
while self.motion.moveIsActivate():
time.sleep(1)
(3)步態控制問題
通過步態規划可以獨立地控制NAO行走的每一步,實現步態規划有如下兩種方式,
1)setFootSteps, 非阻塞調用,setFootSteps()方法設置每一步發生的時間。
2)setFootStepsWithSpeed,阻塞調用,setFootStepsWithSpeed()方法使用標准化的步態速度。
運動控制方法


