{"id":536,"date":"2026-06-06T03:43:00","date_gmt":"2026-06-05T19:43:00","guid":{"rendered":"https:\/\/ziyuan.work\/?p=536"},"modified":"2026-06-22T16:34:26","modified_gmt":"2026-06-22T08:34:26","slug":"ros%ef%bc%88docker%ef%bc%89","status":"publish","type":"post","link":"https:\/\/ziyuan.work\/?p=536","title":{"rendered":"ROS\uff08docker\uff09"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u4e00\u3001\u4ec0\u4e48\u662fROS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\uff08Robot Operating System\uff09\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u673a\u5668\u4eba\u8f6f\u4ef6\u6846\u67b6\uff0c\u5b83\u4e0d\u662f\u4f20\u7edf\u610f\u4e49\u4e0a\u7684\u64cd\u4f5c\u7cfb\u7edf\uff0c\u800c\u662f\u4e00\u5957\u8fd0\u884c\u5728Linux\u4e4b\u4e0a\u7684\u4e2d\u95f4\u4ef6\u548c\u5de5\u5177\u96c6\u3002ROS\u4e3a\u673a\u5668\u4eba\u8f6f\u4ef6\u5f00\u53d1\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u901a\u4fe1\u673a\u5236\u3001\u5305\u7ba1\u7406\u3001\u6784\u5efa\u7cfb\u7edf\u548c\u8c03\u8bd5\u5de5\u5177\u3002<br>\u76ee\u524dROS\u6709\u4e24\u4e2a\u4e3b\u8981\u7248\u672c\uff1aROS1\uff08\u5982 Noetic\u3001Melodic\u3001Kinetic\uff09\u548cROS2\uff08\u5982 Humble\u3001Iron\u3001Jazzy\uff09\u3002\u672c\u6587\u4ee5 ROS Noetic\uff08ROS1\u7684\u6700\u540e\u4e00\u4e2aLTS\u7248\u672c\uff09\u4e3a\u57fa\u7840\u8fdb\u884c\u8bb2\u89e3\uff0c\u4f46\u6838\u5fc3\u6982\u5ff5\u5728 ROS 2 \u4e2d\u540c\u6837\u9002\u7528\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 ROS \u6838\u5fc3\u6982\u5ff5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\u7684\u8bbe\u8ba1\u54f2\u5b66\u662f\u57fa\u4e8e\u5206\u5e03\u5f0f\u67b6\u6784\uff0c\u7cfb\u7edf\u7531\u591a\u4e2a\u72ec\u7acb\u8fdb\u7a0b\uff08\u8282\u70b9\uff09\u7ec4\u6210\uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6d88\u606f\u4f20\u9012\u8fdb\u884c\u901a\u4fe1\u3002\u7406\u89e3 ROS \u7684\u5173\u952e\u662f\u7406\u89e3\u4ee5\u4e0b\u51e0\u4e2a\u6838\u5fc3\u6982\u5ff5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u6982\u5ff5<\/strong><\/td><td><strong>\u8bf4\u660e<\/strong><\/td><td><strong>\u7c7b\u6bd4<\/strong><\/td><\/tr><tr><td>\u8282\u70b9\uff08Node\uff09<\/td><td>\u4e00\u4e2a\u72ec\u7acb\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u8d1f\u8d23\u7279\u5b9a\u529f\u80fd<\/td><td>\u4e00\u4e2a\u5de5\u4eba<\/td><\/tr><tr><td>\u8bdd\u9898\uff08Topic\uff09<\/td><td>\u8282\u70b9\u95f4\u5f02\u6b65\u901a\u4fe1\u7684\u901a\u9053\uff0c\u53d1\u5e03\/\u8ba2\u9605\u6a21\u5f0f<\/td><td>\u5e7f\u64ad\u9891\u9053<\/td><\/tr><tr><td>\u6d88\u606f\uff08Message\uff09<\/td><td>\u5728\u8bdd\u9898\u4e0a\u4f20\u8f93\u7684\u6570\u636e\u7ed3\u6784<\/td><td>\u5e7f\u64ad\u7684\u5185\u5bb9<\/td><\/tr><tr><td>\u53d1\u5e03\uff08Publish\uff09<\/td><td>\u8282\u70b9\u5411\u8bdd\u9898\u53d1\u9001\u6d88\u606f<\/td><td>\u64ad\u97f3<\/td><\/tr><tr><td>\u8ba2\u9605\uff08Subscribe\uff09<\/td><td>\u8282\u70b9\u4ece\u8bdd\u9898\u63a5\u6536\u6d88\u606f<\/td><td>\u6536\u542c<\/td><\/tr><tr><td>\u670d\u52a1\uff08Service\uff09<\/td><td>\u8282\u70b9\u95f4\u540c\u6b65\u901a\u4fe1\uff0c\u8bf7\u6c42\/\u54cd\u5e94\u6a21\u5f0f<\/td><td>\u7535\u8bdd\u547c\u53eb<\/td><\/tr><tr><td>Master<\/td><td>\u8282\u70b9\u6ce8\u518c\u548c\u67e5\u627e\u7684\u4e2d\u95f4\u4eba<\/td><td>\u7535\u8bdd\u4ea4\u6362\u673a<\/td><\/tr><tr><td>Launch\u6587\u4ef6<\/td><td>XML \u683c\u5f0f\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u6279\u91cf\u542f\u52a8\u591a\u4e2a\u8282\u70b9<\/td><td>\u542f\u52a8\u811a\u672c<\/td><\/tr><tr><td>Package<\/td><td>ROS \u8f6f\u4ef6\u7684\u57fa\u672c\u7ec4\u7ec7\u5355\u4f4d<\/td><td>\u4e00\u4e2a\u9879\u76ee\/\u6a21\u5757<\/td><\/tr><tr><td>TF<\/td><td>\u5750\u6807\u53d8\u6362\u7cfb\u7edf\uff0c\u7ba1\u7406\u5404\u5750\u6807\u7cfb\u4e4b\u95f4\u7684\u5173\u7cfb<\/td><td>\u5730\u56fe\u4e0a\u7684\u5750\u6807\u7f51\u683c<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.2 ROS \u6587\u4ef6\u7cfb\u7edf<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\u9879\u76ee\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u76ee\u5f55\u7ed3\u6784\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u251c\u2500\u2500 src\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u6e90\u4ee3\u7801\u76ee\u5f55<br>\u2502 \u00a0\u00a0\u2514\u2500\u2500 my_package\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u4e00\u4e2aROS\u5305<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 CMakeLists.txt \u00a0\u00a0# \u6784\u5efa\u914d\u7f6e<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 package.xml \u00a0\u00a0\u00a0\u00a0\u00a0# \u5305\u63cf\u8ff0<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 src\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# C++ \u6e90\u6587\u4ef6<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 include\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u5934\u6587\u4ef6<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 scripts\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Python \u811a\u672c<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u2500 launch\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Launch \u6587\u4ef6<br>\u2502 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2514\u2500\u2500 config\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u914d\u7f6e\u6587\u4ef6<br>\u251c\u2500\u2500 build\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u7f16\u8bd1\u4e2d\u95f4\u4ea7\u7269<br>\u251c\u2500\u2500 devel\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u7f16\u8bd1\u4ea7\u7269\uff08\u53ef\u6267\u884c\u6587\u4ef6\u3001\u5e93\uff09<br>\u2514\u2500\u2500 install\/ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u5b89\u88c5\u76ee\u5f55<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u8bd1\u5b89\u88c5\u7684\u901a\u5e38\u5728\/opt\/\u91cc\u9762\uff0c\u4e5f\u5c31\u662finstall\u76ee\u5f55\u6587\u4ef6\u5939\u3002\u5185\u90e8\u901a\u5e38\u662f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"346\" height=\"380\" src=\"https:\/\/ziyuan.work\/wp-content\/uploads\/2026\/06\/image.png\" alt=\"\" class=\"wp-image-537\" srcset=\"https:\/\/ziyuan.work\/wp-content\/uploads\/2026\/06\/image.png 346w, https:\/\/ziyuan.work\/wp-content\/uploads\/2026\/06\/image-273x300.png 273w\" sizes=\"auto, (max-width: 346px) 100vw, 346px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.3 ROS \u901a\u4fe1\u673a\u5236\u8be6\u89e3<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ROS \u652f\u6301\u4e24\u79cd\u901a\u4fe1\u65b9\u5f0f\uff1a\u8bdd\u9898\uff08Topic\uff09\u548c\u670d\u52a1\uff08Service\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bdd\u9898\u662f\u5f02\u6b65\u7684\u3001\u591a\u5bf9\u591a\u7684\u901a\u4fe1\u673a\u5236\u3002\u4e00\u4e2a\u8282\u70b9\u53ef\u4ee5\u53d1\u5e03\u6d88\u606f\u5230\u67d0\u4e2a\u8bdd\u9898\uff0c\u5176\u4ed6\u8282\u70b9\u53ef\u4ee5\u8ba2\u9605\u8fd9\u4e2a\u8bdd\u9898\u63a5\u6536\u6d88\u606f\u3002\u8bdd\u9898\u4f7f\u7528\u53d1\u5e03\/\u8ba2\u9605\u6a21\u578b\uff0c\u53d1\u5e03\u8005\uff08Publisher\uff09\u548c\u8ba2\u9605\u8005\uff08Subscriber\uff09\u4e4b\u95f4\u662f\u89e3\u8026\u7684\u3002\u53d1\u5e03\u8005\u4e0d\u9700\u8981\u77e5\u9053\u8c01\u5728\u63a5\u6536\uff0c\u8ba2\u9605\u8005\u4e5f\u4e0d\u9700\u8981\u77e5\u9053\u8c01\u5728\u53d1\u9001\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u8bdd\u9898\u901a\u4fe1\u793a\u4f8b\uff08Python\uff09<br># \u53d1\u5e03\u8005<br>import rospy<br>from std_msgs.msg import String<br>pub = rospy.Publisher('my_topic', String, queue_size=10)<br>pub.publish(\"Hello ROS!\")<br><br># \u8ba2\u9605\u8005<br>def callback(msg):<br>&nbsp;&nbsp;&nbsp;&nbsp;rospy.loginfo(\"Received: %s\", msg.data)<br>rospy.Subscriber('my_topic', String, callback)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u670d\u52a1\u662f\u540c\u6b65\u7684\u3001\u4e00\u5bf9\u4e00\u7684\u901a\u4fe1\u673a\u5236\u3002\u5ba2\u6237\u7aef\uff08Client\uff09\u53d1\u9001\u8bf7\u6c42\uff0c\u670d\u52a1\u7aef\uff08Server\uff09\u5904\u7406\u540e\u8fd4\u56de\u54cd\u5e94\u3002\u9002\u7528\u4e8e\u9700\u8981\u7b49\u5f85\u7ed3\u679c\u7684\u573a\u666f\uff0c\u6bd4\u5982\u67e5\u8be2\u673a\u5668\u4eba\u72b6\u6001\u3001\u6267\u884c\u4e00\u6b21\u6027\u7684\u52a8\u4f5c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u670d\u52a1\u901a\u4fe1\u793a\u4f8b\uff08Python\uff09\n# \u670d\u52a1\u7aef\nfrom my_package.srv import AddTwoInts, AddTwoIntsResponse\ndef handle_add(req):\n\u00a0\u00a0\u00a0\u00a0return AddTwoIntsResponse(req.a + req.b)\nrospy.Service('add_two_ints', AddTwoInts, handle_add)\n\n\n# \u5ba2\u6237\u7aef\nrospy.wait_for_service('add_two_ints')\nadd = rospy.ServiceProxy('add_two_ints', AddTwoInts)\nresult = add(3, 5)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.4 Launch \u6587\u4ef6<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Launch \u6587\u4ef6\u662f ROS \u4e2d\u6279\u91cf\u542f\u52a8\u8282\u70b9\u548c\u914d\u7f6e\u53c2\u6570\u7684\u6838\u5fc3\u5de5\u5177\u3002\u4f7f\u7528XML\u683c\u5f0f\u7f16\u5199\uff0c\u53ef\u4ee5\u4e00\u6b21\u6027\u542f\u52a8\u591a\u4e2a\u8282\u70b9\u3001\u8bbe\u7f6e\u53c2\u6570\u3001\u5305\u542b\u5176\u4ed6Launch\u6587\u4ef6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- \u793a\u4f8b\uff1a\u542f\u52a8\u4e24\u4e2a\u8282\u70b9 --&gt;<br>&lt;launch&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- \u8bbe\u7f6e\u53c2\u6570 --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg name=\"rviz\" default=\"true\"\/&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- \u542f\u52a8 FAST-LIO --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;node pkg=\"fast_lio\" type=\"fastlio_mapping\"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=\"laserMapping\" output=\"screen\"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=\"common\/lid_topic\" value=\"\/livox\/lidar\"\/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=\"common\/imu_topic\" value=\"\/livox\/imu\"\/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=\"pcd_save\/pcd_save_en\" value=\"true\"\/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/node&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- \u542f\u52a8 RViz \u53ef\u89c6\u5316 --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;node if=\"$(arg rviz)\" pkg=\"rviz\" type=\"rviz\"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=\"rviz\" args=\"-d $(find fast_lio)\/rviz_cfg\/loam.rviz\"\/&gt;<br>&lt;\/launch&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Launch \u6587\u4ef6\u7684\u5173\u952e\u8bed\u6cd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&lt;launch>\uff1a\u6839\u5143\u7d20\uff0c\u6240\u6709\u5176\u4ed6\u5143\u7d20\u90fd\u5305\u542b\u5728\u5176\u4e2d<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&lt;node>\uff1a\u542f\u52a8\u4e00\u4e2a\u8282\u70b9\uff0c\u6307\u5b9a\u5305\u540d(pkg)\u3001\u53ef\u6267\u884c\u6587\u4ef6(type)\u3001\u8282\u70b9\u540d(name)<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&lt;param>\uff1a\u8bbe\u7f6e\u53c2\u6570\uff0c\u4f1a\u52a0\u8f7d\u5230ROS\u53c2\u6570\u670d\u52a1\u5668<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&lt;arg>\uff1a\u5b9a\u4e49\u53d8\u91cf\uff0c\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u901a\u8fc7\u547d\u4ee4\u884c\u4f20\u5165<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li> &lt;include>\uff1a\u5305\u542b\u53e6\u4e00\u4e2aLaunch\u6587\u4ef6<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&lt;group>\uff1a\u5bf9\u4e00\u7ec4\u8282\u70b9\u8fdb\u884c\u64cd\u4f5c\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u547d\u540d\u7a7a\u95f4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.5 TF \u5750\u6807\u53d8\u6362\u7cfb\u7edf<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">TF\uff08Transform\uff09\u662fROS\u4e2d\u7ba1\u7406\u5750\u6807\u53d8\u6362\u7684\u6838\u5fc3\u7cfb\u7edf\u3002\u5728\u673a\u5668\u4eba\u7cfb\u7edf\u4e2d\uff0c\u4e0d\u540c\u4f20\u611f\u5668\u3001\u4e0d\u540c\u90e8\u4ef6\u90fd\u6709\u81ea\u5df1\u7684\u5750\u6807\u7cfb\uff0cTF\u8d1f\u8d23\u7ef4\u62a4\u8fd9\u4e9b\u5750\u6807\u7cfb\u4e4b\u95f4\u7684\u53d8\u6362\u5173\u7cfb\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f8b\u5982\uff0c\u4e00\u4e2a\u5178\u578b\u7684\u79fb\u52a8\u673a\u5668\u4eba\u53ef\u80fd\u5305\u542b\u4ee5\u4e0b\u5750\u6807\u7cfb\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>map\uff1a\u5168\u5c40\u5730\u56fe\u5750\u6807\u7cfb\uff0c\u56fa\u5b9a\u4e0d\u52a8<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>odom\uff1a\u91cc\u7a0b\u8ba1\u5750\u6807\u7cfb\uff0c\u4ee5\u673a\u5668\u4eba\u542f\u52a8\u4f4d\u7f6e\u4e3a\u539f\u70b9<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>base_link\uff1a\u673a\u5668\u4eba\u672c\u4f53\u5750\u6807\u7cfb\uff0c\u56fa\u5b9a\u5728\u673a\u5668\u4eba\u4e0a<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>lidar\uff1a\u6fc0\u5149\u96f7\u8fbe\u5750\u6807\u7cfb\uff0c\u76f8\u5bf9\u4e8e base_link \u6709\u56fa\u5b9a\u504f\u79fb<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imu\uff1aIMU \u5750\u6807\u7cfb\uff0c\u76f8\u5bf9\u4e8e base_link \u6709\u56fa\u5b9a\u504f\u79fb<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">TF\u6811\u662f\u4e00\u4e2a\u6709\u5411\u6811\u7ed3\u6784\uff0c\u6bcf\u4e2a\u5750\u6807\u7cfb\u53ea\u6709\u4e00\u4e2a\u7236\u8282\u70b9\u3002\u901a\u8fc7TF\u53ef\u4ee5\u65b9\u4fbf\u5730\u5c06\u4e00\u4e2a\u5750\u6807\u7cfb\u4e0b\u7684\u70b9\u8f6c\u6362\u5230\u53e6\u4e00\u4e2a\u5750\u6807\u7cfb\u4e0b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e8c\u3001ROS\u7684Docker\u57fa\u7840<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Docker\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u5bb9\u5668\u5316\u5e73\u53f0\uff0c\u5b83\u53ef\u4ee5\u5c06\u5e94\u7528\u7a0b\u5e8f\u53ca\u5176\u4f9d\u8d56\u6253\u5305\u5230\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u3001\u53ef\u79fb\u690d\u7684\u5bb9\u5668\u4e2d\u3002\u76f8\u6bd4\u865a\u62df\u673a\uff0cDocker\u5bb9\u5668\u5171\u4eab\u5bbf\u4e3b\u673a\u7684\u5185\u6838\uff0c\u542f\u52a8\u66f4\u5feb\u3001\u8d44\u6e90\u5360\u7528\u66f4\u5c11\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.1 Docker\u6838\u5fc3\u6982\u5ff5<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u6982\u5ff5<\/strong><\/td><td><strong>\u8bf4\u660e<\/strong><\/td><td><strong>\u7c7b\u6bd4<\/strong><\/td><\/tr><tr><td>\u955c\u50cf\uff08Image\uff09<\/td><td>\u53ea\u8bfb\u7684\u6a21\u677f\uff0c\u5305\u542b\u8fd0\u884c\u5e94\u7528\u6240\u9700\u7684\u4e00\u5207<\/td><td>\u5149\u76d8\/ISO\u6587\u4ef6<\/td><\/tr><tr><td>\u5bb9\u5668\uff08Container\uff09<\/td><td>\u955c\u50cf\u7684\u8fd0\u884c\u5b9e\u4f8b<\/td><td>\u8fd0\u884c\u4e2d\u7684\u7a0b\u5e8f<\/td><\/tr><tr><td>Dockerfile<\/td><td>\u5b9a\u4e49\u5982\u4f55\u6784\u5efa\u955c\u50cf\u7684\u811a\u672c<\/td><td>\u83dc\u8c31<\/td><\/tr><tr><td>\u4ed3\u5e93\uff08Registry\uff09<\/td><td>\u5b58\u50a8\u548c\u5206\u53d1\u955c\u50cf\u7684\u670d\u52a1<\/td><td>\u5e94\u7528\u5546\u5e97<\/td><\/tr><tr><td>\u6302\u8f7d\uff08Volume\uff09<\/td><td>\u5c06\u5bbf\u4e3b\u673a\u76ee\u5f55\u6620\u5c04\u5230\u5bb9\u5668\u5185\u90e8<\/td><td>\u5171\u4eab\u6587\u4ef6\u5939<\/td><\/tr><tr><td>\u7aef\u53e3\u6620\u5c04<\/td><td>\u5c06\u5bb9\u5668\u7aef\u53e3\u6620\u5c04\u5230\u5bbf\u4e3b\u673a\u7aef\u53e3<\/td><td>\u7aef\u53e3\u8f6c\u53d1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.2 Docker\u57fa\u7840\u547d\u4ee4<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662fDocker\u6700\u5e38\u7528\u7684\u547d\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull ubuntu:20.04 # \u62c9\u53d6\u955c\u50cf\n\ndocker images \u00a0# \u5217\u51fa\u672c\u5730\u955c\u50cf\n\ndocker rmi &lt;image_id> # \u5220\u9664\u955c\u50cf\n\ndocker save -o my_image.tar &lt;image> \u00a0\u00a0# \u5bfc\u51fa\u955c\u50cf\u4e3atar\u6587\u4ef6\n\ndocker load -i my_image.tar \u00a0\u00a0\u00a0# \u4ecetar\u6587\u4ef6\u5bfc\u5165\u955c\u50cf\n\ndocker run -it ubuntu:20.04 \/bin\/bash \u00a0\u00a0# \u542f\u52a8\u4ea4\u4e92\u5f0f\u5bb9\u5668\n\ndocker ps \u00a0# \u5217\u51fa\u8fd0\u884c\u4e2d\u7684\u5bb9\u5668\n\ndocker ps -a \u00a0# \u5217\u51fa\u6240\u6709\u5bb9\u5668\uff08\u542b\u5df2\u505c\u6b62\uff09\n\ndocker stop &lt;container> # \u505c\u6b62\u5bb9\u5668\n\ndocker rm &lt;container> \u00a0# \u5220\u9664\u5bb9\u5668\n\ndocker exec -it &lt;container> bash \u00a0# \u8fdb\u5165\u8fd0\u884c\u4e2d\u7684\u5bb9\u5668\n\ndocker run -v \/host\/path:\/container\/path &lt;image> \u00a0# \u76ee\u5f55\u6302\u8f7d\n\ndocker run -v my_volume:\/container\/path &lt;image> \u00a0\u00a0# \u547d\u540d\u5377\u6302\u8f7d\n\ndocker run -p 8080:80 &lt;image> \u00a0\u00a0\u00a0# \u5c06\u5bb9\u566880\u7aef\u53e3\u6620\u5c04\u5230\u5bbf\u4e3b\u673a8080<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.3 Dockerfile\u7f16\u5199<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dockerfile\u662f\u6784\u5efa\u955c\u50cf\u7684\u811a\u672c\u6587\u4ef6\uff0c\u5b9a\u4e49\u4e86\u955c\u50cf\u7684\u6bcf\u4e00\u5c42\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2aROS Noetic\u7684\u793a\u4f8bDockerfile\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u57fa\u4e8eROS Noetic\u5b98\u65b9\u955c\u50cfFROM osrf\/ros:noetic-desktop-full<br><br># \u8bbe\u7f6e\u73af\u5883\u53d8\u91cfENV DEBIAN_FRONTEND=noninteractive<br><br># \u5b89\u88c5\u5e38\u7528\u5de5\u5177RUN apt-get update &amp;&amp; apt-get install -y \\<br>&nbsp;&nbsp;&nbsp;&nbsp;git wget vim nano \\<br>&nbsp;&nbsp;&nbsp;&nbsp;ros-noetic-pcl-ros \\<br>&nbsp;&nbsp;&nbsp;&nbsp;ros-noetic-rviz \\<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*<br><br># \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55WORKDIR \/workspace<br><br># \u8bbe\u7f6e\u81ea\u52a8\u52a0\u8f7dROS\u73af\u5883RUN echo \"source \/opt\/ros\/noetic\/setup.bash\" &gt;&gt; ~\/.bashrc<br><br>CMD &#91;\"\/bin\/bash\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dockerfile\u7684\u5173\u952e\u6307\u4ee4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FROM\uff1a\u6307\u5b9a\u57fa\u7840\u955c\u50cf<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RUN\uff1a\u5728\u6784\u5efa\u65f6\u6267\u884c\u547d\u4ee4<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>COPY\/ADD\uff1a\u5c06\u6587\u4ef6\u590d\u5236\u5230\u955c\u50cf\u4e2d<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ENV\uff1a\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WORKDIR\uff1a\u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>EXPOSE\uff1a\u58f0\u660e\u5bb9\u5668\u76d1\u542c\u7684\u7aef\u53e3<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CMD\/ENTRYPOINT\uff1a\u5bb9\u5668\u542f\u52a8\u65f6\u6267\u884c\u7684\u547d\u4ee4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.4 Docker Compose<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Docker Compose\u662f\u4e00\u4e2a\u7528\u4e8e\u5b9a\u4e49\u548c\u8fd0\u884c\u591a\u5bb9\u5668\u5e94\u7528\u7684\u5de5\u5177\u3002\u901a\u8fc7\u4e00\u4e2aYAML\u6587\u4ef6\u914d\u7f6e\u591a\u4e2a\u5bb9\u5668\uff0c\u4e00\u952e\u542f\u52a8\u6574\u4e2a\u5e94\u7528\u6808\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># docker-compose.yml\u793a\u4f8bversion: '3'<br>services:<br>&nbsp;&nbsp;fastlio:<br>&nbsp;&nbsp;&nbsp;&nbsp;image: fastlio_noetic:v3<br>&nbsp;&nbsp;&nbsp;&nbsp;container_name: fastlio_container<br>&nbsp;&nbsp;&nbsp;&nbsp;volumes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- .\/workspace:\/workspace<br>&nbsp;&nbsp;&nbsp;&nbsp;network_mode: host<br>&nbsp;&nbsp;&nbsp;&nbsp;stdin_open: true<br>&nbsp;&nbsp;&nbsp;&nbsp;tty: true<br><br>&nbsp;&nbsp;rviz:<br>&nbsp;&nbsp;&nbsp;&nbsp;image: osrf\/ros:noetic-desktop-full<br>&nbsp;&nbsp;&nbsp;&nbsp;container_name: rviz_container<br>&nbsp;&nbsp;&nbsp;&nbsp;environment:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- DISPLAY=${DISPLAY}<br>&nbsp;&nbsp;&nbsp;&nbsp;volumes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- \/tmp\/.X11-unix:\/tmp\/.X11-unix<br>&nbsp;&nbsp;&nbsp;&nbsp;network_mode: host<br>&nbsp;&nbsp;&nbsp;&nbsp;depends_on:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- fastlio<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528Docker Compose\u542f\u52a8\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u542f\u52a8\u6240\u6709\u670d\u52a1\n\ndocker-compose down \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u505c\u6b62\u5e76\u5220\u9664\u6240\u6709\u670d\u52a1docker-compose logs -f \u00a0\u00a0\u00a0\u00a0\u00a0# \u67e5\u770b\u65e5\u5fd7<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001ROS + Docker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c06ROS\u5e94\u7528\u6253\u5305\u5230Docker\u5bb9\u5668\u4e2d\uff0c\u662f\u76ee\u524d\u673a\u5668\u4eba\u5f00\u53d1\u548c\u90e8\u7f72\u7684\u6700\u4f73\u5b9e\u8df5\u3002\u5b83\u89e3\u51b3\u4e86\u201c\u73af\u5883\u4f9d\u8d56\u5730\u72f1\u201d\u95ee\u9898\u3002\u540c\u4e00\u5957\u4ee3\u7801\u5728\u4efb\u4f55\u673a\u5668\u4e0a\u90fd\u80fd\u8dd1\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.1 ROS\u7f51\u7edc\u914d\u7f6e<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\u7684\u8282\u70b9\u901a\u4fe1\u4f9d\u8d56\u4e8e\u7f51\u7edc\u3002\u5728Docker\u4e2d\u8fd0\u884cROS\u65f6\uff0c\u7f51\u7edc\u914d\u7f6e\u662f\u5173\u952e\u3002\u6709\u4e09\u79cd\u4e3b\u8981\u65b9\u5f0f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u7f51\u7edc\u6a21\u5f0f<\/strong><\/td><td><strong>\u8bf4\u660e<\/strong><\/td><td><strong>\u9002\u7528\u573a\u666f<\/strong><\/td><\/tr><tr><td>host<\/td><td>\u5bb9\u5668\u5171\u4eab\u5bbf\u4e3b\u673a\u7f51\u7edc\u6808<\/td><td>ROS\u8282\u70b9\u95f4\u901a\u4fe1\uff0c\u6700\u5e38\u7528<\/td><\/tr><tr><td>bridge<\/td><td>\u5bb9\u5668\u4f7f\u7528\u72ec\u7acb\u7684\u865a\u62df\u7f51\u7edc<\/td><td>\u9694\u79bb\u73af\u5883\uff0c\u9700\u8981\u7aef\u53e3\u6620\u5c04<\/td><\/tr><tr><td>none<\/td><td>\u5bb9\u5668\u65e0\u7f51\u7edc<\/td><td>\u79bb\u7ebf\u6d4b\u8bd5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8eROS\u5e94\u7528\uff0c\u63a8\u8350\u4f7f\u7528host\u6a21\u5f0f\u3002\u56e0\u4e3aROS\u8282\u70b9\u9700\u8981\u5728\u4e0d\u540c\u5bb9\u5668\u4e4b\u95f4\u901a\u8fc7\u8bdd\u9898\u901a\u4fe1\uff0chost\u6a21\u5f0f\u8ba9\u6240\u6709\u5bb9\u5668\u5171\u4eab\u540c\u4e00\u7f51\u7edc\uff0c\u8282\u70b9\u4e4b\u95f4\u53ef\u4ee5\u76f4\u63a5\u53d1\u73b0\u5f7c\u6b64\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4f7f\u7528host\u7f51\u7edc\u6a21\u5f0f\u542f\u52a8ROS\u5bb9\u5668docker run -it --rm --network host \\<br>&nbsp;&nbsp;-v $(pwd)\/workspace:\/workspace \\<br>&nbsp;&nbsp;fastlio_noetic:v3 \/bin\/bash<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.2\u591a\u5bb9\u5668ROS\u901a\u4fe1<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u590d\u6742\u7684\u673a\u5668\u4eba\u7cfb\u7edf\u4e2d\uff0c\u901a\u5e38\u4f1a\u5c06\u4e0d\u540c\u529f\u80fd\u62c6\u5206\u5230\u4e0d\u540c\u7684\u5bb9\u5668\u4e2d\u3002\u4f8b\u5982\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5bb9\u5668A\uff1a\u8fd0\u884cFAST-LIO\u5efa\u56fe\u7b97\u6cd5<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5bb9\u5668B\uff1a\u8fd0\u884cRViz\u53ef\u89c6\u5316<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5bb9\u5668C\uff1a\u8fd0\u884c\u6570\u636e\u5904\u7406\u811a\u672c<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5bb9\u5668D\uff1a\u8fd0\u884c\u673a\u5668\u4eba\u5e95\u76d8\u9a71\u52a8<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u5bb9\u5668\u4e4b\u95f4\u901a\u8fc7ROS\u8bdd\u9898\u8fdb\u884c\u901a\u4fe1\u3002\u53ea\u8981\u4f7f\u7528host\u7f51\u7edc\u6a21\u5f0f\uff0c\u5bb9\u5668\u5185\u7684ROS\u8282\u70b9\u5c31\u50cf\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u8fd0\u884c\u4e00\u6837\uff0c\u53ef\u4ee5\u81ea\u7136\u5730\u53d1\u73b0\u5f7c\u6b64\u5e76\u901a\u4fe1\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5bb9\u56681: \u542f\u52a8FAST-LIO\ndocker exec -it fastlio_container \/bin\/bash\nroslaunch fast_lio mapping_avia.launch rviz:=false\n\n# \u5bb9\u56682: \u8fdb\u5165\u540c\u4e00\u4e2a\u5bb9\u5668\u64ad\u653ebag\ndocker exec -it fastlio_container \/bin\/bash\ncd \/workspace\nrosbag play data.bag\n\n# \u5bb9\u56683: \u5728\u53e6\u4e00\u4e2a\u5bb9\u5668\u4e2d\u67e5\u770b\u8bdd\u9898\ndocker exec -it rviz_container \/bin\/bash\n\nrostopic list \u00a0\u00a0\u00a0# \u53ef\u4ee5\u770b\u5230FAST-LIO\u53d1\u5e03\u7684\u8bdd\u9898rostopic echo \/Odometry \u00a0\u00a0\u00a0# \u67e5\u770b\u91cc\u7a0b\u8ba1\u6570\u636e<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.3\u6570\u636e\u6301\u4e45\u5316<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Docker\u5bb9\u5668\u662f\u4e34\u65f6\u7684\u3002\u5220\u9664\u5bb9\u5668\u540e\uff0c\u5bb9\u5668\u5185\u7684\u6240\u6709\u6570\u636e\u90fd\u4f1a\u4e22\u5931\u3002\u56e0\u6b64\uff0c\u5fc5\u987b\u5c06\u91cd\u8981\u6570\u636e\u6302\u8f7d\u5230\u5bbf\u4e3b\u673a\u4e0a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u4f73\u5b9e\u8df5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4ee3\u7801\u548c\u914d\u7f6e\u6587\u4ef6\uff1a\u901a\u8fc7 -v\u6302\u8f7d\u5230\u5bbf\u4e3b\u673a\uff0c\u65b9\u4fbf\u4fee\u6539\u548c\u7248\u672c\u63a7\u5236<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6570\u636e\u6587\u4ef6\uff08bag\u3001PCD\uff09\uff1a\u6302\u8f7d\u5230\u5bbf\u4e3b\u673a\u76ee\u5f55\uff0c\u5bb9\u5668\u53ea\u8d1f\u8d23\u5904\u7406<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65e5\u5fd7\u6587\u4ef6\uff1a\u6302\u8f7d\u5230\u5bbf\u4e3b\u673a\uff0c\u65b9\u4fbf\u540e\u7eed\u5206\u6790<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># \u63a8\u8350\u7684\u6570\u636e\u6302\u8f7d\u65b9\u5f0f\n\ndocker run -it --rm \\\n\u00a0\u00a0-v $(pwd)\/workspace:\/workspace \\ \u00a0\u00a0\u00a0\u00a0# \u6570\u636e\u548c\u4ee3\u7801\n\u00a0\u00a0-v $(pwd)\/bags:\/bags \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# bag\u5305\n\u00a0\u00a0-v $(pwd)\/output:\/output \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u8f93\u51fa\u7ed3\u679cfastlio_noetic:v3 \/bin\/bash<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.4 X11\u8f6c\u53d1\uff08GUI\u5e94\u7528\uff09<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\u4e2d\u5f88\u591a\u5de5\u5177\u662f\u56fe\u5f62\u754c\u9762\u7684\uff08\u5982RViz\u3001rqt_graph\uff09\u3002\u5728Docker\u4e2d\u4f7f\u7528GUI\u5e94\u7528\u9700\u8981X11\u8f6c\u53d1\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u65b9\u6cd51: \u4f7f\u7528host\u7f51\u7edc + X11 socket\u6302\u8f7ddocker run -it --rm --network host \\<br>&nbsp;&nbsp;-e DISPLAY=$DISPLAY \\<br>&nbsp;&nbsp;-v \/tmp\/.X11-unix:\/tmp\/.X11-unix \\<br>&nbsp;&nbsp;-v $HOME\/.Xauthority:$HOME\/.Xauthority \\<br>&nbsp;&nbsp;osrf\/ros:noetic-desktop-full \/bin\/bash<br><br># \u65b9\u6cd52: \u4f7f\u7528xhost\u5141\u8bb8Docker\u8bbf\u95eeX11<br>xhost +local:docker<br>docker run -it --rm --network host \\<br>&nbsp;&nbsp;-e DISPLAY=$DISPLAY \\<br>&nbsp;&nbsp;-v \/tmp\/.X11-unix:\/tmp\/.X11-unix \\<br>&nbsp;&nbsp;osrf\/ros:noetic-desktop-full \/bin\/bash<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u56db\u3001\u5b9e\u6218\uff1a\u6784\u5efaROS SLAM\u5bb9\u5668<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u901a\u8fc7\u4e00\u4e2a\u5b8c\u6574\u7684\u4f8b\u5b50\uff0c\u5c55\u793a\u5982\u4f55\u4ece\u96f6\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8eROS Noetic\u7684\u6fc0\u5149SLAM Docker\u5bb9\u5668\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.1\u7f16\u5199Dockerfile<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM osrf\/ros:noetic-desktop-full<br><br>ENV DEBIAN_FRONTEND=noninteractive<br><br># \u5b89\u88c5PCL\u548cEigen<br>RUN apt-get update &amp;&amp; apt-get install -y \\<br>&nbsp;&nbsp;&nbsp;&nbsp;libpcl-dev \\<br>&nbsp;&nbsp;&nbsp;&nbsp;libeigen3-dev \\<br>&nbsp;&nbsp;&nbsp;&nbsp;ros-noetic-pcl-ros \\<br>&nbsp;&nbsp;&nbsp;&nbsp;ros-noetic-tf \\<br>&nbsp;&nbsp;&nbsp;&nbsp;ros-noetic-rviz \\<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*<br><br># \u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4RUN mkdir -p \/root\/fastlio_ws\/src<br>WORKDIR \/root\/fastlio_ws<br><br># \u81ea\u52a8\u52a0\u8f7dROS\u73af\u5883RUN echo \"source \/opt\/ros\/noetic\/setup.bash\" &gt;&gt; ~\/.bashrc<br><br>WORKDIR \/workspace<br>CMD &#91;\"\/bin\/bash\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.2\u6784\u5efa\u548c\u8fd0\u884c<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6784\u5efa\u955c\u50cfdocker build -t fastlio_noetic:v1 .<br><br># \u542f\u52a8\u5bb9\u5668docker run -it --rm --name fastlio_container \\<br>&nbsp;&nbsp;-v $(pwd)\/workspace:\/workspace \\<br>&nbsp;&nbsp;fastlio_noetic:v1 \/bin\/bash<br><br># \u5728\u5bb9\u5668\u5185\u7f16\u8bd1FAST-LIO\uff08\u9996\u6b21\uff09cd \/root\/fastlio_ws\/src<br>git clone https:\/\/github.com\/hku-mars\/FAST_LIO.git<br>cd \/root\/fastlio_ws<br>catkin_make<br><br># \u540e\u7eed\u4f7f\u7528\uff1a\u76f4\u63a5\u542f\u52a8\u5373\u53ef\uff0c\u4ee3\u7801\u5df2\u5185\u7f6eecho \"source \/root\/fastlio_ws\/devel\/setup.bash\" &gt;&gt; ~\/.bashrc<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.3\u955c\u50cf\u7248\u672c\u7ba1\u7406<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u968f\u7740\u9879\u76ee\u8fed\u4ee3\uff0c\u955c\u50cf\u4f1a\u4e0d\u65ad\u6f14\u8fdb\u3002\u5efa\u8bae\u91c7\u7528\u8bed\u4e49\u5316\u7248\u672c\u7ba1\u7406\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2022 v1.0\uff1a\u57fa\u7840\u73af\u5883 + ROS Noetic + PCL<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2022 v1.1\uff1a\u52a0\u5165FAST-LIO\u6e90\u7801<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2022 v2.0\uff1a\u4ee3\u7801\u5185\u7f6e + \u73af\u5883\u81ea\u52a8\u52a0\u8f7d + PCD\u76f4\u51fa\u5bbf\u4e3b\u673a\uff08\u5f00\u7bb1\u5373\u7528\u7248\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2022 v2.1\uff1a\u4fee\u590dPCD\u4fdd\u5b58\u8def\u5f84\u95ee\u9898<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u67e5\u770b\u955c\u50cf\u5386\u53f2docker history fastlio_noetic:v2<br><br># \u7ed9\u955c\u50cf\u6253\u6807\u7b7edocker tag fastlio_noetic:v2 fastlio_noetic:latest<br>docker tag fastlio_noetic:v2 fastlio_noetic:20260616<br><br># \u5bfc\u51fa\u955c\u50cf\u7528\u4e8e\u5206\u53d1docker save -o fastlio_noetic_v2.tar fastlio_noetic:v2<br><br># \u5728\u65b0\u673a\u5668\u4e0a\u5bfc\u5165docker load -i fastlio_noetic_v2.tar<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e94\u3001\u5e38\u89c1\u95ee\u9898\u4e0e\u6392\u67e5<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5.1\u5bb9\u5668\u5185\u627e\u4e0d\u5230ROS\u547d\u4ee4<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fdb\u5165\u5bb9\u5668\u540e\u6267\u884croscore\u63d0\u793acommand not found\u3002\u539f\u56e0\u662f\u6ca1\u6709source ROS\u73af\u5883\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u624b\u52a8\u52a0\u8f7d\nsource \/opt\/ros\/noetic\/setup.bash\n\n# \u6c38\u4e45\u751f\u6548\uff08\u5199\u5165 .bashrc\uff09\necho \"source \/opt\/ros\/noetic\/setup.bash\" >> ~\/.bashrc\nsource ~\/.bashrc<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5.2\u591a\u5bb9\u5668\u95f4\u65e0\u6cd5\u901a\u4fe1<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u68c0\u67e5\u4ee5\u4e0b\u51e0\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u786e\u8ba4\u6240\u6709\u5bb9\u5668\u4f7f\u7528\u76f8\u540c\u7684\u7f51\u7edc\u6a21\u5f0f\uff08\u63a8\u8350host\uff09<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u786e\u8ba4ROS_MASTER_URI\u6307\u5411\u540c\u4e00\u4e2aroscore<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u786e\u8ba4\u9632\u706b\u5899\u6ca1\u6709\u963b\u6b62\u76f8\u5173\u7aef\u53e3<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528rostopic list\u68c0\u67e5\u8bdd\u9898\u662f\u5426\u53ef\u89c1<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5.3\u5bb9\u5668\u5185\u65e0\u6cd5\u663e\u793aGUI<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u786e\u4fddX11 socket\u5df2\u6302\u8f7d\uff0c\u4e14\u5bbf\u4e3b\u673a\u5df2\u6267\u884cxhost +local:docker\u3002\u5982\u679c\u4f7f\u7528SSH\u8fdc\u7a0b\u8fde\u63a5\uff0c\u9700\u8981\u542f\u7528X11\u8f6c\u53d1\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -X user@host &nbsp;&nbsp;&nbsp;# \u542f\u7528X11\u8f6c\u53d1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5.4\u6302\u8f7d\u76ee\u5f55\u6743\u9650\u95ee\u9898<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Docker\u5bb9\u5668\u9ed8\u8ba4\u4ee5root\u7528\u6237\u8fd0\u884c\uff0c\u521b\u5efa\u7684\u6587\u4ef6\u5728\u5bbf\u4e3b\u673a\u4e0a\u53ef\u80fd\u65e0\u6cd5\u4fee\u6539\u3002\u89e3\u51b3\u65b9\u6848\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u65b9\u6cd51: \u7ed9\u6302\u8f7d\u76ee\u5f55\u5f00\u6743\u9650\uff08\u7b80\u5355\u7c97\u66b4\uff09chmod 777 ~\/workspace<br><br># \u65b9\u6cd52: \u5728\u5bb9\u5668\u5185\u521b\u5efa\u975eroot\u7528\u6237useradd -m rosuser &amp;&amp; su - rosuser<br><br># \u65b9\u6cd53: \u4f7f\u7528user namespace\u6620\u5c04docker run --userns=host ...<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001\u603b\u7ed3<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ROS\u548cDocker\u7684\u7ed3\u5408\u662f\u673a\u5668\u4eba\u5f00\u53d1\u7684\u6700\u4f73\u5b9e\u8df5\u3002ROS\u63d0\u4f9b\u4e86\u5f3a\u5927\u7684\u901a\u4fe1\u548c\u5de5\u5177\u6846\u67b6\uff0cDocker\u63d0\u4f9b\u4e86\u73af\u5883\u9694\u79bb\u548c\u4e00\u952e\u90e8\u7f72\u80fd\u529b\u3002\u4e24\u8005\u7684\u7ed3\u5408\u8ba9\u673a\u5668\u4eba\u8f6f\u4ef6\u7684\u5f00\u53d1\u3001\u6d4b\u8bd5\u548c\u90e8\u7f72\u53d8\u5f97\u524d\u6240\u672a\u6709\u7684\u7b80\u5355\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u952e\u8981\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ROS\u7684\u6838\u5fc3\u662f\u5206\u5e03\u5f0f\u901a\u4fe1\u3002\u8282\u70b9\u901a\u8fc7\u8bdd\u9898\u548c\u670d\u52a1\u4ea4\u6362\u6570\u636e<\/li>\n\n\n\n<li>Docker\u7684\u6838\u5fc3\u662f\u5bb9\u5668\u5316\u3002\u5c06\u5e94\u7528\u548c\u4f9d\u8d56\u6253\u5305\u6210\u53ef\u79fb\u690d\u7684\u955c\u50cf<\/li>\n\n\n\n<li>ROS + Docker\u7684\u5173\u952e\u662f\u7f51\u7edc\u914d\u7f6e\u3002\u4f7f\u7528host\u6a21\u5f0f\u8ba9\u5bb9\u5668\u95f4\u81ea\u7136\u901a\u4fe1<\/li>\n\n\n\n<li>\u6570\u636e\u6301\u4e45\u5316\u9760\u6302\u8f7d\u3002\u91cd\u8981\u6570\u636e\u4e00\u5b9a\u8981\u6620\u5c04\u5230\u5bbf\u4e3b\u673a\u2022 \u955c\u50cf\u7248\u672c\u5316\u7ba1\u7406\u3002\u65b9\u4fbf\u56e2\u961f\u534f\u4f5c\u548c\u90e8\u7f72<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u4ec0\u4e48\u662fROS ROS\uff08Robot Operating System\uff09\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u673a\u5668\u4eba\u8f6f\u4ef6\u6846\u67b6\uff0c\u5b83\u4e0d\u662f\u4f20\u7edf [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-536","post","type-post","status-publish","format-standard","hentry","category-knowledge"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/posts\/536","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ziyuan.work\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=536"}],"version-history":[{"count":4,"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/posts\/536\/revisions"}],"predecessor-version":[{"id":541,"href":"https:\/\/ziyuan.work\/index.php?rest_route=\/wp\/v2\/posts\/536\/revisions\/541"}],"wp:attachment":[{"href":"https:\/\/ziyuan.work\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ziyuan.work\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ziyuan.work\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}