{"id":151,"date":"2021-11-21T12:44:11","date_gmt":"2021-11-21T12:44:11","guid":{"rendered":"http:\/\/47.103.123.166\/?p=151"},"modified":"2021-11-21T12:44:11","modified_gmt":"2021-11-21T12:44:11","slug":"ros2_foxy%e5%ad%a6%e4%b9%a05-%e5%9f%ba%e7%a1%80%e7%bc%96%e7%a8%8b_c","status":"publish","type":"post","link":"http:\/\/47.103.123.166\/?p=151","title":{"rendered":"ROS2_Foxy\u5b66\u4e605\u2014\u2014\u57fa\u7840\u7f16\u7a0b_C++"},"content":{"rendered":"<p>\u91cc\u9762\u7684\u4f8b\u5b50\u53c2\u8003<a href=\"https:\/\/github.com\/ros2\/ros2_documentation\">\u5b98\u65b9\u6559\u7a0b<\/a>\uff0c\u7136\u540e\u9644\u5e26\u4e00\u4e9b\u89e3\u91ca\u548c\u4e00\u4e9b\u63a8\u8350\u7684\u4fbf\u4e8e\u7406\u89e3\u7684\u6587\u7ae0\u3002<\/p>\n<h1>1 workspace<\/h1>\n<h2>1.1 \u5de5\u4f5c\u7a7a\u95f4\u53ca\u5176\u5c42\u6b21<\/h2>\n<p>&emsp;&emsp;<strong>\u7a7a\u95f4\u7684\u521b\u5efa<\/strong>\uff1aROS2\u4e0eROS1\u4e00\u6837\uff0c\u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4\u76ee\u5f55\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa\/src\u76ee\u5f55\uff0c\u7528\u4e8e\u5b58\u653epackage\u529f\u80fd\u5305\u3002<\/p>\n<p>&emsp;&emsp;<strong>\u5c42\u6b21\u7684\u6982\u5ff5<\/strong>\uff1aROS2\u589e\u52a0\u4e86overlay\u548cunderlay\u7684\u6982\u5ff5\uff0c\u7528\u4e8e\u5728\u591a\u4e2aworkspace\u540c\u65f6\u5de5\u4f5c\u65f6\uff0c\u5904\u7406\u5404\u4e2aworkspace\u4e4b\u95f4\u7684\u5c42\u6b21\u95ee\u9898\uff0c\u5bf9\u4e8e\u5305\u540d\u76f8\u540c\u7684package\uff0c\u4e0a\u5c42workspace\u5c06\u8986\u76d6(override)\u4e0b\u5c42workspace\u4e2d\u7684\u540c\u540dpackage\u3002<\/p>\n<p>&emsp;&emsp;<strong>\u5c42\u6b21\u7684\u914d\u7f6e<\/strong>\uff1a\u5c42\u6b21\u662f\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u7684\u5148\u540e\u51b3\u5b9a\u7684\uff0cROS\u901a\u8fc7setup.bash\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff0cROS2\u5b89\u88c5\u8def\u5f84\u4e00\u822c\u8bbe\u7f6e\u4e3a\u6700\u4e0b\u5c42\u7684\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5373<\/p>\n<pre><code class=\"language-powershell\">$ source \/opt\/ros\/foxy\/setup.bash<\/code><\/pre>\n<p>&emsp;&emsp;\u8fd0\u884c\u65b0\u5efaworkspace\u7684package\u529f\u80fd\u5305\uff0c\u9700\u8981\u5728\u5bf9\u5de5\u4f5c\u7a7a\u95f4\u7f16\u8bd1\u540e\u7684\u65b0\u7ec8\u7aef\u4e2d\u914d\u7f6e\u5982\u4e0b<\/p>\n<pre><code class=\"language-powershell\"># \u8bbe\u7f6e\u5f53\u524d\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u529f\u80fd\u5305\u7684\u76f8\u5173\u73af\u5883\u53d8\u91cf\n$ . install\/local_setup.sh \n\n# \u8bbe\u7f6e\u5f53\u524d\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u529f\u80fd\u5305\u7684\u76f8\u5173\u73af\u5883\u53d8\u91cf\uff0c\u540c\u65f6\u8bbe\u7f6e\u8be5\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u5176\u4ed6\u5e95\u5c42\u5de5\u4f5c\u7a7a\u95f4\u7684\u73af\u5883\u53d8\u91cf\n$ . install\/setup.sh    # \u5c31\u662f\u8bf4\u8fd9\u4e00\u4e2a\u634e\u5e26\u7740\u628aROS2\u5b89\u88c5\u8def\u5f84\u7684\u73af\u5883\u53d8\u91cf\u4e5f\u8bbe\u7f6e\u4e86<\/code><\/pre>\n<h2>1.2 \u68c0\u67e5\u4f9d\u8d56<\/h2>\n<p>&emsp;&emsp;\u7f16\u8bd1\u524d\uff0c\u9700\u8981\u5bf9\u529f\u80fd\u5305\u68c0\u67e5\u4f9d\u8d56\u60c5\u51b5\u3002<\/p>\n<pre><code class=\"language-powershell\">$ rosdep install -i --from-path src --rosdistro foxy -y<\/code><\/pre>\n<h2>1.3 \u7f16\u8bd1\u5de5\u5177 colcon<\/h2>\n<pre><code class=\"language-powershell\"># \u5728workspace\u6839\u76ee\u5f55\u7f16\u8bd1\u5de5\u7a0b\n$ colcon build  \n\n# \u6709\u9009\u62e9\u5730\u7f16\u8bd1\u5305\n$ colcon build --packages-select &lt;package_name&gt;<\/code><\/pre>\n<p>&emsp;&emsp;\u6709\u5173\u7f16\u8bd1\uff0c\u53ef\u770b\u4e00\u4e0b\u540e\u7eed\u7684\u7cfb\u5217\u7b2c\u4e03\u7bc7\u2014\u2014<a href=\"https:\/\/blog.csdn.net\/fangfang12138\/article\/details\/112019046\">\u7f16\u8bd1<\/a>\u3002<\/p>\n<h1>2 \u7f16\u5199 package<\/h1>\n<p>&emsp;&emsp;\u6bcf\u4e00\u4e2apackage\u90fd\u80fd\u5b9e\u73b0\u4e00\u4e2a\u76f8\u5bf9\u5b8c\u6574\u7684\u529f\u80fd\u3002<\/p>\n<h2>2.1 \u529f\u80fd\u5305\u521b\u5efa<\/h2>\n<pre><code class=\"language-powershell\"># \u521b\u5efacmake\u529f\u80fd\u5305\uff08\u5728~\/ws\/src\u4e0b\uff09\n$ ros2 pkg create --build-type ament_cmake &lt;package_name&gt;\n\n# \u521b\u5efacmake\u529f\u80fd\u5305\uff08\u5728~\/ws\/src\u4e0b\uff09\n# --dependencies \u53c2\u6570\u4f1a\u5c06\u540e\u8fb9\u7684\u4f9d\u8d56\u81ea\u52a8\u6dfb\u52a0\u5230package.xml\u548cCMakeLists.txt\u4e2d\n$ ros2 pkg create --build-type ament_cmake &lt;package_name&gt; --dependencies &lt;depend_name&gt;\n\n# \u521b\u5efacmake\u529f\u80fd\u5305\uff08\u5728~\/ws\/src\u4e0b\uff09\n# --node-name \u53c2\u6570\u5c06\u521b\u5efa\u8282\u70b9\uff0c\u4f46\u53ea\u80fd\u521b\u5efa\u4e00\u4e2a\u8282\u70b9\uff0c\u6ce8\u610f\u53c2\u6570\u4f4d\u7f6e\n$ ros2 pkg create --build-type ament_cmake --node-name &lt;node_name&gt; &lt;package_name&gt;\n\n    # \u4f8b\u5982\uff08\u5728~\/ws\/src\u4e0b\uff09\n    $ ros2 pkg create --build-type ament_cmake --node-name my_node my_package --dependencies rclcpp\n    # \u5c06\u4f1a\u5728~\/ws\/src\u521b\u5efa\u5982\u4e0b\u76ee\u5f55\n    workspace_folder\/\n        src\/ \n            my_package\/ \n                 src\/\n                    my_node.cpp\n                 include\/\n                    my_package\/\n                 CMakeLists.txt\n                 package.xml<\/code><\/pre>\n<h2>2.2 package.xml \u548c CMakeLists.txt<\/h2>\n<p>&emsp;&emsp;\u4f7f\u7528ament\u7f16\u8bd1\u7cfb\u7edf\u7684\u529f\u80fd\u5305\u4f1a\u5bf9\u5e94\u751f\u6210\u4e24\u4e2a\u6587\u4ef6package.xml\u548cCMakeLists.txt\u3002<br \/>\n&emsp;&emsp;<strong>package.xml<\/strong>\uff1a\u63cf\u8ff0\u4e86\u529f\u80fd\u5305\u7684\u53d1\u884c\u4fe1\u606f\u3001\u4f9d\u8d56\u4fe1\u606f\u7b49\uff0c\u5185\u5bb9\u5982\u4e0b\u3002\u5728\u81ea\u52a8\u521b\u5efa\u540e\uff0c\u9700\u8981\u624b\u52a8\u4fee\u6539\u529f\u80fd\u5305\u63cf\u8ff0\u3001\u529f\u80fd\u5305\u7248\u672c\u3001\u529f\u80fd\u5305\u8bb8\u53ef\u8bc1\u4fe1\u606f\u7b49\u53d1\u884c\u4fe1\u606f\u3002\u4ee5\u201c _depend\u201d\u7ed3\u5c3e\u7684\u6807\u7b7e\u7528\u6765\u63cf\u8ff0\u529f\u80fd\u5305\u4f9d\u8d56\uff0c\u5728\u589e\u52a0\u65b0\u7684\u4f9d\u8d56\u65f6\uff0c\u9700\u8981\u6dfb\u52a0\u5230\u5176\u4e2d\u3002<\/p>\n<pre><code class=\"language-xml\">&lt;!--  \u529f\u80fd\u5305\u57fa\u7840\u5185\u5bb9\uff0c\u4e0d\u7528\u4fee\u6539   --&gt;\n&lt;?xml version=\"1.0\"?&gt;\n&lt;?xml-model href=\"http:\/\/download.ros.org\/schema\/package_format3.xsd\" schematypens=\"http:\/\/www.w3.org\/2001\/XMLSchema\"?&gt;\n&lt;!--  \u4e0b\u9762\u662f\u529f\u80fd\u5305\u7684\u4fe1\u606f  --&gt;\n&lt;package format=\"3\"&gt;\n    &lt;!--  \u5305\u540d\uff0c\u65b0\u5efa\u7684\u65f6\u5019\u5c31\u5b9a\u4e86\uff0c\u4e0d\u6539  --&gt;\n    &lt;name&gt;cpp_srvcli&lt;\/name&gt;\n    &lt;!--  \u5173\u4e8e\u53d1\u884c\u4fe1\u606f   --&gt;\n    &lt;version&gt;0.0.0&lt;\/version&gt;\n    &lt;description&gt;\u8fd9\u91cc\u5199\u529f\u80fd\u63cf\u8ff0&lt;\/description&gt;\n    &lt;maintainer email=\"\u8fd9\u91cc\u5199\u90ae\u7bb1\u5730\u5740\"&gt;Your Name&lt;\/maintainer&gt;\n    &lt;license&gt;\u8fd9\u91cc\u5199\u8bb8\u53ef\u8bc1&lt;\/license&gt;\n    &lt;!--  \u7f16\u8bd1\u7cfb\u7edf\u7684\u4f9d\u8d56   --&gt;\n    &lt;buildtool_depend&gt;ament_cmake&lt;\/buildtool_depend&gt;\n    &lt;!--  \u7a0b\u5e8f\u6240\u9700\u7684\u4f9d\u8d56\uff0c\u6839\u636e\u9700\u8981\u4fee\u6539\u6dfb\u52a0   --&gt;\n    &lt;depend&gt;rclcpp&lt;\/depend&gt;\n    &lt;!--  \u7f16\u8bd1\u7cfb\u7edf\uff0c\u65b0\u5efa\u529f\u80fd\u5305\u7684\u65f6\u5019\u53ef\u4ee5\u6307\u5b9a   --&gt;\n    &lt;export&gt;\n    &lt;build_type&gt;ament_cmake&lt;\/build_type&gt;\n    &lt;\/export&gt;\n&lt;\/package&gt;<\/code><\/pre>\n<p>&emsp;&emsp;<strong>CMakeLists.txt<\/strong>\uff1a\u5236\u5b9a\u5404\u6587\u4ef6\u6216\u5305\u7684\u7f16\u8bd1\u987a\u5e8f\u7684\u6587\u6863\uff0c\u5982\u4f55\u7f16\u5199CMakeLists.txt\u53c2\u89c1\u672c\u7cfb\u5217\u7b2c\u4e03\u7bc7\u2014\u2014<a href=\"https:\/\/blog.csdn.net\/fangfang12138\/article\/details\/112019046\">\u7f16\u8bd1<\/a>\u3002\u6587\u6863\u57fa\u672c\u7ed3\u6784\u5982\u4e0b\u3002<\/p>\n<pre><code class=\"language-cpp\">cmake_minimum_required(VERSION 3.5) \/\/cmake\u7248\u672c\u8981\u6c42\nproject(my_project)                 \/\/\u529f\u80fd\u5305\u540d\uff0c\u4e0e\u540c\u4e00\u529f\u80fd\u5305\u4e0bpackage.xml\u4e2d\u540d\u5b57\u4e00\u6837\n\nament_package()                     \/\/\u914d\u7f6eproject\uff0c\u53ea\u8c03\u7528\u4e00\u6b21\uff0c\u4e14\u5728\u6700\u540e<\/code><\/pre>\n<h2>2.3 \u529f\u80fd\u5305\u7f16\u8bd1\u3001\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u3001\u8fd0\u884c<\/h2>\n<pre><code class=\"language-powershell\"># \u8bb0\u5f97\u68c0\u67e5\u4f9d\u8d56\n$ rosdep install -i --from-path src --rosdistro foxy -y\n\n# \u7f16\u8bd1\uff0c\u89c1\u4e0a\u4e00\u5c0f\u8282\n$ colcon build\n\n# \u65b0\u7ec8\u7aef\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\n$ . install\/setup.bash\n\n# \u8fd0\u884c\u5305\u91cc\u7684\u67d0\u4e2a\u8282\u70b9\uff0c\u8fd0\u884c\u591a\u4e2a\u8282\u70b9\u3001\u591a\u4e2a\u5305\uff0c\u53ef\u4f7f\u7528launch\u6587\u4ef6\n$ ros2 run &lt;package_name&gt; &lt;node_name&gt;<\/code><\/pre>\n<h1>3 \u7f16\u5199 topic<\/h1>\n<p>\u65b0\u5efa\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5e76\u65b0\u5efa\u8bdd\u9898\u529f\u80fd\u5305\uff08\u8fd9\u91cc\u5305\u540d\u662fcpp_pubsub\uff09\u3002<\/p>\n<h2>3.1 \u53d1\u5e03 publisher<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/src\u76ee\u5f55\u4e0b\uff0c\u7f16\u5199\u8bdd\u9898\u53d1\u5e03\u8282\u70b9\uff0cpublisher_member_function.cpp<\/p>\n<pre><code class=\"language-cpp\">#include &lt;chrono&gt;           \/\/c++11\u65e5\u671f\u548c\u65f6\u95f4\u5e93       \n#include &lt;functional&gt;       \/\/\u53c2\u89c1 \u6ce81\n#include &lt;memory&gt;           \/\/c++\u5185\u5b58\u7ba1\u7406\u5e93\uff0c\u4f7f\u7528\u667a\u80fd\u6307\u9488\u5fc5\u987b\u5305\u542b\u6b64\u5934\u6587\u4ef6\n#include &lt;string&gt;\n\n#include \"rclcpp\/rclcpp.hpp\"    \/\/ROS2\uff0cC++\u63a5\u53e3\u7684\u5934\u6587\u4ef6\n#include \"std_msgs\/msg\/string.hpp\"  \/\/string\u7c7b\u578b\u7684msg\u5934\u6587\u4ef6\n\nusing namespace std::chrono_literals;\n\n\/* This example creates a subclass of Node and uses std::bind() to register a\n* member function as a callback from the timer. *\/\n\n\/\/\u5b9a\u4e49\u4e00\u4e2a\u8282\u70b9\u7c7b\u7684\u5b50\u7c7b\nclass MinimalPublisher : public rclcpp::Node\n{\n  public:\n        \/\/\u6784\u9020\u51fd\u6570\uff1a\u521d\u59cb\u5316\u8282\u70b9\u540d minimal_publisher\uff0c\u7136\u540e\u521b\u5efa\u4e86\u4e00\u4e2apublisher\u548c\u5b9a\u65f6\u5668\n        MinimalPublisher(): Node(\"minimal_publisher\"), count_(0)\n        {\n            \/\/\u521b\u5efa\u4e00\u4e2a\u53d1\u5e03\u8005\uff0c\u53d1\u5e03\u7684\u8bdd\u9898\u540d\u4e3atopic\uff0c\u8bdd\u9898\u6d88\u606f\u662fString\uff0c\u4fdd\u5b58\u6d88\u606f\u7684\u961f\u5217\u957f\u5ea6\u662f10\n            publisher_ = this-&gt;create_publisher&lt;std_msgs::msg::String&gt;(\"topic\", 10);\n            \/\/\u521b\u5efa\u4e00\u4e2a\u5b9a\u65f6\u5668\uff0c\u5b9a\u65f6500ms\uff0c\u5b9a\u65f6\u89e6\u53d1\u56de\u8c03\u51fd\u6570timer_callback\u3002\n            \/\/\u8fd9\u91cc\u7528\u5230\u4e86&lt;functional&gt;\u7684\u4e00\u4e2a\u7279\u6027\n            timer_ = this-&gt;create_wall_timer(500ms, std::bind(&amp;MinimalPublisher::timer_callback, this));\n        }\n\n  private:\n        \/\/\u5b9a\u65f6\u89e6\u53d1\u56de\u8c03\u51fd\u6570\n        void timer_callback()\n        {\n            \/\/\u5b9a\u4e49\u6d88\u606f\n            auto message = std_msgs::msg::String();\n            message.data = \"Hello, world! \" + std::to_string(count_++);\n            \/\/\u6253\u5370\u65e5\u5fd7\n            RCLCPP_INFO(this-&gt;get_logger(), \"Publishing: '%s'\", message.data.c_str());\n            \/\/\u53d1\u5e03\n            publisher_-&gt;publish(message);\n        }\n\n        \/\/\u5b9a\u4e49\u5b9a\u65f6\u5668\u548c\u53d1\u5e03\u8005\u6307\u9488\n        rclcpp::TimerBase::SharedPtr timer_;\n        rclcpp::Publisher&lt;std_msgs::msg::String&gt;::SharedPtr publisher_;\n\n        size_t count_;\n  };\n\n  int main(int argc, char * argv[])\n  {\n        rclcpp::init(argc, argv);\n        rclcpp::spin(std::make_shared&lt;MinimalPublisher&gt;());\n        rclcpp::shutdown();\n        return 0;\n  }<\/code><\/pre>\n<p>\u6ce8\uff1a<br \/>\n1\u3001#include &lt; functional &gt; \uff0c\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u770b\u4e0b<a href=\"https:\/\/www.cnblogs.com\/denggelin\/p\/5651456.html\">\u8fd9\u7bc7\u535a\u5ba2<\/a>\uff0c\u5199\u7684\u86ee\u4e0d\u9519\u7684\u3002<\/p>\n<h2>3.2 \u8ba2\u9605 subscriber<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/src\u76ee\u5f55\u4e0b\uff0c\u7f16\u5199\u8bdd\u9898\u8ba2\u9605\u8282\u70b9\uff0csubscriber_member_function.cpp<\/p>\n<pre><code class=\"language-cpp\">#include &lt;memory&gt;\n\n#include \"rclcpp\/rclcpp.hpp\"\n#include \"std_msgs\/msg\/string.hpp\"\nusing std::placeholders::_1;\n\nclass MinimalSubscriber : public rclcpp::Node\n{\npublic:\n    MinimalSubscriber() : Node(\"minimal_subscriber\")\n    {\n      subscription_ = this-&gt;create_subscription&lt;std_msgs::msg::String&gt;(\n      \"topic\", 10, std::bind(&amp;MinimalSubscriber::topic_callback, this, _1));\n    }\n\nprivate:\n    void topic_callback(const std_msgs::msg::String::SharedPtr msg) const\n    {\n      RCLCPP_INFO(this-&gt;get_logger(), \"I heard: '%s'\", msg-&gt;data.c_str());\n    }\n    rclcpp::Subscription&lt;std_msgs::msg::String&gt;::SharedPtr subscription_;\n};\n\nint main(int argc, char * argv[])\n{\n  rclcpp::init(argc, argv);\n  rclcpp::spin(std::make_shared&lt;MinimalSubscriber&gt;());\n  rclcpp::shutdown();\n  return 0;\n}<\/code><\/pre>\n<h2>3.3 \u4fee\u6539 package.xml \/ CMakeLists.txt<\/h2>\n<p>&emsp;&emsp;package.xml \u6dfb\u52a0\u5982\u4e0b\u4f9d\u8d56\uff0c\u5982\u679c\u521b\u5efa\u5305\u65f6\uff0c\u4f7f\u7528\u4e86&#8211;dependencies\uff0c\u5219\u6587\u4ef6\u5185\u5df2\u6709\u5982\u4e0b\u8bed\u53e5\u3002<\/p>\n<pre><code class=\"language-xml\">    &lt;depend&gt;rclcpp&lt;\/depend&gt;\n    &lt;depend&gt;std_msgs&lt;\/depend&gt;<\/code><\/pre>\n<p>&emsp;&emsp;CMakeLists.txt \u6dfb\u52a0\u5982\u4e0b\u7f16\u8bd1\u89c4\u5219\uff0c\u5982\u679c\u521b\u5efa\u5305\u65f6\uff0c\u4f7f\u7528\u4e86&#8211;dependencies\uff0c\u5219\u6587\u4ef6\u5185\u5df2\u6709find_package\u76f8\u5173\u7684\u8bed\u53e5\u3002<\/p>\n<pre><code class=\"language-bash\"># \u641c\u7d22\u4f9d\u8d56\n    find_package(rclcpp REQUIRED)\n    find_package(std_msgs REQUIRED)\n# \u521b\u5efa\u53ef\u6267\u884c\u7a0b\u5e8ftalker\uff0c\u540e\u7eed\u53c2\u6570\u662f\u6784\u6210\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6240\u6709\u6e90\u6587\u4ef6\n    add_executable(talker src\/publisher_member_function.cpp)\n# \u94fe\u63a5find_package()\u627e\u5230\u7684\u5305\n    ament_target_dependencies(talker rclcpp std_msgs)\n\n    add_executable(listener src\/subscriber_member_function.cpp)\n    ament_target_dependencies(listener rclcpp std_msgs)\n\n    install(TARGETS\n      talker\n      listener\n      DESTINATION\n      lib\/${PROJECT_NAME})<\/code><\/pre>\n<h2>3.4 \u7f16\u8bd1\u3001\u8fd0\u884c\u4e24\u4e2a\u8282\u70b9<\/h2>\n<pre><code class=\"language-powershell\"># \u5728\u5de5\u4f5c\u7a7a\u95f4\u6839\u76ee\u5f55\u4e0b\uff0c\u68c0\u67e5\u4f9d\u8d56\n$ rosdep install -i --from-path src --rosdistro foxy -y\n# \u7f16\u8bd1\n$ colcon build\n\n# \u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff0c\u7136\u540e\u8fd0\u884c\n$ . install\/setup.bash\n$ ros2 run cpp_pubsub talker\n\n# \u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\uff0c\u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff0c\u8fd0\u884c\n$ . install\/setup.bash\n$ ros2 run cpp_pubsub listener<\/code><\/pre>\n<h1>4 \u7f16\u5199 service<\/h1>\n<p>\u65b0\u5efa\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5e76\u65b0\u5efa\u670d\u52a1\u529f\u80fd\u5305\uff08\u8fd9\u91cc\u5305\u540d\u662fcpp_srvcli\uff09\u3002<\/p>\n<h2>4.1 \u670d\u52a1\u5668\u7aef server<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/src\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u670d\u52a1\u5668\u7aef\u8282\u70b9\uff0cadd_two_ints_server.cpp<\/p>\n<pre><code class=\"language-cpp\">#include \"example_interfaces\/srv\/add_two_ints.hpp\"\n#include \"rclcpp\/rclcpp.hpp\"\n#include &lt;memory&gt;\n\nvoid add(const std::shared_ptr&lt;example_interfaces::srv::AddTwoInts::Request&gt; request,\n      std::shared_ptr&lt;example_interfaces::srv::AddTwoInts::Response&gt;      response)\n{\n    response-&gt;sum = request-&gt;a + request-&gt;b;\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Incoming request\\na: %ld\" \" b: %ld\",\n            request-&gt;a, request-&gt;b);\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"sending back response: [%ld]\", (long int)response-&gt;sum);\n}\n\nint main(int argc, char **argv)\n{\n    rclcpp::init(argc, argv);\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints_server\u7684\u8282\u70b9\n    std::shared_ptr&lt;rclcpp::Node&gt; node = rclcpp::Node::make_shared(\"add_two_ints_server\");\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints\u7684\u670d\u52a1\uff0c\u7ed1\u5b9a\u56de\u8c03\u51fd\u6570add\n    rclcpp::Service&lt;example_interfaces::srv::AddTwoInts&gt;::SharedPtr service =\n    node-&gt;create_service&lt;example_interfaces::srv::AddTwoInts&gt;(\"add_two_ints\", &amp;add);\n\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Ready to add two ints.\");\n\n    \/\/\u5165\u9501\uff0c\u7b49\u5f85\u5ba2\u6237\u7aef\u8bf7\u6c42\n    rclcpp::spin(node);\n    rclcpp::shutdown();\n}\n<\/code><\/pre>\n<h2>4.2 \u5ba2\u6237\u7aef client<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/src\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u5ba2\u6237\u7aef\u8282\u70b9\uff0cadd_two_ints_client.cpp<\/p>\n<pre><code class=\"language-cpp\">#include \"rclcpp\/rclcpp.hpp\"\n#include \"example_interfaces\/srv\/add_two_ints.hpp\"\n\n#include &lt;chrono&gt;\n#include &lt;cstdlib&gt;\n#include &lt;memory&gt;\n\nusing namespace std::chrono_literals;\n\nint main(int argc, char **argv)\n{\n    rclcpp::init(argc, argv);\n\n    if (argc != 3) \n    {\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"usage: add_two_ints_client X Y\");\n        return 1;\n    }\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints_client\u7684\u8282\u70b9\n    std::shared_ptr&lt;rclcpp::Node&gt; node = rclcpp::Node::make_shared(\"add_two_ints_client\");\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints\u7684\u5ba2\u6237\u7aef\n    rclcpp::Client&lt;example_interfaces::srv::AddTwoInts&gt;::SharedPtr client =\n    node-&gt;create_client&lt;example_interfaces::srv::AddTwoInts&gt;(\"add_two_ints\");\n\n    \/\/\u91c7\u96c6request\u6570\u636e\n    auto request = std::make_shared&lt;example_interfaces::srv::AddTwoInts::Request&gt;();\n    request-&gt;a = atoll(argv[1]);\n    request-&gt;b = atoll(argv[2]);\n\n    \/\/search for service\n    while (!client-&gt;wait_for_service(1s)) \n    {\n        if (!rclcpp::ok()) \n        {\n            RCLCPP_ERROR(rclcpp::get_logger(\"rclcpp\"), \"Interrupted while waiting for the service. Exiting.\");\n            return 0;\n        }\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"service not available, waiting again...\");\n    }\n\n    \/\/\u53d1\u9001request\n    auto result = client-&gt;async_send_request(request);\n\n    \/\/ Wait for the result.\n    if (rclcpp::spin_until_future_complete(node, result) == rclcpp::FutureReturnCode::SUCCESS)\n    {\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Sum: %ld\", result.get()-&gt;sum);\n    } \n    else \n    {\n        RCLCPP_ERROR(rclcpp::get_logger(\"rclcpp\"), \"Failed to call service add_two_ints\");\n    }\n\n    rclcpp::shutdown();\n    return 0;\n}<\/code><\/pre>\n<h2>4.3 \u4fee\u6539 package.xml \/ CMakeLists.txt<\/h2>\n<p>&emsp;&emsp;package.xml \u6dfb\u52a0\u5982\u4e0b\u4f9d\u8d56\uff0c\u5982\u679c\u521b\u5efa\u5305\u65f6\uff0c\u4f7f\u7528\u4e86&#8211;dependencies\uff0c\u5219\u6587\u4ef6\u5185\u5df2\u6709\u5982\u4e0b\u8bed\u53e5\u3002<\/p>\n<pre><code class=\"language-xml\">    &lt;depend&gt;rclcpp&lt;\/depend&gt;\n    &lt;depend&gt;example_interfaces&lt;\/depend&gt;<\/code><\/pre>\n<p>&emsp;&emsp;CMakeLists.txt \u6dfb\u52a0\u5982\u4e0b\u7f16\u8bd1\u89c4\u5219\uff0c\u5982\u679c\u521b\u5efa\u5305\u65f6\uff0c\u4f7f\u7528\u4e86&#8211;dependencies\uff0c\u5219\u6587\u4ef6\u5185\u5df2\u6709find_package\u76f8\u5173\u7684\u8bed\u53e5\u3002<\/p>\n<pre><code class=\"language-bash\"># \u641c\u7d22\u4f9d\u8d56\n    find_package(rclcpp REQUIRED)\n    find_package(example_interfaces REQUIRED)\n# \u521b\u5efa\u53ef\u6267\u884c\u7a0b\u5e8fserver\uff0c\u540e\u7eed\u53c2\u6570\u662f\u6784\u6210\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6240\u6709\u6e90\u6587\u4ef6\n    add_executable(server src\/add_two_ints_server.cpp)\n# \u94fe\u63a5find_package()\u627e\u5230\u7684\u5305\n    ament_target_dependencies(server rclcpp example_interfaces)\n\n    add_executable(client src\/add_two_ints_client.cpp)\n    ament_target_dependencies(client rclcpp example_interfaces)\n\n    install(TARGETS\n              server\n              client\n              DESTINATION lib\/${PROJECT_NAME})<\/code><\/pre>\n<h2>4.4 \u7f16\u8bd1\u3001\u8fd0\u884c\u4e24\u4e2a\u8282\u70b9<\/h2>\n<pre><code class=\"language-powershell\"># \u5728\u5de5\u4f5c\u7a7a\u95f4\u6839\u76ee\u5f55\u4e0b\uff0c\u68c0\u67e5\u4f9d\u8d56\n$ rosdep install -i --from-path src --rosdistro foxy -y\n# \u7f16\u8bd1\n$ colcon build\n\n# \u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff0c\u7136\u540e\u8fd0\u884c\n$ . install\/setup.bash\n$ ros2 run cpp_srvcli server\n\n# \u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\uff0c\u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff0c\u8fd0\u884c\n$ . install\/setup.bash\n$ ros2 run cpp_srvcli client 2 3<\/code><\/pre>\n<h1>5 \u81ea\u5b9a\u4e49\u6d88\u606f msg\/srv<\/h1>\n<h2>5.1 \u521b\u5efa\u6d88\u606f\u529f\u80fd\u5305<\/h2>\n<p>1\u3001\u65b0\u5efa\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5e76\u65b0\u5efa\u6d88\u606f\u529f\u80fd\u5305\uff08\u8fd9\u91cc\u5305\u540d\u662ftutorial_interfaces\uff09\u3002\u5728<strong>\u6d88\u606f\u529f\u80fd\u5305<\/strong>\u4e0b\uff0c\u521b\u5efa\/msg\u548c\/srv\u6587\u4ef6\u5939\uff08\u4e0e\/src\u540c\u7ea7\uff09\uff0c\u5e76\u5728\u5176\u4e2d\u5206\u522b\u5efa\u7acb.msg\u548c.srv\u6587\u4ef6\uff0c\u6709\u5173\u6d88\u606f\u5185\u5bb9\uff0c\u8be6\u89c1\u672c\u7cfb\u5217\u7b2c\u4e09\u7bc7<a href=\"https:\/\/blog.csdn.net\/fangfang12138\/article\/details\/111593629\">\u300aROS2_Foxy\u5b66\u4e60\uff08\u4e09\uff09\u6838\u5fc3\u6982\u5ff5\u300b<\/a>\u3002<\/p>\n<p><strong>Num.msg<\/strong><\/p>\n<pre><code class=\"language-cpp\">int64 num<\/code><\/pre>\n<p><strong>AddThreeInts.srv<\/strong><\/p>\n<pre><code class=\"language-cpp\">int64 a\nint64 b\nint64 c\n---\nint64 sum<\/code><\/pre>\n<p>2\u3001\u5728package.xml\u6587\u4ef6\u4e2d\u6dfb\u52a0<\/p>\n<pre><code class=\"language-xml\">    &lt;build_depend&gt;rosidl_default_generators&lt;\/build_depend&gt;\n    &lt;exec_depend&gt;rosidl_default_runtime&lt;\/exec_depend&gt;\n    &lt;member_of_group&gt;rosidl_interface_packages&lt;\/member_of_group&gt;<\/code><\/pre>\n<p>\u6ce8\uff1arosidl_default_generators\u4e3a\u7f16\u8bd1\u4f9d\u8d56\uff0crosidl_default_runtime\u4e3a\u8fd0\u884c\u4f9d\u8d56\u3002<br \/>\n3\u3001\u5728CMakeLists.txt\u6587\u4ef6\u4e2d\u6dfb\u52a0<\/p>\n<pre><code class=\"language-bash\">find_package(rosidl_default_generators REQUIRED)\n\n# You can use set to neatly list all of your interfaces:\nset(msg_files\n  \"msg\/Num.msg\"\n  \"msg\/Message1.msg\"\n  \"msg\/Message2.msg\"\n  # etc\n  )\n\nset(srv_files\n  \"srv\/AddThreeInts.srv\"\n  \"srv\/Service1.srv\"\n  \"srv\/Service2.srv\"\n   # etc\n  )\n\n#And generate all lists at once like so:\nrosidl_generate_interfaces(${PROJECT_NAME}\n  ${msg_files}\n  ${srv_files}\n)\n\nament_export_dependencies(rosidl_default_runtime)<\/code><\/pre>\n<p>\u6ce8\uff1a\u53ef\u4ee5\u7701\u7565set\u7684\u6b65\u9aa4\uff0c\u5728rosidl_generate_interfaces\u76f4\u63a5\u6dfb\u52a0\uff0c\u5982\u4e0b\uff0c\u4f46\u4e0d\u5efa\u8bae\uff0c\u8fd8\u662f\u9700\u8981\u4e00\u4e2a\u826f\u597d\u7684\u7f16\u7a0b\u4e60\u60ef\u3002<\/p>\n<pre><code class=\"language-bash\">rosidl_generate_interfaces(${PROJECT_NAME}\n  \"msg\/Num.msg\"\n  \"srv\/AddThreeInts.srv\"\n)<\/code><\/pre>\n<h2>5.2 \u6d4b\u8bd5\u81ea\u5b9a\u4e49\u6d88\u606f\u63a5\u53e3<\/h2>\n<p>&emsp;&emsp;\u529f\u80fd\u5305\u7f16\u8bd1\u540e\uff08\u6ca1\u6709\u8282\u70b9\uff0c\u6ca1\u6709\u8fd0\u884c\uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4ros2 interface show\u6765\u67e5\u770b\u6d88\u606f\u6587\u4ef6\u3002<\/p>\n<h2>5.3 \u5e94\u7528\u81ea\u5b9a\u4e49\u6d88\u606f\u63a5\u53e3<\/h2>\n<p>&emsp;&emsp;\u5728\u540c\u4e00\u4e2a\u5de5\u4f5c\u7a7a\u95f4\u4e0b\uff0c\u9664\u6d88\u606f\u529f\u80fd\u5305\u5916\uff0c\u518d\u521b\u5efa\u4e24\u4e2a\u529f\u80fd\u5305\uff0c\u5206\u522b\u662f\u8bdd\u9898\u529f\u80fd\u5305\u548c\u670d\u52a1\u529f\u80fd\u5305\uff0c\u53c2\u80033\u30014\u90e8\u5206\u3002<\/p>\n<p>1\u3001CMakeLists.txt\u548cpackage.xml\u4e0e\u7b2c3\u30014\u90e8\u5206\u57fa\u672c\u4e00\u81f4\uff0c\u5176\u4e2d\uff0c\u9700\u8981\u5c06\u6d88\u606f\u4f9d\u8d56\u5305\uff08std_msgs\u548cexample_interfaces\uff09\u66ff\u6362\u6210\u65b0\u5efa\u7684\u6d88\u606f\u529f\u80fd\u5305\u540d\uff0c\u5982tutorial_interfaces\u3002<br \/>\n2\u3001\u5404\u8282\u70b9src\u6587\u4ef6\uff0c\u9700\u8981\u5c06\u6d88\u606f\u7c7b\u578b\u8fdb\u884c\u66ff\u6362\uff0csrc\u6587\u4ef6\u4fee\u6539\u89c1\u9644\u4ef61\u3002<br \/>\n3\u3001\u4e4b\u540e\uff0c\u7f16\u8bd1\u8fd0\u884c\uff08\u67e5\u4f9d\u8d56\u3001\u7f16\u8bd1\u5305\u3001\u914d\u7f6e\u73af\u5883\u3001\u8fd0\u884c\u8282\u70b9\uff09\u3002<\/p>\n<h2>5.4 \u4f7f\u7528\u540c\u4e00\u529f\u80fd\u5305\u7684\u6d88\u606f\u63a5\u53e3<\/h2>\n<p>&emsp;&emsp;\u82e5\u529f\u80fd\u5305\u9700\u8981\u4f7f\u7528\u81ea\u5df1\u5b9a\u4e49\u7684\u63a5\u53e3\uff0c\u9700\u8981\u5728CMakeLists.txt\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff08In order to use the messages generated in the same package.\uff09\u3002<\/p>\n<pre><code class=\"language-bash\">rosidl_target_interfaces(publish_address_book\n  ${PROJECT_NAME} \"rosidl_typesupport_cpp\")<\/code><\/pre>\n<p>\u6ce8\uff1apublish_address_book\u662f\u7f16\u8bd1\u751f\u6210\u7684\u53ef\u6267\u884c\u7a0b\u5e8f\u540d\u3002<\/p>\n<h1>6 \u4f7f\u7528 parameter<\/h1>\n<p>\u65b0\u5efa\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5e76\u65b0\u5efa\u53c2\u6570\u529f\u80fd\u5305\uff08\u8fd9\u91cc\u5305\u540d\u662fcpp_parameters\uff09\uff0c\u4f7f\u7528\u53c2\u6570dependencies\uff0c\u81ea\u52a8\u6dfb\u52a0\u4f9d\u8d56rclcpp\u3002<\/p>\n<h2>6.1 \u53c2\u6570\u7684\u58f0\u660e\u4e0e\u83b7\u53d6<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/src\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u8282\u70b9\uff0ccpp_parameters_node.cpp<\/p>\n<pre><code class=\"language-cpp\">#include &lt;rclcpp\/rclcpp.hpp&gt;\n#include &lt;chrono&gt;\n#include &lt;string&gt;\n#include &lt;functional&gt;\n\nusing namespace std::chrono_literals;\n\nclass ParametersClass: public rclcpp::Node\n{\n  public:\n    ParametersClass() : Node(\"parameter_node\")\n    {\n      \/\/\u58f0\u660e\uff1a\u5b9a\u4e49\u53c2\u6570\u540d\u53ca\u5176\u503c\n      this-&gt;declare_parameter&lt;std::string&gt;(\"my_parameter\", \"world\");\n      \/\/\n      timer_ = this-&gt;create_wall_timer(1000ms, std::bind(&amp;ParametersClass::respond, this));\n    }\n\n    \/\/\u83b7\u53d6\uff1a\u5b9a\u65f6\u6253\u5370\u53c2\u6570\u503c\n    void respond()\n    {\n      this-&gt;get_parameter(\"my_parameter\", parameter_string_);\n      RCLCPP_INFO(this-&gt;get_logger(), \"Hello %s\", parameter_string_.c_str());\n    }\n\n  private:\n    std::string parameter_string_;\n    rclcpp::TimerBase::SharedPtr timer_;\n};\n\nint main(int argc, char** argv)\n{\n  rclcpp::init(argc, argv);\n  rclcpp::spin(std::make_shared&lt;ParametersClass&gt;());\n  rclcpp::shutdown();\n  return 0;\n}<\/code><\/pre>\n<p>\u4fee\u6539CMakelists.txt\uff0c\u7136\u540e\u7f16\u8bd1\u8fd0\u884c\u3002<\/p>\n<pre><code class=\"language-bash\">add_executable(parameter_node src\/cpp_parameters_node.cpp)\nament_target_dependencies(parameter_node rclcpp)\n\ninstall(TARGETS\n  parameter_node\n  DESTINATION lib\/${PROJECT_NAME}\n)<\/code><\/pre>\n<h2>6.2 \u7ec8\u7aef\u4fee\u6539\u53c2\u6570<\/h2>\n<p>\u6709\u5173\u5185\u5bb9\uff0c\u8be6\u89c1\u672c\u7cfb\u5217\u7b2c\u4e09\u7bc7<a href=\"https:\/\/blog.csdn.net\/fangfang12138\/article\/details\/111593629\">\u300aROS2_Foxy\u5b66\u4e60\uff08\u4e09\uff09\u6838\u5fc3\u6982\u5ff5\u300b<\/a><\/p>\n<pre><code class=\"language-powershell\">$ ros2 param list\n$ ros2 param set &lt;node_name&gt; &lt;parameter_name&gt; &lt;value&gt;<\/code><\/pre>\n<h2>6.3 launch\u6587\u4ef6\u4fee\u6539\u53c2\u6570<\/h2>\n<p>\u5728\u529f\u80fd\u5305\u7684\/launch\u76ee\u5f55\u4e0b\uff0c\u521b\u5efalaunch\u6587\u4ef6\uff0ccpp_parameters_launch.py\uff0c\u4fee\u6539parameters\u3002<\/p>\n<pre><code class=\"language-python\">from launch import LaunchDescription\nfrom launch_ros.actions import Node\n\ndef generate_launch_description():\n    return LaunchDescription([\n        Node(\n            package=\"cpp_parameters\",\n            executable=\"parameter_node\",\n            name=\"custom_parameter_node\",\n            output=\"screen\",\n            emulate_tty=True,\n            parameters=[\n                {\"my_parameter\": \"earth\"}\n            ]\n        )\n    ])<\/code><\/pre>\n<p>\u4fee\u6539CMakelists.txt\uff0c\u57286.1\u90e8\u5206\u4e2dCMakelists.txt\u6700\u540e\u589e\u52a0\u4ee5\u4e0b\u90e8\u5206\u3002<\/p>\n<pre><code class=\"language-bash\">install(\n  DIRECTORY launch\n  DESTINATION share\/${PROJECT_NAME}\n)<\/code><\/pre>\n<p>\u7f16\u8bd1\uff0c\u7136\u540e\u8fd0\u884claunch\u6587\u4ef6\u3002<\/p>\n<pre><code class=\"language-powershell\">$ ros2 launch cpp_parameters cpp_parameters_launch.py<\/code><\/pre>\n<h1>\u9644\u4ef61 \u6d88\u606f\u6587\u4ef6\u5e94\u7528<\/h1>\n<p>1\u3001\u8bdd\u9898\u529f\u80fd\u5305\u2014\u2014\u6d88\u606f\u53d1\u5e03\u8282\u70b9\u2014\u2014publisher_member_function.cpp<\/p>\n<pre><code class=\"language-cpp\">#include &lt;chrono&gt;\n#include &lt;functional&gt;\n#include &lt;memory&gt;\n#include &lt;string&gt;\n\n#include \"rclcpp\/rclcpp.hpp\"\n#include \"tutorial_interfaces\/msg\/num.hpp\"\n\nusing namespace std::chrono_literals;\n\n\/* This example creates a subclass of Node and uses std::bind() to register a* member function as a callback from the timer. *\/\n\nclass MinimalPublisher : public rclcpp::Node\n{\npublic:\n    MinimalPublisher(): Node(\"minimal_publisher\"), count_(0)\n    {\n      publisher_ = this-&gt;create_publisher&lt;tutorial_interfaces::msg::Num&gt;(\"topic\", 10); \/\/10 \u662f\u6d88\u606f\u961f\u5217\u957f\u5ea6\n      timer_ = this-&gt;create_wall_timer(500ms,std::bind(&amp;MinimalPublisher::timer_callback, this));\n    }\n\nprivate:\n    void timer_callback()\n    {\n      auto message = tutorial_interfaces::msg::Num();\n      message.num = this-&gt;count_++;\n      RCLCPP_INFO(this-&gt;get_logger(), \"Publishing: '%d'\", message.num);\n      publisher_-&gt;publish(message);\n    }\n\n    rclcpp::TimerBase::SharedPtr timer_;\n\n    rclcpp::Publisher&lt;tutorial_interfaces::msg::Num&gt;::SharedPtr publisher_;\n\n    size_t count_;\n};\n\nint main(int argc, char * argv[])\n{\n    rclcpp::init(argc, argv);\n    rclcpp::spin(std::make_shared&lt;MinimalPublisher&gt;());\n    rclcpp::shutdown();\n    return 0;\n}<\/code><\/pre>\n<p>2\u3001\u8bdd\u9898\u529f\u80fd\u5305\u2014\u2014\u6d88\u606f\u8ba2\u9605\u8282\u70b9\u2014\u2014subscriber_member_function.cpp<\/p>\n<pre><code class=\"language-cpp\">#include &lt;memory&gt;\n#include \"rclcpp\/rclcpp.hpp\"\n#include \"tutorial_interfaces\/msg\/num.hpp\"\n\nusing std::placeholders::_1;\n\nclass MinimalSubscriber : public rclcpp::Node\n{\npublic:\n    MinimalSubscriber(): Node(\"minimal_subscriber\")\n    {\n      subscription_ = this-&gt;create_subscription&lt;tutorial_interfaces::msg::Num&gt;(\"topic\", 10, std::bind(&amp;MinimalSubscriber::topic_callback, this, _1));\n    }\n\nprivate:\n    void topic_callback(const tutorial_interfaces::msg::Num::SharedPtr msg) const\n    {\n      RCLCPP_INFO(this-&gt;get_logger(), \"I heard: '%d'\", msg-&gt;num);\n    }\n    rclcpp::Subscription&lt;tutorial_interfaces::msg::Num&gt;::SharedPtr subscription_;};\n\nint main(int argc, char * argv[])\n{\n    rclcpp::init(argc, argv);\n    rclcpp::spin(std::make_shared&lt;MinimalSubscriber&gt;());\n    rclcpp::shutdown();\n    return 0;\n}<\/code><\/pre>\n<p>3\u3001\u670d\u52a1\u529f\u80fd\u5305\u2014\u2014\u670d\u52a1\u5668\u7aef\u8282\u70b9\u2014\u2014add_three_ints_server.cpp<\/p>\n<pre><code class=\"language-cpp\">#include \"tutorial_interfaces\/srv\/add_three_ints.hpp\"\n#include \"rclcpp\/rclcpp.hpp\"\n#include &lt;memory&gt;\n\nvoid add(const std::shared_ptr&lt;tutorial_interfaces::srv::AddThreeInts::Request&gt; request,\n      std::shared_ptr&lt;tutorial_interfaces::srv::AddThreeInts::Response&gt;      response)\n{\n    response-&gt;sum = request-&gt;a + request-&gt;b + request-&gt;c;\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Incoming request\\na: %ld\" \" b: %ld\" \" c: %ld\",\n            request-&gt;a, request-&gt;b, request-&gt;b);\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"sending back response: [%ld]\", (long int)response-&gt;sum);\n}\n\nint main(int argc, char **argv)\n{\n    rclcpp::init(argc, argv);\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints_server\u7684\u8282\u70b9\n    std::shared_ptr&lt;rclcpp::Node&gt; node = rclcpp::Node::make_shared(\"add_three_ints_server\");\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_two_ints\u7684\u670d\u52a1\uff0c\u7ed1\u5b9a\u56de\u8c03\u51fd\u6570add\n    rclcpp::Service&lt;tutorial_interfaces::srv::AddThreeInts&gt;::SharedPtr service =\n    node-&gt;create_service&lt;tutorial_interfaces::srv::AddThreeInts&gt;(\"add_three_ints\", &amp;add);\n\n    RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Ready to add three ints.\");\n\n    \/\/\u5165\u9501\uff0c\u7b49\u5f85\u5ba2\u6237\u7aef\u8bf7\u6c42\n    rclcpp::spin(node);\n    rclcpp::shutdown();\n}<\/code><\/pre>\n<p>4\u3001\u670d\u52a1\u529f\u80fd\u5305\u2014\u2014\u5ba2\u6237\u7aef\u8282\u70b9\u2014\u2014add_three_ints_client.cpp<\/p>\n<pre><code class=\"language-cpp\">#include \"rclcpp\/rclcpp.hpp\"\n#include \"tutorial_interfaces\/srv\/add_three_ints.hpp\"\n\n#include &lt;chrono&gt;\n#include &lt;cstdlib&gt;\n#include &lt;memory&gt;\n\nusing namespace std::chrono_literals;\n\nint main(int argc, char **argv)\n{\n    rclcpp::init(argc, argv);\n\n    if (argc != 4) \n    {\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"usage: add_two_ints_client X Y Z\");\n        return 1;\n    }\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_three_ints_client\u7684\u8282\u70b9\n    std::shared_ptr&lt;rclcpp::Node&gt; node = rclcpp::Node::make_shared(\"add_three_ints_client\");\n\n    \/\/\u521b\u5efa\u540d\u4e3aadd_three_ints\u7684\u5ba2\u6237\u7aef\n    rclcpp::Client&lt;tutorial_interfaces::srv::AddThreeInts&gt;::SharedPtr client =\n    node-&gt;create_client&lt;tutorial_interfaces::srv::AddThreeInts&gt;(\"add_three_ints\");\n\n    \/\/\u91c7\u96c6request\u6570\u636e\n    auto request = std::make_shared&lt;tutorial_interfaces::srv::AddThreeInts::Request&gt;();\n    request-&gt;a = atoll(argv[1]);\n    request-&gt;b = atoll(argv[2]);\n    request-&gt;c = atoll(argv[3]);\n\n    \/\/search for service\n    while (!client-&gt;wait_for_service(1s)) \n    {\n        if (!rclcpp::ok()) \n        {\n            RCLCPP_ERROR(rclcpp::get_logger(\"rclcpp\"), \"Interrupted while waiting for the service. Exiting.\");\n            return 0;\n        }\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"service not available, waiting again...\");\n    }\n\n    \/\/\u53d1\u9001request\n    auto result = client-&gt;async_send_request(request);\n\n    \/\/ Wait for the result.\n    if (rclcpp::spin_until_future_complete(node, result) == rclcpp::FutureReturnCode::SUCCESS)\n    {\n        RCLCPP_INFO(rclcpp::get_logger(\"rclcpp\"), \"Sum: %ld\", result.get()-&gt;sum);\n    } \n    else \n    {\n        RCLCPP_ERROR(rclcpp::get_logger(\"rclcpp\"), \"Failed to call service add_three_ints\");\n    }\n\n    rclcpp::shutdown();\n    return 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u91cc\u9762\u7684\u4f8b\u5b50\u53c2\u8003\u5b98\u65b9\u6559\u7a0b\uff0c\u7136\u540e\u9644\u5e26\u4e00\u4e9b\u89e3\u91ca\u548c\u4e00\u4e9b\u63a8\u8350\u7684\u4fbf\u4e8e\u7406\u89e3\u7684\u6587\u7ae0\u3002 1 workspace 1.1 \u5de5\u4f5c\u7a7a\u95f4\u53ca\u5176\u5c42\u6b21 &emsp;&emsp;\u7a7a\u95f4\u7684\u521b\u5efa\uff1aROS2\u4e0eROS1\u4e00\u6837\uff0c\u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4\u76ee\u5f55\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa\/src\u76ee\u5f55\uff0c\u7528\u4e8e\u5b58\u653epackage\u529f\u80fd\u5305\u3002 &emsp;&emsp;\u5c42\u6b21\u7684\u6982\u5ff5\uff1aROS2\u589e\u52a0\u4e86overlay\u548cunderlay\u7684\u6982\u5ff5\uff0c\u7528\u4e8e\u5728\u591a\u4e2aworkspace\u540c\u65f6\u5de5\u4f5c\u65f6\uff0c\u5904\u7406\u5404\u4e2aworkspace\u4e4b\u95f4\u7684\u5c42\u6b21\u95ee\u9898\uff0c\u5bf9\u4e8e\u5305\u540d\u76f8\u540c\u7684package\uff0c\u4e0a\u5c42workspace\u5c06\u8986\u76d6(override)\u4e0b\u5c42workspace\u4e2d\u7684\u540c\u540dpackage\u3002 &emsp;&emsp;\u5c42\u6b21\u7684\u914d\u7f6e\uff1a\u5c42\u6b21\u662f\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u7684\u5148\u540e\u51b3\u5b9a\u7684\uff0cROS\u901a\u8fc7setup.bash\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff0cROS2\u5b89\u88c5\u8def\u5f84\u4e00\u822c\u8bbe\u7f6e\u4e3a\u6700\u4e0b\u5c42\u7684\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5373 $ source \/opt\/ros\/foxy\/setup.bash &emsp;&emsp;\u8fd0\u884c\u65b0\u5efaworkspace\u7684package\u529f\u80fd\u5305\uff0c\u9700\u8981\u5728\u5bf9\u5de5\u4f5c\u7a7a\u95f4\u7f16\u8bd1\u540e\u7684\u65b0\u7ec8\u7aef\u4e2d\u914d\u7f6e\u5982\u4e0b # \u8bbe\u7f6e\u5f53\u524d\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u529f\u80fd\u5305\u7684\u76f8\u5173\u73af\u5883\u53d8\u91cf $ . install\/local_setup.sh # \u8bbe\u7f6e\u5f53\u524d\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u529f\u80fd\u5305\u7684\u76f8\u5173\u73af\u5883\u53d8\u91cf\uff0c\u540c\u65f6\u8bbe\u7f6e\u8be5\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u5176\u4ed6\u5e95\u5c42\u5de5\u4f5c\u7a7a\u95f4\u7684\u73af\u5883\u53d8\u91cf $ . install\/setup.sh # \u5c31\u662f\u8bf4\u8fd9\u4e00\u4e2a\u634e\u5e26\u7740\u628aROS2\u5b89\u88c5\u8def\u5f84\u7684\u73af\u5883\u53d8\u91cf\u4e5f\u8bbe\u7f6e\u4e86 1.2 \u68c0\u67e5\u4f9d\u8d56 &emsp;&emsp;\u7f16\u8bd1\u524d\uff0c\u9700\u8981\u5bf9\u529f\u80fd\u5305\u68c0\u67e5\u4f9d\u8d56\u60c5\u51b5\u3002 $ rosdep install -i &#8211;from-path src &#8211;rosdistro foxy -y 1.3 \u7f16\u8bd1\u5de5\u5177 colcon # \u5728workspace\u6839\u76ee\u5f55\u7f16\u8bd1\u5de5\u7a0b $ colcon build # \u6709\u9009\u62e9\u5730\u7f16\u8bd1\u5305 $ colcon build &#8211;packages-select &lt;package_name&gt; &emsp;&emsp;\u6709\u5173\u7f16\u8bd1\uff0c\u53ef\u770b\u4e00\u4e0b\u540e\u7eed\u7684\u7cfb\u5217\u7b2c\u4e03\u7bc7\u2014\u2014\u7f16\u8bd1\u3002 2 \u7f16\u5199 package [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/151"}],"collection":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=151"}],"version-history":[{"count":1,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":152,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions\/152"}],"wp:attachment":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}