{"id":30,"date":"2024-04-04T08:01:23","date_gmt":"2024-04-04T05:01:23","guid":{"rendered":"https:\/\/sisu.ut.ee\/rosak\/rosi-tellija-kirjutamine\/"},"modified":"2024-04-04T08:03:58","modified_gmt":"2024-04-04T05:03:58","slug":"rosi-tellija-kirjutamine","status":"publish","type":"page","link":"https:\/\/sisu.ut.ee\/rosak\/rosi-tellija-kirjutamine\/","title":{"rendered":"4. ROSi tellija kirjutamine"},"content":{"rendered":"<blockquote>\n<p>\n\t\t<strong><span id=\"docs-internal-guid-ae126d72-7fff-41c5-437f-5a30924bf4c7\">Eelnevalt tutvusime AR m\u00e4rgistega ja uurisime, millist infot on v\u00f5imalik nende abil saada. Selles harjutuses kirjutame lihtsa ROSi tellija (ingl <\/span><em><span>subscriber<\/span><\/em><span>), et saada oma koodis k\u00e4tte AR m\u00e4rgiste positsiooni ja orientatsiooni info, mida kuulutab <span style=\"font-family:Courier New,Courier,monospace\">ar_track_alvar<\/span> kimbu s\u00f5lm. See on aluseks, et saaksime AR m\u00e4rgiste p\u00f5hjal panna roboti midagi tegema.<\/span><\/strong>\n\t<\/p>\n<\/blockquote>\n<p>\n\t<span><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd8516-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd8516-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd8516-collapse\"><strong>Kimbu loomine<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd8516-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd8516-heading\">\n            <div class=\"accordion-body\">Loo uus ROSi kimp, mis s\u00f5ltub j\u00e4rgmistest kimpudest: <span style=\"font-family:Courier New,Courier,monospace\">ar_track_alvar_msgs<\/span>, <span style=\"font-family:Courier New,Courier,monospace\">geometry_msgs<\/span>, <span style=\"font-family:Courier New,Courier,monospace\">rospy<\/span> ja <span style=\"font-family:Courier New,Courier,monospace\">tf<\/span>. Kui vaja, siis vaata eelmisest materjalist, kuidas kimpu luua. Kimbu nimeks anna m\u00f5ni endale meeldiv nimi. \u00c4ra pane kimbule sama nime, mis m\u00f5nel juba olemasoleval kimbul (nt \u00e4ra pane nimeks <span style=\"font-family:Courier New,Courier,monospace\">ar_track_alvar<\/span>).\n\n<p>\n\t<span><\/span><\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div><\/span>\n<\/p>\n<p>\n\t<\/p><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd851c-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd851c-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd851c-collapse\"><strong>Koodifail<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd851c-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd851c-heading\">\n            <div class=\"accordion-body\">Loo uue kimbu sisse <span style=\"font-family:Courier New,Courier,monospace\">scripts<\/span> kaust ja selle sisse koodifail, mis sisaldab j\u00e4rgmiseid kuulutaja kirjutamisest tuttavaid elemente ROSi kasutamiseks:\n\n<ul>\n<li>\n\t\t<span style=\"font-family:Courier New,Courier,monospace\">rospy<\/span> importimine\n\t<\/li>\n<li>\n\t\t<span style=\"font-family:Courier New,Courier,monospace\">main<\/span> funktsioon ja selle v\u00e4ljakutsumine\n\t<\/li>\n<li>\n\t\tsobivate argumentidega s\u00f5lme loomine\n\t<\/li>\n<li>\n\t\t<span style=\"font-family:Courier New,Courier,monospace\">while<\/span>-ts\u00fckkel, mis jookseb seni, kuni s\u00f5lm kinni pannakse (nt <span style=\"font-family:Courier New,Courier,monospace\">Ctrl+C<\/span> abil)\n\t<\/li>\n<\/ul>\n<p>\n\t<\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div>\n\n<p>\n\t<\/p><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd851f-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd851f-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd851f-collapse\"><strong>S\u00f5numit\u00fc\u00fcp<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd851f-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd851f-heading\">\n            <div class=\"accordion-body\"><span id=\"docs-internal-guid-9d9b16e7-7fff-d306-c2bd-a9257d1641ef\">Lisa koodifaili p\u00e4isesse importimine, mis v\u00f5imaldab koodis kasutada s\u00f5numeid, mida kuulutab <span style=\"font-family:Courier New,Courier,monospace\">ar_track_alvar<\/span>. Need s\u00f5numid on t\u00fc\u00fcbiga <span style=\"font-family:Courier New,Courier,monospace\">AlvarMarkers<\/span>.<\/span>\n\n<pre>from ar_track_alvar_msgs.msg import AlvarMarkers<\/pre>\n<p>\n\t<\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div>\n\n<p>\n\t<\/p><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd8523-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd8523-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd8523-collapse\"><strong>Tellija loomine<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd8523-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd8523-heading\">\n            <div class=\"accordion-body\"><span id=\"docs-internal-guid-8d6d9519-7fff-08a5-b25d-b8d373dba262\">N\u00fc\u00fcd saame luua tellija ja lisada muud koodiread, mis on vajalikud tellija toimimiseks. Tellija loomine on sarnane kuulutaja loomisele. Kasutame selleks k\u00e4sku <span style=\"font-family:Courier New,Courier,monospace\">rospy.Subscriber()<\/span>, millele anname sulgude sees j\u00e4rgmised argumendid:<\/span>\n\n<ul>\n<li>\n\t\tselle <strong>rubriigi nimi<\/strong>, kus kuulutatavaid s\u00f5numeid tellija peab kuulama;\n\t<\/li>\n<li>\n\t\trubriigis kuulutatavate s\u00f5numite <strong>s\u00f5numit\u00fc\u00fcp<\/strong>;\n\t<\/li>\n<li>\n\t\t<strong>tagasikutsefunktsiooni<\/strong> nimi, mis tegeleb s\u00f5numitega, kui need saabuvad (sellest r\u00e4\u00e4gime rohkem natukese aja p\u00e4rast).\n\t<\/li>\n<\/ul>\n<p>\n\tTellija loomine peab koodis toimuma p\u00e4rast s\u00f5lme loomist, aga enne peamist <span style=\"font-family:Courier New,Courier,monospace\">while<\/span>-ts\u00fcklit. Loomiseks kasuta j\u00e4rgmist koodirida:\n<\/p>\n<pre>rospy.Subscriber(\"ar_pose_marker\", AlvarMarkers, ar_message_handler)<\/pre>\n<p>\n\tMeie tellija kuulab <span style=\"font-family:Courier New,Courier,monospace\">AlvarMarkers<\/span> t\u00fc\u00fcpi s\u00f5numeid rubriigis <span style=\"font-family:Courier New,Courier,monospace\">ar_pose_marker<\/span>. Vastuv\u00f5etud s\u00f5numitega tegeleb funktsioon nimega <span style=\"font-family:Courier New,Courier,monospace\">ar_message_handler<\/span>. See on tagasikutsefunktsioon (ingl <em>callback function<\/em>) ehk funktsioon, mis k\u00e4ivitub iga s\u00f5numi saabumisel. Funktsiooni koodis rohkem v\u00e4lja kutsuda ei ole vaja \u2013 tellija loomisel on vajalikud seosed juba loodud.\n<\/p>\n<p>\n\t<\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div>\n\n<p>\n\t<\/p><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd8528-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd8528-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd8528-collapse\"><strong>Tagasikutsefunktsioon<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd8528-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd8528-heading\">\n            <div class=\"accordion-body\">Loo tagasikutsefunktsioon <span style=\"font-family:Courier New,Courier,monospace\">AlvarMarkers<\/span> s\u00f5numitega tegelemiseks. Selle funktsiooni sisendparameetriks on viimane <span style=\"font-family:Courier New,Courier,monospace\">AlvarMarkers<\/span> t\u00fc\u00fcpi s\u00f5num, mille meie tellija vastu v\u00f5ttis.\n\n<p>\n\tOluline asi, mida meeles pidada, on et tagasikutsefunktsioon tuleb luua enne, kui seda kasutatakse. Tellija loomisel seda juba kasutatakse, sest anname <span style=\"font-family:Courier New,Courier,monospace\">ar_message_handler<\/span> funktsiooni <span style=\"font-family:Courier New,Courier,monospace\">rospy.Subscriber()<\/span> funktsioonile argumendiks. Seet\u00f5ttu tuleb see funktsioon koodis paigutada <span style=\"font-family:Courier New,Courier,monospace\">main<\/span>-funktsioonist ettepoole (aga p\u00e4isest allapoole).\n<\/p>\n<p>\n\tLihtne variant <span style=\"font-family:Courier New,Courier,monospace\">ar_message_handler<\/span> funktsioonist on toodud j\u00e4rgnevalt. See funktsioon prindib v\u00e4lja k\u00f5igi tuvastatud AR m\u00e4rgiste ID, kui kaamerapildis m\u00f5ni leitakse, ja informatiivse s\u00f5numi, kui \u00fchtegi m\u00e4rgist ei leitud.\n<\/p>\n<pre>def ar_message_handler(data):\r\n   if len(data.markers) &gt; 0:\r\n      for marker in data.markers:\r\n         rospy.loginfo(\"Detected marker with ID \" + str(marker.id))\r\n\r\n   else:\r\n      rospy.loginfo(\"No AR markers detected.\")<\/pre>\n<p>\n\t<span id=\"docs-internal-guid-a5189e80-7fff-07d9-b177-4b45d116fc0a\">Ongi k\u00f5ik, tellija on valmis!<\/span>\n<\/p>\n<p>\n\t<\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div>\n\n<p>\n\t<\/p><div class=\"accordion mb-3\">\n        <div class=\"accordion-item accordion-item--white\">\n        <h2 class=\"accordion-header\" id=\"accordion-69e7b63fd852e-heading\">\n            <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-69e7b63fd852e-collapse\" aria-expanded=\"true\" aria-controls=\"accordion-69e7b63fd852e-collapse\"><strong>Koodi katsetamine<\/strong><\/button>\n        <\/h2>\n        <div id=\"accordion-69e7b63fd852e-collapse\" class=\"accordion-collapse collapse\" aria-labelledby=\"accordion-69e7b63fd852e-heading\">\n            <div class=\"accordion-body\">Selleks, et koodi saaks k\u00e4ivitada, tuleb sellele anda vastavad \u00f5igused samamoodi, nagu tegime moodul 4 k\u00e4igus. Failiga samas kaustas:\n\n<pre>chmod +x faili_nimi.py<\/pre>\n<p>\n\t<span>Oma koodi saame k\u00e4ivitada j\u00e4rgneva tuttava s\u00fcntaksiga k\u00e4suga:<\/span>\n<\/p>\n<pre><span>rosrun kimbu_nimi faili_nimi.py<\/span><\/pre>\n<p>\n\t<span id=\"docs-internal-guid-abc204b7-7fff-7a9d-0343-f81a035b5c9c\">Asenda k\u00e4sus kimbunimi ja failinimi oma kimbu ja faili nimedega.<\/span>\n<\/p>\n<p>\n\t<span id=\"docs-internal-guid-55e38af5-7fff-9950-6c85-9a98855c98c4\">On ootusp\u00e4rane, et kui n\u00fc\u00fcd ilmub kaamerapilti m\u00f5ni AR m\u00e4rgis, siis prindib meie kood v\u00e4lja selle ID. AR m\u00e4rgiste puudumisel prinditakse v\u00e4lja infot, et m\u00e4rgiseid ei leitud. <strong>Seda aga ei juhtu.<\/strong> Kogu p\u00f5hjus on selles, et me pole veel k\u00e4ivitanud s\u00f5lme, mis AR m\u00e4rgiseid tuvastab ja rubriiki <span style=\"font-family:Courier New,Courier,monospace\">ar_pose_marker<\/span> kuulutab. Teeme seda j\u00e4rgmises harjutuses.<\/span>\n<\/p>\n<p>\n\t<\/p><\/div>\n        <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Eelnevalt tutvusime AR m\u00e4rgistega ja uurisime, millist infot on v\u00f5imalik nende abil saada. Selles harjutuses kirjutame lihtsa ROSi tellija (ingl subscriber), et saada oma koodis k\u00e4tte AR m\u00e4rgiste positsiooni ja orientatsiooni info, mida kuulutab ar_track_alvar kimbu s\u00f5lm. See on aluseks, &#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-30","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/30","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=30"}],"version-history":[{"count":1,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/30\/revisions"}],"predecessor-version":[{"id":371,"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/pages\/30\/revisions\/371"}],"wp:attachment":[{"href":"https:\/\/sisu.ut.ee\/rosak\/wp-json\/wp\/v2\/media?parent=30"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}