{"id":12,"date":"2024-04-04T08:01:21","date_gmt":"2024-04-04T05:01:21","guid":{"rendered":"https:\/\/sisu.ut.ee\/rosak\/pikem-soit\/"},"modified":"2024-04-04T08:03:59","modified_gmt":"2024-04-04T05:03:59","slug":"pikem-soit","status":"publish","type":"page","link":"https:\/\/sisu.ut.ee\/rosak\/pikem-soit\/","title":{"rendered":"8. Pikem s\u00f5it"},"content":{"rendered":"<blockquote>\n<p>\n\t\t<strong><span id=\"docs-internal-guid-11017dbf-7fff-1d94-1898-e7f42fe4c5c0\">N\u00fc\u00fcd oskame robotit s\u00f5itma panna, kuid ainult l\u00fchikeseks ajaks. Mis siis, kui tahame, et ta s\u00f5idaks pikemat aega?<\/span><\/strong>\n\t<\/p>\n<\/blockquote>\n<p>\n\t<span id=\"docs-internal-guid-38e9bbfe-7fff-85f3-073d-e34c4e2c995f\">Selleks, et roboti kasutamine oleks turvaline (n\u00e4iteks olukorras kus \u00fchendus roboti ja <span style=\"font-family:Courier New,Courier,monospace\">cmd_vel<\/span> kuulutaja vahel kaob), on roboti draiverisse sisse programmeeritud kaitsemehhanism, mis automaatselt peatab roboti mootorid, kui poole sekundi jooksul ei ole uut s\u00f5numit kiiruse infoga saabunud. Kui soovime, et robot liiguks edasi kauem kui pool sekundit, peame talle <\/span><span>pidevalt liikumisk\u00e4ske saatma<\/span><span>. Vaatame, kuidas oma koodi veidi muuta n\u00f5nda, et see liikumisk\u00e4ske regulaarselt kuulutaks.<\/span>\n<\/p>\n<pre dir=\"ltr\" style=\"line-height: 1.38;margin-top: 0pt;margin-bottom: 0pt\"><span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">#!\/usr\/bin\/env python3<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">import rospy<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">from geometry_msgs.msg import Twist<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">def main():<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    rospy.init_node(\"velocity_publisher\")<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    velocity_pub = rospy.Publisher(\"cmd_vel\", Twist, queue_size=0)\r\n    rospy.sleep(2)<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:#ffff00;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    loop_rate = rospy.Rate(10)<\/span>\r\n<span style=\"New';color:#000000;background-color:#ffff00;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    starting_time = rospy.get_time()<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:#ffff00;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    while (not rospy.is_shutdown()) and (rospy.get_time() - starting_time &lt; 5):<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel = Twist()<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.linear.x = 0.1<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.linear.y = 0.0<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.linear.z = 0.0<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.angular.x = 0.0<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.angular.y = 0.0<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        robot_vel.angular.z = 0.0<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        velocity_pub.publish(robot_vel)<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:#ffff00;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        loop_rate.sleep()<\/span>\r\n\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">if __name__ == '__main__':<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    try:<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        main()<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">    except rospy.ROSInterruptException:<\/span>\r\n<span style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">        pass<\/span><\/pre>\n<p>\n\t\u00a0\n<\/p>\n<p>\n\t<span>Anal\u00fc\u00fcsime selle koodi t\u00f6\u00f6d.<\/span>\n<\/p>\n<pre><span id=\"docs-internal-guid-b3eef065-7fff-fb32-6b11-fca9ee72271f\" style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">starting_time = rospy.get_time()<\/span><\/pre>\n<p>\n\t<span id=\"docs-internal-guid-f8903c66-7fff-ddb4-e757-0ac1aee443ed\">See rida paneb muutuja <span style=\"font-family:Courier New,Courier,monospace\">starting_time<\/span> v\u00e4\u00e4rtuseks praeguse kellaaja, m\u00f5\u00f5detuna sekundites kindlast ajahetkest minevikus. Teiste s\u00f5nadega: see \u00fctleb meile, kui mitu sekundit on m\u00f6\u00f6dunud teatud kindlast ajahetkest. Mis hetk see t\u00e4pselt on, see ei olegi meie jaoks oluline.<\/span>\n<\/p>\n<pre><span style=\"font-family:Courier New,Courier,monospace\"><span id=\"docs-internal-guid-4832b12c-7fff-bf81-b41c-03161cffa07d\">while (not rospy.is_shutdown()) and (rospy.get_time() - starting_time &lt; 5):<\/span><\/span><\/pre>\n<p>\n\t<span>See rida tekitab ts\u00fckli, mis jookseb seni, kuni kehtivad kaks tingimust: ROSi t\u00f6\u00f6d pole peatatud (<\/span><span style=\"font-family:Courier New,Courier,monospace\">not rospy.is_shutdown()<\/span><span>) ja vahe praeguse aja (<span style=\"font-family:Courier New,Courier,monospace\">rospy.get_time()<\/span>) ning koodi algusaja (<span style=\"font-family:Courier New,Courier,monospace\">starting_time<\/span>) vahel on v\u00e4iksem kui 5 sekundit. Tegelikkuses t\u00e4hendab see, et kood jookseb kuni 5 sekundit.<\/span>\n<\/p>\n<pre><span id=\"docs-internal-guid-b934c462-7fff-cc1f-ef8f-e6b0c8b4bd26\" style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">loop_rate = rospy.Rate(10)<\/span><\/pre>\n<p>\n\t<span id=\"docs-internal-guid-6a43c8bf-7fff-b376-c993-6fd061a490ab\">ning<\/span>\n<\/p>\n<pre><span id=\"docs-internal-guid-6818e24c-7fff-f8d3-2bc2-e8206aeb1cda\" style=\"New';color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline\">loop_rate.sleep()<\/span><\/pre>\n<p>\n\t<span id=\"docs-internal-guid-e6dab8c0-7fff-212e-12b8-0dce6fc92403\">Need read aitavad meil ts\u00fcklit k\u00e4imas hoida konstantse kiirusega. Robootikas on sageli kasulik, kui meie kood l\u00e4bib ts\u00fcklit kindla pikkusega. <span style=\"font-family:Courier New,Courier,monospace\">rospy.Rate(10)<\/span> tekitab meile v\u00f5imaluse panna koodi jooksma kiirusega 10 Hz (st 10 korda sekundis). Selle funktsiooni tagastatud v\u00e4\u00e4rtuse paneme muutujasse <span style=\"font-family:Courier New,Courier,monospace\">loop_rate<\/span>. Ning seej\u00e4rel saame ts\u00fckli l\u00f5pus v\u00e4lja kutsuda funktsiooni <span style=\"font-family:Courier New,Courier,monospace\">loop_rate.sleep()<\/span>, mis lihtsalt aeglustab ts\u00fckli l\u00e4bimist ja ootab, kuni ts\u00fckli l\u00e4bimiseks kulunud aeg on t\u00e4pselt k\u00fcmnendik sekundit.<\/span>\n<\/p>\n<blockquote class=\"os-kollane\">\n<h4>\n\t\t<span id=\"docs-internal-guid-8079ae20-7fff-bb92-1c0a-492b971ba1dc\">Miks programmi t\u00f6\u00f6d aeglustada?<\/span><br>\n\t<\/h4>\n<p dir=\"ltr\" id=\"docs-internal-guid-50ed3799-7fff-dc41-2389-061ac15dc929\" style=\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\">\n\t\t<span>Programmi t\u00f6\u00f6 aeglustamine v\u00f5ib olla kasulik mitmes olukorras. Tavaliselt t\u00e4idab arvuti programmi nii kiiresti, kui v\u00f5imalik \u2013 kasutades selleks \u00e4ra k\u00f5ik oma ressursid. S\u00f5ltuvalt sellest, mida programm tegema peab, v\u00f5ib miljonite operatsioonide sooritamine \u00fches sekundis olla t\u00e4iesti ebapraktiline ning energiat raiskav. Selleks ongi programmeerimiskeeltes spetsiaalsed k\u00e4sud, millega programmi aeglustada. Need k\u00e4sud v\u00f5imaldavad anda vahepeal j\u00e4rg \u00fcle teistele programmidele ning aeglustada v\u00f5i teatud ajaks sootuks peatada protsessori t\u00f6\u00f6. Tasub t\u00e4hele panna, et isegi 0.01 sekundi pikkune paus, mis inimese jaoks tundub t\u00fchiselt v\u00e4ike v\u00f5ib olla arvuti jaoks terve igavik, sest protsessor suudab teha mitmeid tehteid \u00fches <\/span><span>nano<\/span><span>sekundis ehk 0.000000001 sekundis.<\/span>\n\t<\/p>\n<p dir=\"ltr\" style=\"line-height:1.38;margin-top:0pt;margin-bottom:0pt\">\n\t\t<span>Aeglustamist kasutatakse ka selleks, et programmi panna k\u00e4ima korduvalt t\u00e4pselt m\u00e4\u00e4ratud aja tagant.<\/span>\n\t<\/p>\n<\/blockquote>\n<p>\n\t\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00fc\u00fcd oskame robotit s\u00f5itma panna, kuid ainult l\u00fchikeseks ajaks. Mis siis, kui tahame, et ta s\u00f5idaks pikemat aega? Selleks, et roboti kasutamine oleks turvaline (n\u00e4iteks olukorras kus \u00fchendus roboti ja cmd_vel kuulutaja vahel kaob), on roboti draiverisse sisse programmeeritud kaitsemehhanism, &#8230;<\/p>\n","protected":false},"author":98,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-12","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/users\/98"}],"replies":[{"embeddable":true,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":1,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/12\/revisions"}],"predecessor-version":[{"id":389,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/12\/revisions\/389"}],"wp:attachment":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/media?parent=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}