ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Webots 外部机器人控制器(Extern Robot Controller)完整指南:从 IPC 本地调试到 TCP 远程控制

Webots 外部机器人控制器(Extern Robot Controller)完整指南:从 IPC 本地调试到 TCP 远程控制 科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载导读本文围绕 Webots 仿真器中的extern外部机器人控制器机制展开当 Robot 节点的controller字段被设为extern时Webots 不再自动启动控制器进程而是等待用户通过随安装包分发的webots-controller启动器手动拉起控制器并经由进程间通信IPC或 TCP 协议建立连接。读完本文你将掌握启动器的全部命令行选项、本地单机/多仿真/多机器人场景下的连接配置方法、远程机器通过 TCP 连接 Webots 实例的完整步骤以及 snap 版本和 MATLAB 控制器的特殊处理方式并能结合仓库源码理解其底层连接原理。引言什么是 Extern Robot Controller在默认工作方式下Webots 会根据每个 Robot 节点controller字段中填写的控制器名称在仿真启动时自动拉取并运行对应的控制器进程。然而当该字段被设置为特殊值extern时行为完全不同Webots不会启动任何控制器进程该机器人表现为其controller字段为空字符串的状态即暂时不受控制只要用户在同一台计算机上手动启动一个 Webots 控制器程序它就会主动尝试连接这个extern机器人并接管其控制权用户也可以从远程计算机通过TCP 连接启动extern控制器实现对远端 Webots 实例中机器人的控制。这一机制在仓库源码中有清晰的对应实现在 src/webots/control/WbController.cpp 中机器人是否属于外部控制器由mExtern mRobot-controllerName() extern判断见 WbController.cpp#L102而 src/webots/nodes/WbRobot.cpp 中控制器路径解析逻辑也会对none与extern两个特殊值做分支处理见 WbRobot.cpp#L527-L529。为什么需要外部控制器要求用户手动启动控制器看似不便但在很多实际场景中反而极其有用因为用户对控制器进程拥有完全的控制权可放入调试环境运行例如gdb等命令行调试器、$ shell命令行工具或者 Visual C、Eclipse、PyCharm 等集成开发环境IDE从而可以设置断点、单步执行标准流完全自主控制器的stdout与stderr不再被转发到 Webots 控制台而是保持在用户终端中同时还可以像普通程序一样读取stdin标准输入流可分离计算资源远程启动外部控制器意味着 Webots 与控制器可以运行在不同机器上当两个进程所需的硬件规格差异较大时例如仿真需要高性能 GPU、控制器需要特定传感器硬件这一特性尤为实用。注意若 Robot 节点的robot.synchronization字段设为TRUEWebots 会等待外部控制器启动后再继续推进仿真否则仿真将照常运行无论控制器是否已经启动。启动器LauncherWebots 随安装包分发一个控制器启动器webots-controller所有外部控制器文件都必须通过它来启动。启动器支持的控制器文件类型如下类型文件扩展名可执行文件Linux/macOS 无扩展名Windows 为.exePython.pyJava.jar与.classMATLAB.m启动器要求WEBOTS_HOME环境变量指向 Webots 的安装目录例如export WEBOTS_HOME/home/username/webots如果你使用的是 snap 版本请参考后文 使用 snap 版 Webots 运行外部控制器 一节。各平台下启动外部控制器的命令行格式如下Windowswebots-controller.exe [options] path/to/controller/file [controller-args]Linux$WEBOTS_HOME/webots-controller [options] path/to/controller/file [controller-args]macOS$WEBOTS_HOME/Contents/MacOS/webots-controller [options] path/to/controller/file [controller-args]注意控制器文件路径可以是绝对路径也可以是相对于启动器运行目录的相对路径。从源码角度看启动器本身是一个 C 程序位于 src/controller/launcher/webots_controller.c。它启动时会首先检查WEBOTS_HOME见get_webots_home()解析命令行选项然后根据文件扩展名分派到不同的启动分支可执行文件走execvp、Python 走python3 -u、MATLAB 走matlab -batch或-r交互模式、Java 走java -classpath ... -Djava.library.path...同时会为各类控制器自动配置Path/LD_LIBRARY_PATH/DYLD_LIBRARY_PATH/PYTHONPATH等环境变量对应源码中的exec_java_config_environment()、python_config_environment()、matlab_config_environment()等函数。启动器选项详解webots-controller支持以下选项具体用例见后文 连接场景配置 一节选项说明--help显示帮助信息并退出。--protocolipc\|tcp定义控制器与 Webots 之间的通信协议。默认为ipc当 Webots 与外部控制器运行在同一台机器上时应使用ipc当连接到远程 Webots 实例时应使用tcp。--ip-addressip-address运行 Webots 实例的远程机器的 IP 地址仅用于tcp协议即远程控制器。--portport控制器应连接的端口默认1234这也是 Webots 的默认端口。当目标机器上运行多个 Webots 实例时用此选项指定要连接的特定实例Webots 实例的端口可在其启动时通过--port命令行选项设置。--robot-namerobot-name当 Webots 实例中有多个机器人等待外部控制器时通过机器人名称指定目标机器人。--interactive以交互调试模式启动 MATLAB详见 MATLAB 相关文档。--matlab-pathmatlab-path针对 MATLAB 控制器指定特定版本 MATLAB 可执行文件的路径默认情况下启动器会在系统默认的 MATLAB 安装目录中查找。--stdout-redirect将控制器的stdout重定向到 Webots 控制台。--stderr-redirect将控制器的stderr重定向到 Webots 控制台。源码层面这些选项的解析集中在 webots_controller.c 的 parse_options() 函数中。解析完成后启动器会根据协议、IP、端口与机器人名称拼装出WEBOTS_CONTROLLER_URL环境变量并写入进程环境例如ipc://1234/robot_name或tcp://192.168.1.10:1234/robot_name。这也是 libController 后续用于连接 Webots 的关键凭据。此外--stdout-redirect与--stderr-redirect实际上对应putenv(WEBOTS_STDOUT_REDIRECT1)与putenv(WEBOTS_STDERR_REDIRECT1)Webots 端会据此决定是否把控制器输出接入控制台。连接场景配置运行本地外部控制器时Webots 与控制器必须使用同一个用户账户对于运行在不同机器上的远程外部控制器则没有此要求。下面按复杂度从低到高逐一说明各类场景。单一仿真 单个本地外部机器人控制器这是最简单的情形同一台机器上只运行一个 Webots 仿真且仿真中只有一个机器人需要外部控制。做法是将该机器人的controller字段设为extern用启动器启动控制器无需任何额外选项默认参数会自动定位到正确的 Webots 实例与唯一的可用机器人。一旦某个外部控制器成功连接到该机器人Webots 会拒绝任何其他连接尝试后续尝试连接的控制器会立即终止。这一行为在源码中有直接体现WbController.cpp 的 setTcpSocket() 与 addLocalControllerConnection() 中当mSocket或mTcpSocket已存在时会输出 refusing connection attempt from another extern controller. 并拒绝新连接。单一仿真 多个本地外部机器人控制器当单个仿真中有多个机器人需要外部控制时为每个需要外部控制的机器人将controller字段设为extern对每个机器人使用启动器的--robot-name选项将其设置为对应 Robot 节点的name字段值启动的控制器将连接到名称匹配的extern机器人为仿真中的每个机器人重复上述操作每个机器人各开一个终端。多个并发仿真 单个本地外部机器人控制器若同一台机器上同时运行多个仿真且每个仿真中只有一个机器人需要外部控制则需要告诉控制器应该连接到哪一个 Webots 实例在启动 Webots 时使用--port命令行选项为该实例指定 TCP 端口启动控制器时使用启动器的--port选项将其设置为目标 Webots 实例的 TCP 端口。多个并发仿真 多个本地外部机器人控制器这是最复杂的本地场景多个仿真同时运行且每个仿真有多个机器人需要外部控制。此时每个控制器都需要同时指定目标实例与目标机器人用启动器--port选项指定目标 Webots 实例的 TCP 端口与启动 Webots 时的--port选项对应用启动器--robot-name选项指定目标机器人的名称。远程外部控制器extern控制器也可以从远程机器启动配置要点如下启动控制器时将--protocol选项设为tcp--ip-address选项必须设置为运行目标 Webots 实例的远程机器的 IP 地址若远程机器上运行多个 Webots 实例则用--port指定目标实例的 TCP 端口即启动 Webots 时通过--port设置的值若目标实例中有多个机器人等待外部连接可用--robot-name指定要连接的机器人名称。Webots 端还提供了连接 IP 白名单能力在 Webots 偏好设置Preferences的Network选项卡中以X.X.X.X格式添加允许连接的 IP 地址也可以使用 CIDR 子网掩码格式X.X.X.X/netmask允许一个地址段若列表为空则允许所有传入连接。源码中白名单校验逻辑位于 WbController.cpp 的 setTcpSocket()Webots 读取Network/nAllowedIPs与Network/allowedIP0..N偏好值将远程连接的对端地址与允许列表逐项做子网匹配isInSubnet不匹配则直接拒绝连接。由此可以推断默认空列表等价于不设任何访问限制。使用 snap 版 Webots 运行外部控制器使用 snap 版 Webots 编译和执行外部控制器时需要设置以下环境变量export WEBOTS_HOME/snap/webots/current/usr/share/webots export LD_LIBRARY_PATH$WEBOTS_HOME/lib/controller由于 snap 沙箱机制的限制Webots 必须使用一个特殊的临时目录来与机器人控制器共享信息启动 snap 版 Webots 时如果WEBOTS_TMPDIR尚未设置启动器会自动计算该变量该变量由SNAP_USER_COMMON环境变量推导而来通常指向/home/username/snap/webots/common这是一个 Webots 与用户程序都能访问的目录相应地libController 会自动检查该目录及其内容以决定是否用它来与 Webots 通信官方建议不要覆盖WEBOTS_TMPDIR除非你有意试验其他通信机制。运行 MATLAB 外部控制器MATLAB 控制器同样可以通过启动器启动默认情况下新启动的 MATLAB 实例运行在非交互batch模式传入--interactive选项可覆盖此行为改为运行完整的 MATLAB 桌面 GUI便于调试控制器详见 MATLAB 使用指南。无论哪种模式启动器都会在以下位置按操作系统区分查找最新安装的 MATLAB 版本WindowsC:\Program Files\MATLAB\R20XXx\bin\win64\MATLAB.exeLinux/usr/local/MATLAB/R20XXx/bin/matlabmacOS/Applications/MATLAB_R20XXx.app也可以使用--matlab-path选项传入 MATLAB 可执行文件的绝对路径以指定自定义安装位置。源码佐证get_matlab_path()见 webots_controller.c#L169-L228正是按上述三个默认目录扫描MATLAB_R20*/R20*命名的目录并选择版本号最大的一个而 MATLAB 分支通过-batch非交互或-r交互Windows 上为-wait -r参数调用launcher.m位于$WEBOTS_HOME/lib/controller/matlab控制器参数则通过WEBOTS_CONTROLLER_ARGS环境变量传递给 MATLAB 脚本见add_controller_arguments()。使用示例以下以 Nao 机器人演示一个完整的本地外部控制器使用流程设置WEBOTS_HOME为 Webots 安装目录例如export WEBOTS_HOME/usr/local/webots打开示例世界文件$WEBOTS_HOME/projects/robots/softbank/nao/worlds/nao_demo.wbt对应仓库中的 projects/robots/softbank/nao/worlds/nao_demo.wbt。如果仿真正在运行先停止仿真并执行 Revert还原。在场景树Scene Tree中打开 Nao 节点将其controller字段从nao_demo改为extern。保存仿真重新加载并运行。打开一个终端用启动器启动nao_demo控制器$WEBOTS_HOME/webots-controller $WEBOTS_HOME/projects/robots/softbank/nao/controllers/nao_demo/nao_demo提示如果需要连接到远程 Webots 实例控制器可以这样启动$WEBOTS_HOME/webots-controller --protocoltcp --ip-address127.0.0.1 $WEBOTS_HOME/projects/robots/softbank/nao/controllers/nao_demo/nao_demo只需将127.0.0.1替换为远程机器的 IP 地址即可。此时应能在仿真中看到 Nao 机器人被你刚启动的nao_demo程序控制并运动起来。底层连接原理Webots 端如何等待并接受外部控制器理解启动器用法之外了解 Webots 端的等待与接受逻辑有助于排查连接问题。从 src/webots/control/WbController.cpp 的start()方法可以看到完整机制当机器人被标记为mExtern时Webots 不会创建QProcess启动任何子进程而是打印等待消息Waiting for local or remote connection on port %1 targeting robot named %2.见 WbController.cpp#L247-L267其中端口来自WbStandardPaths::webotsTmpPathId()Webots 在临时目录webotsTmpPath()/ipc/encodedName下创建一个名为extern或intern的文件作为连接标记并启动一个QLocalServerUnix 域套接字监听本地 IPC 连接见 WbController.cpp#L309-L338Windows 平台则使用命名管道风格的服务器名webots-id-encodedName本地连接由addLocalControllerConnection()处理远程 TCP 连接由addRemoteControllerConnection()处理两者都会在已连接时拒绝第二个外部控制器的连接请求远程 TCP 服务器由 src/webots/gui/WbTcpServer.cpp 承载端口默认 1234Webots 启动时可通过--port选项修改若端口被占用会尝试向后顺延并给出使用--port的提示。仓库的自动化测试也覆盖了该机制tests/api/controllers/extern/extern.c 与 tests/api/worlds/extern.wbt 演示了在控制器内部清空 Webots 注入的环境变量、手动设置WEBOTS_CONTROLLER_URLextern1并 fork 出子进程来连接extern机器人的完整流程可作为自定义外部控制器的参考模板。小结外部机器人控制器是 Webots 将仿真端与控制器端解耦的关键能力通过在 Robot 节点上使用extern占位符配合webots-controller启动器与WEBOTS_CONTROLLER_URL连接凭据开发者可以在本地以任意调试环境运行控制器也可以跨机器通过 TCP 协议远程驱动仿真中的机器人。掌握--protocol、--ip-address、--port、--robot-name四个核心选项的组合规则即可覆盖从单机单机器人到多机多仿真多机器人的全部连接场景。赞分享科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载相关推荐React Styleguidist 多分区 Style Guide 实战sections 嵌套、pagePerSection 页面化与模式控制全解析React Styleguidist 多分区 Style Guide 实战sections 嵌套、pagePerSection 页面化与模式控制全解析 导读科研自动驾驶物理引擎ALOHA开源机器人远程控制系统从入门到精通的完整指南ALOHA开源机器人远程控制系统从入门到精通的完整指南 ALOHA低成本开源硬件双臂远程操作系统是一个革命性的开源机器人平台专为研究人员、工程师和教育工机器人具身智能Webots Controller Plugin 控制器插件开发指南Robot Window 与 Remote-Control 插件原理与实战Webots Controller Plugin 控制器插件开发指南Robot Window 与 Remote Control 插件原理与实战 本指南围绕 W科研自动驾驶物理引擎上一篇3分钟快速诊断NatTypeTester终极网络NAT类型检测指南下一篇3分钟掌握免费下载B站大会员4K视频的Python终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表