{"id":4065,"date":"2020-06-24T01:05:45","date_gmt":"2020-06-23T17:05:45","guid":{"rendered":"https:\/\/yanjingang.com\/blog\/?p=4065"},"modified":"2021-11-29T20:57:13","modified_gmt":"2021-11-29T12:57:13","slug":"%e5%b0%8f%e7%8c%aa%e5%ad%a6arduino-%e4%b8%8eros%e9%80%9a%e4%bf%a1","status":"publish","type":"post","link":"https:\/\/yanjingang.com\/blog\/?p=4065","title":{"rendered":"\u673a\u5668\u4eba\u64cd\u4f5c\u7cfb\u7edfROS\u2014Arduino\u6267\u884c\u673a\u6784"},"content":{"rendered":"<p>\u6700\u8fd1\u5b66\u4e60ROS\uff0c\u6d89\u53ca\u5e95\u76d8\u79fb\u52a8\u7b49\u6267\u884c\u673a\u6784\u65f6\uff0c\u53d1\u73b0\u4e70robot\u5957\u4ef6\u592a\u8d35\u4e86\uff0c\u53c8\u61d2\u5f97\u4ecepi\u4e0a\u76f4\u63a5\u5f00\u53d1\uff0c\u7ffb\u7bb1\u5012\u67dc\u627e\u5230\u4e00\u4e2a\u4ee5\u524d\u8ddf\u513f\u5b50\u4e00\u8d77\u505a\u7684arduino\u5c65\u5e26\u5766\u514b\uff0c\u5c31\u62ff\u5b83\u4f5cros\u673a\u5668\u4eba\u7684action\u6267\u884c\u673a\u6784\u5427\u3002<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter wp-image-5473\" title=\"robot\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/robot-16.png\" sizes=\"(max-width: 471px) 100vw, 471px\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/robot-16.png 471w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/robot-16-300x281.png 300w\" alt=\"\" width=\"471\" height=\"441\" \/><\/p>\n<p>\u672c\u6587\u4e3b\u8981\u8bb2\u89e3\u5982\u4f55\u4f7fArduino\u6210\u4e3a\u4e00\u4e2aROS\u7684\u6267\u884c\u8282\u70b9\uff0c\u4e0ePi\u4e0a\u7684\u63a7\u5236\u6a21\u5757\u901a\u8fc7ROS\u6d88\u606f\u901a\u4fe1\u3002<\/p>\n<h1>\u4e00\u3001\u5b89\u88c5Rosserial Arduino Library<\/h1>\n<p>\u5df2\u7ecf\u6709\u4eba\u4e5f\u8fd9\u4e48\u60f3\u5e76\u505a\u4e86\u4e00\u4e2alib\u5e93\u53ebrosserial\uff0c\u5b83\u662f\u7528\u4e8e\u975eROS\u8bbe\u5907\u4e0eROS\u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u7684\u4e00\u79cd\u534f\u8bae\u3002\u5b83\u4e3a\u975eROS\u8bbe\u5907\u7684\u5e94\u7528\u7a0b\u5e8f\u63d0\u4f9b\u4e86ROS\u8282\u70b9\u548c\u670d\u52a1\u7684\u53d1\u5e03\/\u8ba2\u9605\u529f\u80fd\uff0c\u4f7f\u5728\u975eROS\u73af\u5883\u4e2d\u8fd0\u884c\u7684\u5e94\u7528\u80fd\u591f\u901a\u8fc7\u4e32\u53e3\u6216\u7f51\u7edc\u80fd\u591f\u8f7b\u677e\u5730\u4e0eROS\u5e94\u7528\u8fdb\u884c\u6570\u636e\u4ea4\u4e92\u3002<\/p>\n<p>rosserial\u5206\u4e3a<strong>\u5ba2\u6237\u7aef<\/strong>\u548c<strong>\u670d\u52a1\u7aef<\/strong>\u4e24\u90e8\u5206\u3002<span style=\"color: #ff0000;\">rosserial\u5ba2\u6237\u7aef\u8fd0\u884c\u5728arduino\/stm32\u7b49\u6ca1\u6709ROS\u7684\u7ec8\u7aef\u8bbe\u5907\u4e2d\uff0c\u901a\u8fc7\u4e32\u53e3\u6216\u7f51\u7edc\u4e0e\u8fd0\u884c\u5728ROS\u73af\u5883\u4e2d\u7684rosserial\u670d\u52a1\u7aef\u8fde\u63a5\uff0c\u6700\u7ec8\u901a\u8fc7\u670d\u52a1\u7aef\u8282\u70b9\u5728ROS\u4e2d\u53d1\u5e03\/\u8ba2\u9605\u8bdd\u9898<\/span>\u3002<\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u628arosserial\u7684arduino\u5ba2\u6237\u7aef\u5b89\u88c5\u5230\u5f00\u53d1\u73af\u5883\u91cc\uff1a<\/p>\n<p><a href=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-4066\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial.png\" alt=\"\" width=\"1000\" height=\"562\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial.png 1000w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-300x169.png 300w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-768x432.png 768w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-624x351.png 624w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<p>\u5b89\u88c5\u540e\u91cd\u542farduino\uff0c\u5373\u53ef\u5728\u201c\u793a\u4f8b-Rosserial Arduino Library\u201d\u91cc\u770b\u5230\u5404\u79cd\u793a\u4f8b\u4ee3\u7801\u3002<\/p>\n<h1>\u4e8c\u3001Arduino pub\u6570\u636e\u7ed9ROS<\/h1>\n<p>1\u3001\u53c2\u8003\u201c\u793a\u4f8b-Rosserial Arduino Library-pub\/sub\u201d\uff0c\u7f16\u5199\u4e00\u4e2aarduino pub\u6d88\u606f\u5230ros\u7684\u4ee3\u7801\u5e76\u70e7\u5236\u5230\u677f\u5b50\u4e0a\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">vim pub.ino\r\n\/*\r\n * arduino ros pub\u793a\u4f8b\r\n *\/\r\n \r\n#include &lt;ros.h&gt;\r\n#include &lt;std_msgs\/String.h&gt;\r\n\r\n\/\/ ros\u8282\u70b9\u53e5\u67c4\r\nros::NodeHandle  nh;\r\n\/\/ \u4f20\u8f93\u6d88\u606f\u5b9a\u4e49\r\nstd_msgs::String str_msg;\r\n\/\/ \u5b9e\u4f8b\u5316\u53d1\u5e03\u5bf9\u8c61 (\/tank\/data\u4e3a\u8bdd\u9898\u540d\u79f0\uff0cstr_msg\u4e3a\u6d88\u606f\u5185\u5bb9)\r\nros::Publisher pub(\"\/tank\/data\", &amp;str_msg);\r\n\r\nchar hello[13] = \"I'm tank!\";\r\n\r\nvoid setup()\r\n{\r\n  \/\/ \u521d\u59cb\u5316nh ROS\u8282\u70b9\r\n  nh.initNode();\r\n  \/\/ nh\u8282\u70b9\u4f7f\u7528pub\u53d1\u5e03\u5bf9\u8c61\u6765\u5411\u4e16\u754c\u4e2d\u7684\u8bdd\u9898\u53d1\u5e03\u6d88\u606f\r\n  nh.advertise(pub);\r\n}\r\n \r\nvoid loop()\r\n{\r\n  \/\/ \u6574\u7406\u6d88\u606f\u5185\u5bb9\r\n  str_msg.data = hello;\r\n  \/\/ \u53d1\u5e03\u6d88\u606f\r\n  pub.publish( &amp;str_msg );\r\n  \/\/ \u5b9a\u9891\u4fee\u6b63\r\n  nh.spinOnce();\r\n  delay(1000);\r\n}<\/code><\/pre>\n<p>2\u3001Pi\u4e0a\u6d4b\u8bd5\u80fd\u5426\u6536\u5230\u6765\u81eaarduino\u677f\u5b50\u7684\u6d88\u606f\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\"># Pi\u4e0a\u5b89\u88c5ros-melodic-rosserial\u670d\u52a1\u7aef\u7aef\r\nsudo apt-get install -y ros-melodic-rosserial-arduino ros-melodic-rosserial\r\n\r\n# \u542f\u52a8serial_node\u6d88\u606f\u4e2d\u8f6c\u8282\u70b9\r\nroscore\r\nrosrun rosserial_python serial_node.py <span class=\"hljs-string\">_port:<\/span>=<span class=\"hljs-regexp\">\/dev\/ttyACM0<\/span>\r\n\r\n# \u76d1\u542carduino \u53d1\u7ed9serial_node topic\u7684\u6570\u636e\r\nrostopic <span class=\"hljs-built_in\">echo<\/span> \/tank\/data\r\n\r\n# \u67e5\u770b\u8282\u70b9\u5173\u7cfb\u56fe\r\nrosrun rqt_graph rqt_graph<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230rostopic\u6536\u5230\u4e86\u6765\u81eaarduino\u7684\u6d88\u606f\uff0c\u4f46\u662f\u8282\u70b9\u5173\u7cfb\u56fe\u4e2d\u770b\u4e0d\u5230arduino\uff0c\u53ea\u80fd\u770b\u5230pi\u4e0a\u7528\u4e8e\u4e2d\u8f6c\u6d88\u606f\u7684serial_node\u8282\u70b9\uff1a<\/p>\n<p><a href=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-4098\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node.png\" alt=\"\" width=\"981\" height=\"575\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node.png 981w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node-300x176.png 300w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node-768x450.png 768w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/tank_serial_node-624x366.png 624w\" sizes=\"(max-width: 981px) 100vw, 981px\" \/><\/a><\/p>\n<h1>\u4e09\u3001Arduino sub\u6765\u81eaROS\u7684\u6307\u4ee4\u5e76\u63a7\u5236LED\u706f<\/h1>\n<p>1\u3001Arduino\u53d1\u9001\u6570\u636e\u5e76\u63a5\u53d7\u6765\u81eaROS\u63a7\u5236led\u662f\u5426\u70b9\u4eae\u7684\u6307\u4ee4\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">vim sub.ino\r\n\r\n#include &lt;ros.h&gt;\r\n#include &lt;std_msgs\/String.h&gt;\r\n#include &lt;std_msgs\/Float64.h&gt;\r\nlong INFRARED_PLAY = 0x00FFA857;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684PLAY\u952e\u6307\u4ee4\r\nlong INFRARED_C = 0x00FFB04F;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684C\u6307\u4ee4\r\n\r\n\/\/ led\u5f15\u811a\r\nint ledPin = 13;\r\n\/\/ ros\u8282\u70b9\u53e5\u67c4\r\nros::NodeHandle nh;\r\n\r\n\/\/ pub\u6570\u636e\r\nstd_msgs::String str_msg;\r\nchar hello[]=\"I'm tank!\";\r\nros::Publisher pub(\"\/tank\/data\",&amp;str_msg);\r\n\r\n\/\/ sub\u6307\u4ee4\r\nvoid Control(const std_msgs::Float64&amp; cmd_msg)\r\n{\r\n  if(long(cmd_msg.data) == 0 || long(cmd_msg.data) == INFRARED_C)\r\n  {\r\n      digitalWrite(ledPin, LOW); \r\n  }\r\n  if(long(cmd_msg.data) == 1 || long(cmd_msg.data) == INFRARED_PLAY)\r\n  {\r\n      digitalWrite(ledPin, HIGH); \r\n  }\r\n}\r\nros::Subscriber &lt;std_msgs::Float64&gt;  sub(\"\/tank\/cmd\", &amp;Control );\r\n\r\nvoid setup()\r\n{\r\n    pinMode(ledPin, OUTPUT);\r\n    nh.initNode();\r\n    nh.advertise(pub);\/\/ publish\r\n    nh.subscribe(sub);\/\/ subscribe\r\n}\r\nvoid loop()\r\n{\r\n    str_msg.data = hello;\r\n    pub.publish(&amp;str_msg);\/\/publish a message\r\n    nh.spinOnce();\r\n    delay(1000);\r\n}<\/code><\/pre>\n<p>2\u3001Pi\u4e0a\u6d4b\u8bd5\u6536\u53d1arduino\u6d88\u606f\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\"># \u542f\u52a8serial_node\u6d88\u606f\u4e2d\u8f6c\u8282\u70b9\r\nroscore\r\nrosrun rosserial_python serial_node.py <span class=\"hljs-string\">_port:<\/span>=<span class=\"hljs-regexp\">\/dev\/ttyACM0<\/span>\r\n  [INFO] [1592984761.691208]: ROS Serial Python Node\r\n  [INFO] [1592984761.702119]: Connecting to \/dev\/ttyACM0 at 57600 baud\r\n  [INFO] [1592984763.806578]: Requesting topics...\r\n  [INFO] [1592984764.331100]: Note: publish buffer size is 280 bytes\r\n  [INFO] [1592984764.334090]: Setup publisher on \/tank\/data [std_msgs\/String]\r\n  [INFO] [1592984764.343140]: Note: subscribe buffer size is 280 bytes\r\n  [INFO] [1592984764.345981]: Setup subscriber on \/tank\/cmd [std_msgs\/UInt16]\r\n\r\n\r\n# \u76d1\u542carduino \u53d1\u7ed9serial_node topic\u7684\u6570\u636e\r\nrostopic <span class=\"hljs-built_in\">echo<\/span> \/tank\/data\r\n  data: \"I'm tank!\"\r\n  ---\r\n  data: \"I'm tank!\"\r\n  ---\r\n\r\n# \u5411arduino\u53d1\u9001\u63a7\u5236led\u70b9\u4eae\u6307\u4ee4\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 1   #\u4eae\u706f\uff08pub\u52a0-1\u53c2\u6570\u53ef\u53ea\u53d1\u5e03\u4e00\u6b21\u6d88\u606f\u5426\u5219\u4f1a\u4e00\u76f4\u53d1\uff09\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FFA857\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0   #\u706d\u706f\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FFB04F<\/code><\/pre>\n<h1>\u56db\u3001ROS\u63a7\u5236\u5766\u514b\u79fb\u52a8<\/h1>\n<p>1\u3001\u5766\u514b\u4ee3\u7801\u589e\u52a0ros\u6307\u4ee4\u76d1\u542c<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\">vim tank.ino\r\n\r\n#include &lt;IRremote.h&gt;\/\/\u5305\u542b\u7ea2\u5916\u5e93\r\n#include &lt;ros.h&gt;\/\/\u5305\u542bros\u5e93\r\n#include &lt;std_msgs\/String.h&gt;\/\/\u5305\u542bros msg\u7c7b\u578b\u5e93\r\n#include &lt;std_msgs\/Float64.h&gt;\r\nint infraredPin = 3;\/\/\u7ea2\u5916\u7ebf\u63a5\u6536\u5668\u7aef\u53e3\r\nlong INFRARED_PLAY = 0x00FFA857;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684PLAY\u952e\u6307\u4ee4\r\nlong INFRARED_LEFT = 0x00FFE01F;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684\u5de6\u952e\u6307\u4ee4\r\nlong INFRARED_RIGHT = 0x00FF906F;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684\u53f3\u952e\u6307\u4ee4\r\nlong INFRARED_UP = 0x00FF02FD;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684\u4e0a\u952e\u6307\u4ee4\r\nlong INFRARED_DOWN = 0x00FF9867;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684\u4e0b\u952e\u6307\u4ee4\r\nlong INFRARED_C = 0x00FFB04F;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684C\u6307\u4ee4\r\nlong INFRARED_TEST = 0x00FF22DD;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684TEST\u952e\u6307\u4ee4\r\nlong INFRARED_RETURN = 0x00FFC23D;\/\/\u7ea2\u5916\u9065\u63a7\u5668\u4e0a\u7684RETURN\u952e\u6307\u4ee4\r\nint ledLightPin = 4; \/\/led\u5e38\u4eae\u7aef\u53e3\r\nint ledPin = 13; \/\/led\u63a7\u5236\u63d0\u9192\u7aef\u53e3\r\nint rightMotor = 5; \/\/ \u5b9a\u4e49uno\u7684pin 5 \u5411 rightMotor \u8f93\u51fa   \r\nint rightMotor_ = 6; \/\/ \u5b9a\u4e49uno\u7684pin 6 \u5411 rightMotor_ \u8f93\u51fa  \r\nint leftMotor = 9; \/\/ \u5b9a\u4e49uno\u7684pin 9 \u5411 leftMotor \u8f93\u51fa  \r\nint leftMotor_ = 10; \/\/ \u5b9a\u4e49uno\u7684pin 10 \u5411 leftMotor_ \u8f93\u51fa\r\n\r\n\r\nIRrecv irrecv(infraredPin);\/\/\u521d\u59cb\u5316\u7ea2\u5916\u63a5\u6536\u5668\u5bf9\u8c61\r\ndecode_results results;\/\/\u5b9a\u4e49results\u53d8\u91cf\u4e3a\u7ea2\u5916\u7ed3\u679c\u5b58\u653e\u4f4d\u7f6e\r\n\r\nros::NodeHandle nh; \/\/ ros\u8282\u70b9\u53e5\u67c4\r\n\r\n\/* pub ros\u6570\u636e *\/\r\nstd_msgs::String str_msg;\r\nchar hello[]=\"I'm tank!\";\r\nros::Publisher pub(\"\/tank\/data\",&amp;str_msg);\r\n\r\n\/* sub ros\u6307\u4ee4 *\/\r\nvoid control(const std_msgs::Float64&amp; cmd_msg){\r\n  execute(long(cmd_msg.data));  \/\/\u6267\u884c\u6307\u4ee4\r\n}\r\nros::Subscriber &lt;std_msgs::Float64&gt;  sub(\"\/tank\/cmd\", &amp;control );\r\n\r\n\/* \u6307\u4ee4\u6267\u884c *\/\r\nbool cmd_keep = true;\/\/\u662f\u5426\u4fdd\u6301\u672b\u6b21\u6307\u4ee4\u4e00\u76f4\u6267\u884c\r\nvoid execute(long cmd){\r\n  if (cmd == INFRARED_TEST) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86TEST\u952e\uff0c\u4e0d\u4fdd\u6301\u672b\u6b21\u6307\u4ee4\r\n    cmd_keep = false;\r\n  }else if (cmd == INFRARED_RETURN) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86\u8fd4\u56de\u952e\uff0c\u4fdd\u6301\u672b\u6b21\u6307\u4ee4\u4e00\u76f4\u6267\u884c\r\n    cmd_keep = true;\r\n  }else if (cmd == INFRARED_PLAY || cmd == INFRARED_UP) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86PLAY\/UP\u952e\uff0c\u524d\u8fdb\r\n    digitalWrite(ledPin, HIGH);\r\n    \/\/forward \u5411\u524d\u8f6c  \r\n    digitalWrite(rightMotor,HIGH); \/\/\u7ed9\u9ad8\u7535\u5e73  \r\n    digitalWrite(rightMotor_,LOW);  \/\/\u7ed9\u4f4e\u7535\u5e73  \r\n    digitalWrite(leftMotor,HIGH); \/\/\u7ed9\u9ad8\u7535\u5e73  \r\n    digitalWrite(leftMotor_,LOW);  \/\/\u7ed9\u4f4e\u7535\u5e73\r\n  }else if (cmd == INFRARED_DOWN ) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86\uff0d\u952e\uff0c\u540e\u9000\r\n    digitalWrite(ledPin, HIGH);\r\n    \/\/back \u5411\u540e\u8f6c  \r\n    digitalWrite(rightMotor,LOW);  \r\n    digitalWrite(rightMotor_,HIGH);    \r\n    digitalWrite(leftMotor,LOW);  \r\n    digitalWrite(leftMotor_,HIGH); \r\n  }else if (cmd == INFRARED_LEFT ) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86\u5de6\u952e\uff0c\u5de6\u8f6c\r\n    digitalWrite(ledPin, HIGH);\r\n    \/\/left \u5de6\u8f6c \r\n    digitalWrite(leftMotor,LOW);  \r\n    digitalWrite(leftMotor_,LOW); \r\n    digitalWrite(rightMotor,HIGH);  \r\n    digitalWrite(rightMotor_,LOW);\r\n  }else if (cmd == INFRARED_RIGHT ) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86\u53f3\u952e\uff0c\u53f3\u8f6c\r\n    digitalWrite(ledPin, HIGH);\r\n    \/\/right \u53f3\u8f6c \r\n    digitalWrite(rightMotor,LOW);  \r\n    digitalWrite(rightMotor_,LOW);    \r\n    digitalWrite(leftMotor,HIGH);  \r\n    digitalWrite(leftMotor_,LOW); \r\n  }else if (cmd == INFRARED_C || cmd_keep == false) {\/\/\u9065\u63a7\u5668\u6309\u4e0b\u4e86C\u952e\u6216\u975e\u6301\u7eed\u7c7b\u6307\u4ee4\uff0c\u505c\u6b62\r\n    digitalWrite(ledPin, LOW);\r\n    \/\/stop \u505c\u6b62  \r\n    digitalWrite(rightMotor,LOW);  \r\n    digitalWrite(rightMotor_,LOW);    \r\n    digitalWrite(leftMotor,LOW);  \r\n    digitalWrite(leftMotor_,LOW); \r\n  }\r\n}\r\n\r\n\/* \u5c65\u5e26\u5766\u514b *\/\r\nvoid setup() {\r\n  \/\/\u7ea2\u5916\u63a5\u6536\u5668\u7aef\u53e3\u521d\u59cb\u5316\r\n  pinMode(infraredPin, INPUT);\r\n  \/\/\u521d\u59cb\u5316\u7535\u673aIO,\u6a21\u5f0f\u4e3aOUTPUT \u8f93\u51fa\u6a21\u5f0f  \r\n  pinMode(rightMotor,OUTPUT);  \r\n  pinMode(rightMotor_,OUTPUT);  \r\n  pinMode(leftMotor,OUTPUT);  \r\n  pinMode(leftMotor_,OUTPUT);\r\n\r\n  \/\/led\u7aef\u53e3\u521d\u59cb\u5316\r\n  pinMode(ledPin, OUTPUT);\r\n  pinMode(ledLightPin, OUTPUT);\r\n  digitalWrite(ledLightPin, HIGH);\r\n  \/\/\u6ce2\u7279\u738757600\r\n  \/\/Serial.begin(57600);\r\n  \/\/\u542f\u52a8\u7ea2\u5916\u89e3\u7801\r\n  irrecv.enableIRIn();\r\n  \r\n  \/\/ROS\u8282\u70b9\u521d\u59cb\u5316\r\n  nh.initNode();\r\n  nh.advertise(pub);\/\/ publish\r\n  nh.subscribe(sub);\/\/ subscribe\r\n}\r\n\r\nvoid loop() {\r\n  \/\/\u68c0\u6d4b\u7ea2\u5916\u4fe1\u53f7\r\n  if (irrecv.decode(&amp;results)) {\/\/\u662f\u5426\u63a5\u6536\u5230\u89e3\u7801\u6570\u636e,\u628a\u63a5\u6536\u5230\u7684\u6570\u636e\u5b58\u50a8\u5728\u53d8\u91cfresults\u4e2d\r\n    \/\/Serial.println(results.value, HEX);\/\/\u63a5\u6536\u5230\u7684\u6570\u636e\u4ee516\u8fdb\u5236\u7684\u65b9\u5f0f\u5728\u4e32\u53e3\u8f93\u51fa\r\n    \/\/\u6267\u884c\u6307\u4ee4\r\n    execute(results.value);\r\n\r\n    \/\/\u7ee7\u7eed\u7b49\u5f85\u63a5\u6536\u4e0b\u4e00\u7ec4\u4fe1\u53f7\r\n    irrecv.resume();\r\n\r\n    \/\/led\u7184\u706d\r\n    delay(200);\r\n    digitalWrite(ledPin, LOW);\r\n  }\r\n\r\n  \/*\r\n  \/\/pub ros\u6d88\u606f\r\n  str_msg.data = hello;\r\n  pub.publish(&amp;str_msg);\/\/publish a message\r\n  delay(10);\r\n  *\/\r\n  nh.spinOnce();\r\n}<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>2\u3001Pi\u4e0a\u6d4b\u8bd5\u63a7\u5236\u5766\u514b\uff1a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\"># \u67e5\u770barduino\u677f\u5b50\u6ce2\u7279\u7387\r\nstty -F \/dev\/ttyACM0 57600  #\u8bbe\u7f6e\u4e3a57600\uff08\u4ee3\u7801\u91cc\u4e0d\u8981\u4fee\u6539Serial\u6ce2\u7279\u7387\uff09\r\n\r\n# \u542f\u52a8serial_node\u6d88\u606f\u4e2d\u8f6c\u8282\u70b9\r\nroscore\r\nrosrun rosserial_python serial_node.py <span class=\"hljs-string\">_port:<\/span>=<span class=\"hljs-regexp\">\/dev\/<\/span>ttyACM0\r\n\r\n# \u5411arduino\u53d1\u9001\u63a7\u5236\u5766\u514b\u63a7\u5236\u6307\u4ee4\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FF22DD  #\u5207\u6362\u4e3a\u5355\u6b21\u6267\u884c\r\n#rostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FFC23D  #\u6062\u590d\u4e3a\u6301\u7eed\u6267\u884c\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FF02FD  #\u524d\u8fdb \u6216 0x00FFA857\r\n#rostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FF9867  #\u540e\u9000\r\n#rostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FFE01F  #\u5de6\u8f6c\r\n#rostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FF906F  #\u53f3\u8f6c\r\nrostopic pub  \/tank\/cmd std_msgs\/Float64 0x00FFB04F  #\u505c\u6b62\r\n*\u6216\u5199ros\u4ee3\u7801pub\u76f8\u5173\u6307\u4ee4\uff0c\u56e0\u4e0erosserial\u65e0\u5173\u4e0d\u518d\u8d58\u8ff0\r\n\r\n# \u67e5\u770b\u8282\u70b9\u5173\u7cfb\r\nrqt_graph\r\n<\/code><\/pre>\n<p>rostopic\u6307\u4ee4\u8282\u70b9\u53d1\u51facmd\u6d88\u606f\uff0crosserial server node\u5c06\u6d88\u606f\u8f6c\u53d1\u7ed9ttyACM0\u7684\u5e95\u76d8rosserial\u5ba2\u6237\u7aef\u8282\u70b9\uff08\u8f6c\u53d1\u90e8\u5206\u5728graph\u4e0a\u770b\u4e0d\u5230\uff09<\/p>\n<p><a href=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-5505\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph-1024x215.png\" alt=\"\" width=\"625\" height=\"131\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph-1024x215.png 1024w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph-300x63.png 300w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph-768x161.png 768w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph-624x131.png 624w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/rosserial-graph.png 1241w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/a><\/p>\n<p>\u6d4b\u8bd5\u63a7\u5236\u6548\u679c\uff1a<\/p>\n<p><a href=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F.jpeg\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-4106\" src=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F-1024x768.jpeg\" alt=\"\" width=\"625\" height=\"469\" srcset=\"https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F-1024x768.jpeg 1024w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F-300x225.jpeg 300w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F-768x576.jpeg 768w, https:\/\/yanjingang.com\/blog\/wp-content\/uploads\/2020\/06\/C6DCE23C-664D-4F5F-8233-6783C415464F-624x468.jpeg 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/a><\/p>\n<p>\u4eca\u5929\u5c31\u5148\u5230\u8fd9\u91cc\uff0c\u4e0b\u4e00\u7bc7\u6211\u4eec\u4f1a\u628aRGB-D\u6df1\u5ea6\u76f8\u673a\u76843\u7ef4\u70b9\u4e91\u90e8\u5206\u6d4b\u8bd5\u597d\u540e\u52a0\u5230\u8fd9\u4e2a\u5766\u514b\u4e0a\u505a\u4e3a\u5b83\u7684\u773c\u775b\u6765\u611f\u77e5\u73af\u5883\u3002<\/p>\n<p>yan 20.6.25 3:18<\/p>\n<p>\u53c2\u8003\uff1a<\/p>\n<p><a href=\"https:\/\/blog.csdn.net\/wanzew\/article\/details\/80030768\" target=\"_blank\" rel=\"noopener noreferrer\">ROS\u5b66\u4e60\u4e4bArduino\u7bc7\u2014rosserial_arduino\u5305<\/a><\/p>\n<p><a href=\"https:\/\/www.cnblogs.com\/flyingjun\/p\/8954043.html\" target=\"_blank\" rel=\"noopener noreferrer\">ROS\u4e0eArduino\u5b66\u4e60\uff08\u516b\uff09\u7535\u673a\u63a7\u5236(\u57fa\u4e8erosserial_arduino)<\/a><\/p>\n<p><a href=\"https:\/\/www.cnblogs.com\/flyingjun\/p\/8932100.html\" target=\"_blank\" rel=\"noopener noreferrer\">ROS\u4e0eArduino\u5b66\u4e60\uff08\u4e8c\uff09HelloWorld<\/a><\/p>\n<p><a href=\"http:\/\/wiki.ros.org\/rosserial\" target=\"_blank\" rel=\"noopener noreferrer\">rosserial<\/a><\/p>\n<p><a href=\"https:\/\/blog.csdn.net\/scx837685002\/article\/details\/102770753\" target=\"_blank\" rel=\"noopener noreferrer\">rosserial\u7b80\u4ecb<\/a><\/p>\n<p><a href=\"https:\/\/pyserial.readthedocs.io\/en\/latest\/shortintro.html\" target=\"_blank\" rel=\"noopener noreferrer\">Short introduction &#8211; pyserial<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u5b66\u4e60ROS\uff0c\u6d89\u53ca\u5e95\u76d8\u79fb\u52a8\u7b49\u6267\u884c\u673a\u6784\u65f6\uff0c\u53d1\u73b0\u4e70robot\u5957\u4ef6\u592a\u8d35\u4e86\uff0c\u53c8\u61d2\u5f97\u4ecepi\u4e0a\u76f4\u63a5\u5f00\u53d1\uff0c\u7ffb\u7bb1\u5012\u67dc\u627e\u5230\u4e00\u4e2a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[353,505,1005],"tags":[354,968,1015,855],"_links":{"self":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4065"}],"collection":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4065"}],"version-history":[{"count":0,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4065\/revisions"}],"wp:attachment":[{"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yanjingang.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}