今天给大家唠唠我在折腾 ROS 端口映射时踩过的那些坑。事情是这样的,前阵子我不是搞个小项目嘛需要用到 ROS,但我这网络环境有点复杂,设备都在不同的局域网里,所以就得想办法让它们能互相通信,这就涉及到端口映射。
我以为这玩意儿挺简单的,不就是配置一下路由器的事儿嘛没想到,这一上手就给我来个下马威。
我得登录到路由器后台。我这人平时不怎么记这些东西,翻箱倒柜找半天说明书,终于找到默认的用户名和密码。输入进去,还真进去!
折腾防火墙规则
登录后台之后,第一步,点击IP,找到“Firewall”这一项,再点进去就能看到“Nat”这个选项卡。这里就是配置端口映射的地方。我记得以前玩游戏的时候也弄过端口映射,所以还算轻车熟路。
点击左上角那个红色的加号,弹出一个新窗口。在这里,要添加一条新的规则。在“Chain”这里,选择“dstnat”,意思是目标地址转换。这应该算是通用操作,先这么配置就对。
然后,在“*”这里填上你要映射的公网IP地址。这一步挺关键的,因为我每次重新拨号,公网IP都会变,所以每次搞端口映射都得先看看自己现在的公网IP是多少。
创建ROS节点
路由器这边搞定,接下来就得在我的设备上动手。我得先创建一个ROS节点。打开终端,先用“cd”命令切换到我的ROS工作空间。然后,我用“catkin_create_pkg”命令创建一个新的ROS包。这一步主要是为让我的设备能作为一个节点加入到ROS网络里。
配置脚本
接下来得写个脚本,让设备能自动更新端口映射规则。我在网上找一些资料,参考一下,写一个简单的shell脚本。脚本内容大概就是获取当前的公网IP,然后更新到路由器上的端口映射规则里。脚本不复杂,但是我这个人写代码经常丢三落四,所以调试半天才弄当时满脑子“怎么回事?”,又是一阵折腾。
设置定时任务
一步,我得让这个脚本定时执行。我用的是“System->Scheduler”这个功能。在这里,我添加一个新的定时任务,设置执行间隔为2分钟。这样,每隔2分钟,脚本就会自动运行一次,检查公网IP是否变化,并更新端口映射规则。都设置好之后,我在脚本里加一句“loginfo "ADSL映射修改完毕"”,每次脚本执行完,我就知道更新成功。
一番折腾下来,总算是把ROS端口映射搞定。虽然过程有点曲折,但也学到不少东西。所以说,实践出真知,多动手折腾总是有收获的。以后再遇到类似的问题,我就不用再抓瞎。