1. 宇树G1机器人SSH连接实战:从零搭建远程调试链路
宇树G1这台人形机器人,拿到手第一件事不是急着让它走路,而是先把远程连接打通。为什么?因为G1本体上跑的是Ubuntu系统,板载算力有限,你不可能每次都蹲在机器人旁边接显示器敲键盘。SSH连接是后续所有开发工作的基础设施——无论是改代码、传文件、看日志,还是跑调试脚本,都得先有一条稳定的远程通道。我前后折腾过好几台G1,也帮同事配过不少次,踩过的坑主要集中在网络配置和SSH权限这两块。这篇文章就把整个流程拆开讲清楚,从MobaXterm的安装配置到网络调试的完整链路,再到常见问题的排查方法,争取让你一次搞定。
适合谁看?如果你刚拿到G1,或者之前没怎么接触过Linux远程连接,这篇就是给你写的。有经验的老手也可以看看网络调试那部分,G1的网络配置有几个容易忽略的细节。
2. 为什么选MobaXterm而不是其他SSH工具
2.1 SSH工具选型的几个核心考量
Windows下连SSH的工具有很多,PuTTY、Xshell、MobaXterm、Windows Terminal自带的ssh命令,甚至VS Code的Remote-SSH插件。我选MobaXterm作为主力工具,原因有几个。
第一是一体化。MobaXterm自带SFTP文件浏览器,左边是终端,右边是文件树,拖拽就能传文件。调试机器人经常需要改配置文件、传脚本、下载日志,有这个文件面板省事太多。PuTTY要单独开WinSCP,Xshell的文件传输也没这么顺手。
第二是会话管理。G1调试可能涉及多个连接目标——机器人本体、机载计算机、遥控器端的树莓派,每个都有不同的IP和端口。MobaXterm的会话保存功能可以一键切换,不用每次重新输IP和密码。
第三是X11转发。G1上跑的一些可视化工具(比如RViz、rqt)需要图形界面,MobaXterm内置X Server,连上之后直接就能弹出窗口,不需要额外装VcXsrv或者Xming。这个在调试SLAM和导航的时候特别有用。
第四是免费版够用。MobaXterm家庭版免费,功能没有阉割,对个人开发者来说完全足够。Xshell免费版有会话数量限制,PuTTY又太简陋。
注意:MobaXterm有安装版和便携版两种,建议下便携版,解压就能用,换电脑直接拷走,配置也跟着走。
2.2 MobaXterm的下载与安装要点
官网下载的时候注意选对版本。Home Edition是免费的,Professional Edition要收费。下载页面有两个包:Installer edition和Portable edition。我推荐Portable edition,原因前面说了,便携。
安装过程没什么好说的,一路Next就行。但有几个设置建议在第一次打开的时候就改掉:
- 关闭自动更新检查:Settings → Configuration → General → 取消勾选“Check for updates on startup”。调试现场网络可能不通外网,每次弹更新提示很烦。
- 设置默认字体:Settings → Configuration → Terminal → Font settings。默认字体在中文环境下显示有点挤,换成Consolas或者JetBrains Mono,字号12-14比较舒服。
- 开启日志保存:Settings → Configuration → Terminal → Logging。建议勾选“Automatically save terminal output to file”,路径设一个固定目录。调试机器人经常需要回溯之前的输出,有日志文件省得重新跑一遍。
2.3 中文界面设置方法
MobaXterm默认是英文界面,网上搜“mobaxterm怎么改中文”的人不少。说实话,MobaXterm官方并没有提供中文语言包,所谓的“汉化”都是第三方做的,稳定性参差不齐。我的建议是不要汉化,英文界面用两天就习惯了,汉化版反而可能引入奇怪的bug。
如果你确实需要中文环境,有两个折中方案:一是用Windows Terminal + ssh命令,Windows Terminal可以配合中文输入法使用;二是用VS Code的Remote-SSH插件,VS Code本身有中文语言包,远程连接体验也不错。但MobaXterm的X11转发和文件面板是VS Code比不了的,所以我还是主力用MobaXterm。
3. G1网络配置与SSH连接的前置准备
3.1 G1的网络接口与默认配置
宇树G1本体上有一个千兆网口,默认IP段是192.168.123.x。这个网段是宇树内部用的,机器人本体的地址通常是192.168.123.161,机载计算机可能是192.168.123.162或者别的。具体地址取决于你买的配置版本,拿到手第一件事是确认清楚。
连接方式有两种:
- 直连:用网线把电脑和G1的网口直接连起来。这种方式最简单,但需要把电脑的网卡IP设成192.168.123.x网段的静态地址,比如192.168.123.100,子网掩码255.255.255.0。
- 通过路由器/交换机:把G1和电脑都接到同一个路由器上。这种方式的好处是电脑还能同时上网,但需要确认路由器的DHCP没有把G1的地址分走,或者G1本身是静态IP。
我一般用直连,因为调试现场不一定有路由器,直连最可靠。直连的时候电脑要设静态IP,步骤是:控制面板 → 网络和共享中心 → 更改适配器设置 → 右键以太网 → 属性 → Internet协议版本4 → 使用下面的IP地址。填192.168.123.100,掩码255.255.255.0,网关不填。
注意:设完静态IP之后,电脑可能暂时上不了网,这是正常的。调试完记得改回自动获取。
3.2 验证网络连通性
设好IP之后,先ping一下机器人:
ping 192.168.123.161如果通,说明物理链路和IP配置没问题。如果不通,按这个顺序排查:
- 网线是不是插好了?G1的网口有指示灯,插上之后灯会亮。
- 电脑的静态IP设对了吗?
ipconfig看一下。 - 防火墙是不是拦了?Windows防火墙有时候会拦ICMP,临时关掉试试。
- G1是不是还没启动完?G1开机需要一两分钟,系统完全起来之前网络服务可能没就绪。
ping通之后,再确认SSH端口是不是开的:
telnet 192.168.123.161 22如果显示Connected,说明22端口是通的。如果连不上,可能是SSH服务没启动,需要接显示器到G1上检查。
3.3 G1上的SSH服务配置
G1出厂时SSH服务通常是开着的,但有些版本可能没开。如果22端口不通,需要接上显示器和键盘,在G1本机上操作:
sudo systemctl status ssh如果显示inactive,就启动它:
sudo systemctl start ssh sudo systemctl enable sshenable是为了开机自启,不然每次重启都要手动开。
另外检查一下SSH配置文件:
sudo nano /etc/ssh/sshd_config确认这几项:
Port 22:端口号,默认22就行PermitRootLogin:建议设成no,用普通用户登录后再sudoPasswordAuthentication yes:允许密码登录,初期调试方便
改完配置要重启SSH服务:
sudo systemctl restart ssh4. MobaXterm连接G1的完整操作流程
4.1 创建SSH会话
打开MobaXterm,点左上角的Session按钮,选SSH。填写:
- Remote host:192.168.123.161
- Specify username:勾上,填G1上的用户名。宇树默认的用户名通常是
unitree或者user,具体看你的机器。 - Port:22
点OK之后,会提示输入密码。宇树G1的默认密码一般是123或者unitree,同样看版本。第一次连接会弹一个主机密钥确认,点Accept就行。
连上之后,左边会出现SFTP文件面板,右边是终端。终端里可以敲命令,文件面板可以拖拽传文件。
4.2 会话保存与快速切换
第一次连上之后,MobaXterm会自动把这个会话保存到左侧的会话列表里。右键可以重命名,比如改成“G1-本体”。如果还有别的设备,比如机载计算机、遥控器,分别建会话,命名清楚。
会话多了之后,可以用文件夹分组。右键左侧空白处 → New folder,把相关的会话拖进去。我一般按项目分,比如“G1调试”、“G1导航”、“G1视觉”这样。
4.3 使用SSH密钥免密登录
每次输密码太麻烦,配SSH密钥可以免密登录。步骤:
- 在MobaXterm的终端里生成密钥对:
ssh-keygen -t rsa -b 4096一路回车,默认保存在~/.ssh/id_rsa。
- 把公钥传到G1上:
ssh-copy-id unitree@192.168.123.161输入一次密码,之后就不用再输了。
- 如果
ssh-copy-id不能用,手动传:
cat ~/.ssh/id_rsa.pub | ssh unitree@192.168.123.161 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"注意:Windows下用MobaXterm生成密钥时,
.ssh目录的权限可能会出问题。如果遇到bad owner or permissions on c:\users\thinkpad/.ssh/config这个报错,说明权限太开放了。解决方法是在Windows的%USERPROFILE%\.ssh目录上右键 → 属性 → 安全 → 高级 → 禁用继承 → 删除所有用户,只保留你自己。或者用icacls命令:
icacls %USERPROFILE%\.ssh /inheritance:r icacls %USERPROFILE%\.ssh /grant:r "%USERNAME%:F"4.4 MobaXterm的实用功能配置
日志保存:前面提过,在Settings里开自动保存。每个会话的日志会存成单独的文件,文件名带时间戳。调试的时候如果机器人突然抽风,翻日志就能找到线索。
循环执行命令:MobaXterm有个Macro功能,可以录制一串命令然后循环执行。比如你想每隔5秒看一次某个话题的数据,可以录一个rostopic echo的宏,设成循环。不过更推荐直接在终端里用watch命令:
watch -n 5 rostopic echo /joint_states多标签:MobaXterm支持标签页,可以同时开多个会话。比如一个标签跑roscore,一个标签跑rviz,一个标签看日志。快捷键Ctrl+Tab切换。
X11转发:连上G1之后,如果G1上装了图形工具,直接运行就会弹窗。比如:
rvizMobaXterm会自动处理X11转发,窗口弹在Windows上。如果弹不出来,检查Settings → Configuration → X11 → 确认X11 forwarding是开的。
5. 网络调试的进阶操作与工具配合
5.1 用网络调试助手排查UDP通信
G1的很多传感器数据是通过UDP广播的,比如IMU、关节状态。如果ROS话题收不到数据,可能是UDP包没发出来或者被防火墙拦了。这时候可以用网络调试助手(比如网络调试助手v5.0.3)来抓包。
用法:在Windows上打开网络调试助手,选UDP,绑定端口(比如8888),然后让G1往这个端口发数据。如果收到了,说明G1的UDP发送正常,问题在ROS的订阅端。如果收不到,检查G1的发送配置和Windows防火墙。
注意:Windows防火墙默认会拦UDP入站。调试的时候临时关掉防火墙,或者给网络调试助手加白名单。
5.2 用Wireshark做深度抓包
网络调试助手只能看应用层,要看更底层的信息得用Wireshark。在Windows上装Wireshark,选对网卡(连G1的那张),过滤条件设ip.addr == 192.168.123.161,就能看到所有往来包。
常见问题:如果看到大量TCP重传,说明网络质量差,可能是网线接触不良或者网口协商速率有问题。如果看到UDP包发出去了但没回应,说明对端没监听。
5.3 VS Code Remote-SSH作为补充
MobaXterm适合命令行操作,但写代码还是VS Code舒服。VS Code的Remote-SSH插件可以直接连G1,在本地编辑文件,保存后自动同步到远程。配置方法:
- 装Remote-SSH插件
- Ctrl+Shift+P → Remote-SSH: Connect to Host → 输入
unitree@192.168.123.161 - 连上之后,打开远程文件夹,就能像本地一样编辑了
VS Code Remote-SSH和MobaXterm可以同时用,互不冲突。我一般用MobaXterm跑命令,用VS Code改代码。
5.4 Git SSH配置与代码同步
G1上如果要从Git仓库拉代码,需要配SSH密钥。步骤和前面配免密登录类似,但公钥要传到Git服务器(比如GitLab、GitHub)。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" cat ~/.ssh/id_rsa.pub把输出的公钥复制到GitLab的Settings → SSH Keys里。然后测试:
ssh -T git@gitlab.com如果显示Welcome,说明配好了。
注意:G1上可能没有外网,拉代码需要通过内网Git服务器。如果内网Git服务器用的是自签名证书,可能还需要配
git config --global http.sslVerify false,但这样不安全,建议把证书加到信任列表里。
6. 常见问题与排查技巧实录
6.1 SSH连接失败排查表
| 现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| ping不通 | 网线没插好 | 看网口指示灯 | 重新插网线 |
| ping不通 | IP设错 | ipconfig检查 | 改成192.168.123.100 |
| ping通但SSH连不上 | SSH服务没启动 | 接显示器查systemctl status ssh | sudo systemctl start ssh |
| SSH连上但秒断 | 密钥权限问题 | 看MobaXterm报错 | 修.ssh目录权限 |
| 连上但很卡 | 网络质量差 | Wireshark看重传 | 换网线或换网口 |
| X11弹不出窗口 | X11转发没开 | 检查MobaXterm设置 | 开启X11 forwarding |
6.2 Ubuntu SSH无法连接的几种情况
G1上跑的是Ubuntu,SSH连不上的原因和普通Ubuntu服务器类似。最常见的是SSH服务没启动,其次是防火墙拦了22端口。Ubuntu默认的ufw防火墙如果开了,需要放行:
sudo ufw allow 22还有一种情况是SSH配置改了但没重启。改完sshd_config必须sudo systemctl restart ssh,不然不生效。
如果报Connection refused,说明端口没开;如果报Connection timed out,说明网络不通或者防火墙DROP了包。
6.3 MobaXterm保存日志的正确姿势
MobaXterm的日志功能有个坑:默认只保存终端输出,不保存你输入的命令。如果要连输入一起保存,需要在Settings → Configuration → Terminal → Logging里勾选“Include keystrokes in log file”。但这样日志里会混入你的按键,看起来比较乱。我的做法是开两个日志:一个保存输出,一个用script命令在终端里录完整的会话。
script -a /tmp/session_$(date +%Y%m%d_%H%M%S).log这样连输入带输出全录下来,退出时敲exit结束录制。
6.4 实操心得与避坑建议
坑一:静态IP和DHCP冲突。如果电脑之前连过其他网络,网卡可能还留着DHCP的配置。设静态IP的时候一定要把“自动获取IP”关掉,不然两个配置打架,网络时通时不通。
坑二:G1的网口速率协商。有些网线质量差,千兆协商不成功会降到百兆,甚至半双工。表现是ping通但SSH很卡。换根好网线,或者在G1上强制设速率:
sudo ethtool -s eth0 speed 1000 duplex full autoneg off坑三:MobaXterm的X11转发和Windows缩放冲突。高DPI屏幕下,X11弹出来的窗口可能模糊。解决方法是右键MobaXterm快捷方式 → 属性 → 兼容性 → 更改高DPI设置 → 勾选“替代高DPI缩放行为”,选“应用程序”。
坑四:SSH密钥配了但还是提示输密码。检查G1上~/.ssh目录权限,必须是700,authorized_keys必须是600。权限不对SSH会忽略密钥。
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys坑五:MobaXterm循环执行命令导致机器人卡死。用Macro循环跑高频命令(比如1秒一次rostopic pub)可能会把G1的CPU占满。循环间隔建议不低于5秒,而且不要在循环里跑重负载命令。
7. 多设备管理与批量操作
7.1 同时连接多台G1
如果手上有好几台G1,IP分别是192.168.123.161、162、163,可以在MobaXterm里建多个会话,然后用“MultiExec”模式同时往所有会话发命令。开启方法:View → MultiExec mode,然后在每个标签里勾选要同步的会话。这样敲一次命令,所有G1同时执行。
批量操作的时候要小心,比如sudo reboot会让所有机器人同时重启。建议先在小范围测试。
7.2 SSH批量登录脚本
如果设备多到MobaXterm管不过来,可以用脚本批量登录。Windows下可以用PowerShell:
$hosts = @("192.168.123.161", "192.168.123.162", "192.168.123.163") foreach ($h in $hosts) { Start-Process mobaxterm -ArgumentList "-newtab ssh unitree@$h" }Linux/Mac下更简单:
for ip in 192.168.123.161 192.168.123.162 192.168.123.163; do ssh unitree@$ip "hostname && uptime" & done wait这样能一次性拿到所有机器的主机名和负载情况。
7.3 用plink做自动化
PuTTY套件里的plink可以在命令行下跑SSH命令,适合写自动化脚本。比如批量改配置:
plink -ssh -pw 123 unitree@192.168.123.161 "echo 'export ROS_MASTER_URI=http://192.168.123.161:11311' >> ~/.bashrc"plink的密码是明文写在命令里的,不安全,建议配合密钥用。-i参数指定私钥文件。
注意:plink第一次连接会提示保存主机密钥,自动化脚本里要加
-batch参数跳过交互,但这样有中间人风险。内网环境可以接受,公网环境不要这么干。
8. 网络调试的深层原理与性能优化
8.1 ROS通信的网络模型
G1上跑的是ROS,ROS 1的通信模型是TCPROS和UDPROS。话题(Topic)默认用TCP,服务(Service)也用TCP,但有些传感器数据用UDP。ROS Master默认监听11311端口,节点之间通过Master交换地址信息,然后直接建立TCP连接。
调试的时候如果话题收不到数据,先确认Master在不在:
rostopic list如果这个命令卡住,说明Master没起来或者网络不通。如果rostopic list能列出话题但rostopic echo没数据,说明发布者没发或者订阅者没连上。
8.2 网络延迟对控制的影响
G1的关节控制对延迟很敏感。如果SSH连接本身延迟高,通过SSH跑的控制命令也会延迟。实测下来,直连的延迟在0.1ms级别,通过路由器在1ms级别,通过WiFi在10ms级别。控制频率100Hz的话,10ms延迟意味着一个周期的滞后,对平衡控制有影响。
所以调试控制算法的时候,尽量用有线直连,不要用WiFi。如果必须用WiFi,把控制频率降下来,或者把控制算法跑在G1本机上,SSH只用来发指令和看状态。
8.3 带宽估算与优化
G1的传感器数据量不小。一个1280x720的RGB相机,30fps,压缩后大概2-5Mbps。激光雷达的数据量更大,16线雷达大概10-20Mbps。如果同时跑多个传感器,千兆网卡可能跑满。
优化方法:
- 降低相机分辨率或帧率
- 用压缩图像传输(
image_transport的compressed插件) - 激光雷达降采样
- 把数据处理放在G1本机,只传结果
用iftop或者nload可以看实时带宽:
sudo apt install iftop sudo iftop -i eth08.4 SSH隧道转发ROS端口
如果电脑和G1不在同一个网段,可以通过SSH隧道把ROS端口转发出来。比如G1在192.168.123.161,你的电脑在192.168.1.100,中间有个跳板机。可以在跳板机上建隧道:
ssh -L 11311:192.168.123.161:11311 user@jumpbox这样本地访问localhost:11311就等于访问G1的11311。ROS_MASTER_URI设成http://localhost:11311就行。
注意:ROS 1的节点会把自己的地址告诉Master,如果地址是内网地址,外部节点连不上。需要设
ROS_IP或ROS_HOSTNAME环境变量,让节点报告正确的地址。
9. 从连接稳定到长期维护
9.1 开机自启与守护进程
调试阶段手动连SSH没问题,但长期跑的话最好让G1开机自动启动必要的服务。用systemd写个service文件:
[Unit] Description=G1 Startup Script After=network.target [Service] Type=oneshot ExecStart=/home/unitree/startup.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target放到/etc/systemd/system/g1-startup.service,然后sudo systemctl enable g1-startup。
9.2 连接稳定性监控
长期跑的时候,SSH可能会断。可以在MobaXterm里开Keepalive:Settings → Configuration → SSH → 勾选“SSH keepalive”,间隔设30秒。这样空闲连接不会被防火墙掐断。
G1端也可以配:
sudo nano /etc/ssh/sshd_config加两行:
ClientAliveInterval 30 ClientAliveCountMax 3意思是每30秒发一次心跳,3次没回应就断开。
9.3 固件升级与系统备份
宇树会不定期发固件更新,升级之前一定要备份。备份方法:
sudo tar -czf /tmp/g1_backup_$(date +%Y%m%d).tar.gz /home/unitree /etc/ssh /etc/network把备份文件拷到电脑上存好。升级出问题可以回滚。
升级固件一般通过U盘或者网络,具体看宇树的说明。升级过程中不要断电,不然可能变砖。
9.4 安全加固建议
调试阶段怎么方便怎么来,但如果是长期部署,建议做几项安全加固:
- 改默认密码
- 禁用root登录
- 只允许密钥登录,禁用密码
- 改SSH端口(非22)
- 配fail2ban防暴力破解
sudo apt install fail2ban sudo systemctl enable fail2ban这些操作在调试阶段可以先不做,但上线之前一定要做。
我个人在实际操作中的体会是,G1的SSH连接本身不复杂,复杂的是网络环境的多变。直连、路由器、WiFi、跳板机,每种场景的配置都不一样。把基础链路打通之后,后面的事情就顺了。另外MobaXterm虽然好用,但不要过度依赖它的图形功能,命令行才是根本。多练练ssh、scp、rsync这些原生命令,换到Linux或者Mac环境下一样能用。