8. Pikem sõit

Nüüd oskame robotit sõitma panna, kuid ainult lühikeseks ajaks. Mis siis, kui tahame, et ta sõidaks pikemat aega?

Selleks, et roboti kasutamine oleks turvaline (näiteks olukorras kus ühendus roboti ja cmd_vel kuulutaja vahel kaob), on roboti draiverisse sisse programmeeritud kaitsemehhanism, mis automaatselt peatab roboti mootorid, kui poole sekundi jooksul ei ole uut sõnumit kiiruse infoga saabunud. Kui soovime, et robot liiguks edasi kauem kui pool sekundit, peame talle pidevalt liikumiskäske saatma. Vaatame, kuidas oma koodi veidi muuta nõnda, et see liikumiskäske regulaarselt kuulutaks.

#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist

def main():
    rospy.init_node("velocity_publisher")
    velocity_pub = rospy.Publisher("cmd_vel", Twist, queue_size=0)
    rospy.sleep(2)

    loop_rate = rospy.Rate(10)
    starting_time = rospy.get_time()

    while (not rospy.is_shutdown()) and (rospy.get_time() - starting_time < 5):
        robot_vel = Twist()
        robot_vel.linear.x = 0.1
        robot_vel.linear.y = 0.0
        robot_vel.linear.z = 0.0
        robot_vel.angular.x = 0.0
        robot_vel.angular.y = 0.0
        robot_vel.angular.z = 0.0

        velocity_pub.publish(robot_vel)

        loop_rate.sleep()

if __name__ == '__main__':
    try:
        main()
    except rospy.ROSInterruptException:
        pass

 

Analüüsime selle koodi tööd.

starting_time = rospy.get_time()

See rida paneb muutuja starting_time väärtuseks praeguse kellaaja, mõõdetuna sekundites kindlast ajahetkest minevikus. Teiste sõnadega: see ütleb meile, kui mitu sekundit on möödunud teatud kindlast ajahetkest. Mis hetk see täpselt on, see ei olegi meie jaoks oluline.

while (not rospy.is_shutdown()) and (rospy.get_time() - starting_time < 5):

See rida tekitab tsükli, mis jookseb seni, kuni kehtivad kaks tingimust: ROSi tööd pole peatatud (not rospy.is_shutdown()) ja vahe praeguse aja (rospy.get_time()) ning koodi algusaja (starting_time) vahel on väiksem kui 5 sekundit. Tegelikkuses tähendab see, et kood jookseb kuni 5 sekundit.

loop_rate = rospy.Rate(10)

ning

loop_rate.sleep()

Need read aitavad meil tsüklit käimas hoida konstantse kiirusega. Robootikas on sageli kasulik, kui meie kood läbib tsüklit kindla pikkusega. rospy.Rate(10) tekitab meile võimaluse panna koodi jooksma kiirusega 10 Hz (st 10 korda sekundis). Selle funktsiooni tagastatud väärtuse paneme muutujasse loop_rate. Ning seejärel saame tsükli lõpus välja kutsuda funktsiooni loop_rate.sleep(), mis lihtsalt aeglustab tsükli läbimist ja ootab, kuni tsükli läbimiseks kulunud aeg on täpselt kümnendik sekundit.

Miks programmi tööd aeglustada?

Programmi töö aeglustamine võib olla kasulik mitmes olukorras. Tavaliselt täidab arvuti programmi nii kiiresti, kui võimalik – kasutades selleks ära kõik oma ressursid. Sõltuvalt sellest, mida programm tegema peab, võib miljonite operatsioonide sooritamine ühes sekundis olla täiesti ebapraktiline ning energiat raiskav. Selleks ongi programmeerimiskeeltes spetsiaalsed käsud, millega programmi aeglustada. Need käsud võimaldavad anda vahepeal järg üle teistele programmidele ning aeglustada või teatud ajaks sootuks peatada protsessori töö. Tasub tähele panna, et isegi 0.01 sekundi pikkune paus, mis inimese jaoks tundub tühiselt väike võib olla arvuti jaoks terve igavik, sest protsessor suudab teha mitmeid tehteid ühes nanosekundis ehk 0.000000001 sekundis.

Aeglustamist kasutatakse ka selleks, et programmi panna käima korduvalt täpselt määratud aja tagant.