ARTICLE DETAIL

资讯详情

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

宇树G1机器人SSH远程连接与开发环境搭建实战指南

宇树G1机器人SSH远程连接与开发环境搭建实战指南 拿到宇树G1机器人之后我建议你优先干的一件事不是急着推demo、调步态而是先把SSH这条远程通道彻底打通。原因很简单G1机载电脑跑的是Ubuntu系统机身没有外接显示器平时查看状态、改参数、启动遥操作程序、上传代码全靠通过网络登录到那台机载电脑上操作。这篇文章就围绕“通过SSH连接宇树G1”这件事把连接原理、配网方式、首次登录的完整流程、免密登录配置、VSCode远程开发以及高频问题排查全部讲清楚。不管是刚拆箱的新手还是已经上手调试的老手这套过程走完以后处理G1的远程开发都会顺手很多。很多人在这一步容易卡住机器人买到手开发者模式怎么进、IP地址怎么看、SSH连不上是为什么网上信息零散得很。我刚接触G1时也踩过不少坑这篇把它们一次性整理出来省得你再去一个个搜。1. 为什么连接G1必须要用SSH网络怎么搭才靠谱1.1 SSH在机器人开发中到底承担什么角色SSH全称Secure Shell是一个加密的远程登录协议。放在宇树G1这个场景里它就是你操作机载电脑的那扇门。G1的机载电脑运行Ubuntu系统承担运动控制SDK的调用、感知算法、遥操作程序等任务。你从自己的电脑上通过SSH登录进去之后可以执行任意shell命令比如启动ROS 2节点、修改配置文件、看日志还能通过scp或rsync传代码上去。有人会问既然想操作图形界面为什么不用VNC或者远程桌面我的实践经验是机器人开发绝大多数场景用不到图形桌面。查节点状态用ros2 node list看话题数据用ros2 topic echo跑遥操作程序也就一条命令的事命令行完全够用。而且SSH占用带宽极小在WiFi环境下比远程桌面稳定得多不会因为画面传输卡顿影响操作。只有个别需要可视化调试的场景才要考虑VNC或者宇树自带的图像工具。所以SSH是机器人开发者绕不开的基础设施。1.2 宇树G1常见的三种组网方式要做SSH连接第一步是让电脑和G1处于同一个可互相访问的网络里。G1的机载电脑提供了网口和WiFi模块常见的组网方式有三类我按推荐程度排一下第一种是常态开发用的路由器组网。把G1接到一个无线路由器上电脑也连同一个路由器的网络。这样IP分配稳定网络质量也好适合长时间开发和调试。如果手头有交换机用网线把G1和路由器或交换机直连效果更好延迟能压到很低。第二种是出差或现场演示时的手机热点组网。手机开热点G1连接热点电脑也连接该热点。好处是随处可搭缺点是热点环境的IP变化频繁而且手机热点的NAT和防火墙可能会对SSH连接有一些限制连接稳定性一般。第三种是电脑与G1网线直连。用一根网线把电脑的网口和G1的网口直接连起来手动给电脑配置一个与G1同网段的静态IP。这种方式没有路由器参与延迟最低、带宽最大适合传输大数据或者现场救援式排查。缺点是每次要手动设IP比较麻烦。我的建议是在家里或实验室固定开发优先走路由器有线组网在外面临时调手机热点应急真要调试底层运动控制、传大日志就用网线直连。1.3 获取机器人IP地址的几种途径知道了怎么组网紧接着的问题就是G1的IP到底是多少有些朋友以为机器人会固定一个IP实际上默认情况它走DHCP动态获取IP可能每次开机都不一样。获取IP的方法我整理了几种如果G1通过路由器上网进路由器管理后台在“已连接设备”列表里找设备名或者MAC地址对应的IP。这个方法最直接前提是你能登录路由器后台。如果是手机热点安卓手机在热点管理页面能看到已连接设备的IPiPhone的“个人热点”不显示连接设备信息所以iPhone热点模式下IP不太好查建议用其他方式。还有一个办法是借用宇树的官方开发者App或后台工具部分型号可以在App里看到机器人网络状态或IP。如果你手头正好有配套的调测工具这通常是最省事的。如果走网线直连IP可以自己规划。常见做法是把电脑的IP设成192.168.123.100G1的IP按出厂网段设置不同批次可能不同以官方文档为准再ping一下看看通不通。当然如果你能确认网络里有mDNS服务也可以尝试直接用主机名访问比如ssh unitree主机名.local不过这个方法取决于路由器或AP是否开启了mDNS转发实际环境里不一定总是可用。2. 从确认服务到首次SSH登录的完整实操2.1 连接前先确认机器人端SSH服务状态IP拿到手别急着连。先确认机载电脑上的SSH服务真的在运行。G1的出厂镜像一般预装了OpenSSH Server但有些定制镜像或旧版本可能没有装或者服务没有开机自启。这会导致你碰到“Connection refused”这种最让人摸不着头脑的报错。怎么确认最直接的办法是找一个显示器和HDMI线直接接到G1机载电脑的显示接口上进入桌面终端执行sudo systemctl status sshd如果提示服务不存在或未运行先安装再启动sudo apt update sudo apt install openssh-server sudo systemctl enable --now sshd另外还要看一眼防火墙。Ubuntu自带的ufw默认可能没开但如果你之前改过防火墙规则记得放行22端口sudo ufw allow 22/tcp这一步很多人都忽略结果在局域网里ping得通SSH死活连不上查到最后是防火墙拦了端口。2.2 命令行和SSH客户端的两种连接方式确认服务没毛病之后就可以发起连接了。宇树G1的SSH账号和密码以官方出厂信息为准。就我接触过的宇树机器人系列而言常见账号是unitree或者root初版密码通常在机箱标签或配套文档里写着。这里提醒一句拿到机器人第一时间登录上去改掉默认密码避免被局域网里其他人登进去。Linux和macOS终端自带SSH客户端直接敲命令ssh 用户名IP地址比如ssh unitree192.168.123.18Windows 10以后的系统也内置了OpenSSH客户端PowerShell或CMD里可以直接用同样命令。如果你习惯图形化工具可以选MobaXterm、Bitvise SSH Client、Xshell或者PuTTY功能上都差不多区别在于体验。我用MobaXterm比较多它内置文件传输面板拖拽上传文件非常方便。如果SSH端口不是默认的22要额外加参数指定端口ssh -p 2222 unitree192.168.123.18端口是机器人端sshd配置里的Port字段决定的一般默认22只有当系统管理员修改过配置文件才需要这个参数。2.3 首次连接的主机指纹确认首次连接时SSH客户端会显示一段主机指纹比如ECDSA key fingerprint is ...然后询问你是否继续连接。这是SSH防中间人攻击的机制客户端要把服务器的主机公钥指纹存到本机known_hosts文件里之后每次连接都比对指纹防止有人伪造服务器窃取密码。这个提示里有个关键点你要确认显示的指纹和你第一次看到的完全一致。最稳妥的做法是在机器人端执行ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub查看真实指纹再对比客户端显示的指纹是否相同。如果相同就输入yes然后继续输入密码登录。如果指纹不对说明可能存在网络劫持千万别输密码。输入密码后你会看到类似Welcome to Ubuntu的提示符看到unitreexxx:~$就说明已经成功登录到G1机载电脑。3. 免密登录与远程开发环境搭建这才是日常效率的关键3.1 用密钥对免密登录每次SSH连接都要敲密码频繁操作时特别烦而且密码在网络传输链路里再加密也不如密钥认证稳妥。我强烈建议用SSH密钥对替代密码登录这也是G1远程开发里非常值得做的基础配置。密钥对分私钥和公钥两部分。私钥留在你本地电脑上公钥放到机器人的~/.ssh/authorized_keys文件里。登录时服务器用公钥验证客户端是否持有对应的私钥验证通过就放行。生成密钥的命令ssh-keygen -t ed25519 -C g1-dev一路回车会在~/.ssh/下生成id_ed25519和id_ed25519.pub两个文件。然后通过ssh-copy-id把公钥推到机器人上ssh-copy-id unitree192.168.123.18它会提示你输入机器人账号密码输入完公钥就自动加到对方authorized_keys。如果没有ssh-copy-id命令手动追加也可以cat ~/.ssh/id_ed25519.pub | ssh unitree192.168.123.18 mkdir -p ~/.ssh chmod 700 ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys这里有个细节authorized_keys文件的权限必须是600~/.ssh目录权限是700权限过宽OpenSSH会直接拒绝公钥认证这个坑我踩过不止一次。3.2 用~/.ssh/config把连接命令变成一行机器人IP通常不是一成不变的再加上你可能有多个设备要连比如家里、实验室各有一台每次都敲ssh unitree192.168.x.x确实低效。解决办法是配置~/.ssh/config文件。在本地电脑的~/.ssh/config里写Host g1 HostName 192.168.123.18 User unitree IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 30 ServerAliveCountMax 3配置好之后只需要执行ssh g1就能连接完全不用记IP。ServerAliveInterval 30的含义是每隔30秒客户端自动发一个心跳保活包防止长时间没有操作被路由器或服务器断开。这个参数在我们无线连接G1时尤其好用WiFi环境下长时间挂着终端经常因为NAT超时被踢有了心跳就能避免。如果你有多台机器可以在config里继续追加Host块。重复连接同一台机器每次都重新握手也会有点耗时但这通常在几百毫秒内不追求极致可以不用折腾。3.3 VSCode Remote-SSH开发机器人代码连接稳定之后接下来很多人想做的就是在VSCode里像开发本地代码一样开发机器人端的程序。VSCode的Remote-SSH扩展干的就是这件事。它通过在远程端启动一个VS Code Server让你在本地窗口里直接编辑机器人上的文件运行终端甚至调试ROS节点。配置步骤不复杂先在VSCode里安装“Remote - SSH”扩展然后按F1或CtrlShiftP输入“Remote-SSH: Connect to Host”选择或填写你的SSH配置就是刚才config里的Host名称。连接成功后左下角显示“SSH: g1”打开的文件夹是机器人上的目录终端也自动跑在机器人上。这里有个常见困惑就是你本地装的扩展在远程窗口里显示不可用有时还会弹出一条提示此扩展在此工作区中被禁用因为其被定义为在远程扩展主机中运行。请在 ssh: g1 中安装。这其实不是报错而是VSCode的机制某些扩展只适合安装在远程端比如Python、ROS相关扩展需要在远程环境跑解释器和linting工具。你只需要在弹出的提示里点“Install in SSH: g1”或者直接在扩展面板里选择“Install in SSH Host”把它装到远程端它就能正常工作了。简单记代码解析类的扩展装远程界面美化类的扩展装本地。Remote-SSH还内置端口转发功能。如果G1上跑了一个Web服务或某个可视化端口本地浏览器想直接访问可以在VSCode的“端口”面板里添加机器人IP的端口号VSCode会自动帮你转发到本地localhost。这样一来机器人上的开发服务也能直接从本地浏览器查看非常方便。3.4 端口转发与SSH反向隧道打通内外网调试链路说到端口转发SSH本身也提供了强大的隧道能力。正向转发适合把机器人上的端口映射到本地比如G1上某个控制服务的HTTP接口跑在8080端口你想在本地浏览器调试ssh -L 8080:localhost:8080 unitree192.168.123.18这条命令的意思是把本地的8080端口流量通过SSH隧道转发到机器人端的8080端口。之后本地浏览器访问http://localhost:8080实际请求会被安全地送到机器人上的服务。反向隧道则是从机器人主动发起连接把本地电脑的某个端口暴露给机器人侧或者反过来把机器人端口映射到远端。比如你人在外面但想访问处于内网的G1而G1可以通过某种方式连接到一台有公网IP的服务器或者连接到任意一台你能访问的电脑这时在机器人上执行ssh -R 2222:localhost:22 user你的电脑IP这样你的电脑上连localhost:2222就相当于连到机器人的22端口。反向隧道的价值在于不需要在机器人侧开公网端口对远程技术支持特别有用。不过说实话这个场景对多数开发者用不上知道原理就行真遇到再回来翻。4. 连接失败高发问题排查与避坑技巧4.1 五个高频报错速查表SSH连接G1最常见的失败情形我整理了一张速查表基本覆盖90%的情况报错信息可能原因处理方案Connection refusedsshd未运行/端口不对/被防火墙拦截检查systemctl status sshd确认端口放行22端口Connection timed out不在同一网段/IP不通/路由器隔离ping目标IP确认WiFi同网段关闭AP隔离Permission denied账号密码错误/公钥认证失败核对账号密码检查authorized_keys权限为600Host key verification failed机器人系统重装过指纹变化删除本机known_hosts里对应旧记录Remote side unexpectedly closed网络抖动/MTU问题/sshd异常换有线连接降低MTU为1400查看sshd日志排查时有个万能步骤先在本地ping 机器人IP。ping不通说明是网络层问题从网段、路由器这边查。ping得通但SSH连不上再考虑端口和服务状态。绝大多数初学者栽在网段不一致上比如电脑连的是5G频段热点机器人连的是2.4G频段热点看似同一个路由器实际不同SSID下IP网段也可能不一样这点要特别注意。4.2 登录后卡顿、敲命令无响应SSH能连上但执行命令感觉明显迟滞或者偶尔敲了命令没反应这种情况在WiFi环境非常常见。我遇到过好几次最后定位到的问题几乎都是一样的信号干扰或者机器人正在跑高负载任务CPU接近占满命令执行自然就慢。先分清楚卡在哪个环节。在本地跑ssh -vvv 用户名IP看详细握手日志如果建立连接阶段就有大量重传说明链路质量问题换个信道或者直接用网线。如果连接很快、登录成功但敲命令响应慢多半是机器人端负载过高登录后先执行htop看一下CPU和内存大概率能看到某几个进程占了超多资源。还有一个冷门的点终端的自动换行和字符编码问题。如果输出日志里有大量特殊字符或彩色控制字符SSH终端渲染可能卡顿尤其是在Windows的CMD里连Linux机器人的时候。这时候换用MobaXterm或VSCode终端能立竿见影。4.3 SSH断连后任务保活nohup与tmux最后一个高频问题不是连接不上而是连上了、命令跑了一半窗口一关任务就没了。有人在群里问“ssh命令执行过程中退出命令还会继续么”答案是你直接启动的交互式命令会收到SIGHUP信号随SSH会话退出一起终止尤其是那些长时间运行的遥操作程序和日志采集任务。处理办法有两个我都推荐你用一是用tmux二是用nohup。tmux是终端复用器在SSH会话里创建一个常驻的会话即使断开连接会话里的进程照常运行。重新连上后执行tmux attach就能回到之前的界面非常适合同步跑多任务tmux new -s teleop # 在tmux会话里启动遥操作程序 ros2 run 你的遥操作包 teleop_node按Ctrlb再按d可以脱离会话SSH断了也不影响里面的进程。下次登录直接tmux attach -t teleopnohup的方式更轻量适合一条命令搞定不交互的场景nohup ros2 run 你的遥操作包 teleop_node /tmp/teleop.log 21 进程会在后台跑日志写到文件里即使SSH断开也不受影响。需要时再cat /tmp/teleop.log慢慢看。5. 最后送你的几个实战建议把SSH这套流程跑通之后我个人建议你再花几分钟做两件事。第一在路由器里给G1绑定一个固定IPDHCP静态分配以后就不用每次到后台查地址。第二测试一下整个链路的稳定性在机器人上跑一个高频话题然后SSH持续挂着跑半小时如果中途断开优先怀疑WiFi信号或NAT超时调整心跳参数和使用的频段。这两件事做到了后续所有基于SSH的开发调试都会省心很多。最后再分享一个小习惯每台U树机器人的SSH配置我都单独写在~/.ssh/config里用固定的Host别名访问。设备一多这个文件就是你的连接驾驶舱配合VSCode Remote-SSH整个体验跟开发本地代码几乎没有区别。希望这篇能帮你少走弯路顺利把G1调起来。
返回列表