From 55be5732f9adb5f5487afc30ae4660cc79cc294f Mon Sep 17 00:00:00 2001 From: karthee-weston Date: Thu, 12 Jun 2025 16:14:51 +0800 Subject: [PATCH 1/3] tutorial: unitree: added guide for internet access for g1 development computer --- sidebars-tutorial.ts | 3 +- tutorial/unitree/g1_internet_guide.md | 121 ++++++++++++++++++++++++++ tutorial/unitree/img/lshw.png | Bin 0 -> 34644 bytes tutorial/unitree/img/rfkill_list.png | Bin 0 -> 10754 bytes 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 tutorial/unitree/g1_internet_guide.md create mode 100644 tutorial/unitree/img/lshw.png create mode 100644 tutorial/unitree/img/rfkill_list.png diff --git a/sidebars-tutorial.ts b/sidebars-tutorial.ts index 8775268..efa6211 100644 --- a/sidebars-tutorial.ts +++ b/sidebars-tutorial.ts @@ -15,7 +15,8 @@ const sidebarsTutorial: SidebarsConfig = { label: 'Humanoid Tutorials', items: [ 'unitree/g1_dev_guide', - 'unitree/g1_diag_guide' + 'unitree/g1_diag_guide', + 'unitree/g1_internet_guide' ], }, ], diff --git a/tutorial/unitree/g1_internet_guide.md b/tutorial/unitree/g1_internet_guide.md new file mode 100644 index 0000000..d6fa4be --- /dev/null +++ b/tutorial/unitree/g1_internet_guide.md @@ -0,0 +1,121 @@ +# G1 Internet Access Guide + + +This guide details 2 methods to provide the internal development PC (192.168.123.164) internet access. +The first method utilises the WiFi card onboard the internal development PC to connect to a WiFi Access Point with internet access. +The second method configures a host computer to connect to the internal development PC using a static IP over Ethernet and share internet access from the host. + +## Method 1: Connect Internal Development PC to WiFi + +1. Show Network Devices +```bash +lshw -C network +``` +[![lshw -C network output](./img/lshw.png)](./img/lshw.png) + +2. Check Wi-Fi Block Status +```bash +sudo rfkill list +``` +[![lshw -C network output](./img/rfkill_list.png)](./img/rfkill_list.png) + +If Wi-Fi is blocked, unblock it: +```bash +sudo rfkill unblock wlan +``` +3. Enable WiFi +```bash +sudo nmcli radio wifi on +``` +4. Connect to a WiFi Network +```bash +sudo nmcli device wifi connect password +``` +5. Test +```bash +ping 8.8.8.8 +``` + +## Method 2: Network Sharing Between Host and Internal Development PC + +### Step 1: Configure Static IP on Robot (Internal Development PC) + +Create a Netplan config file +```bash +sudo nano /etc/netplan/01-network-manager-all.yaml +``` +Paste the following into the file: +```bash +network: + version: 2 + renderer: NetworkManager + ethernets: + eth0: # replace with the unassigned ethernet interface + dhcp4: no + addresses: [192.168.1.2/24] + nameservers: + addresses: [8.8.8.8, 8.8.4.4] +``` +*Note: The internal development PC has 2 ethernet interfaces (eth0 and eth1). One of the interfaces will already be assigned an IP of 192.168.123.164. **Please do not configure this interface in the netplan config file, instead use the unassigned interface.*** + +Test the Netplan configuration +```bash +sudo netplan try +``` +Press the "Enter" key when prompted. + +### Step 2: Configure Static IP on Host (Your Computer) + +Assign a static IP to your host’s Ethernet interface that is in the same subnet, e.g., 192.168.1.1. +```bash +sudo nmcli con modify ipv4.addresses 192.168.1.1/24 +sudo nmcli con modify ipv4.method manual +sudo nmcli con up +``` +### Step 3: Enable Internet Sharing on the Host + +For this sample setup, we'll use the interfaces below. Please change the interfaces according to your host computer + +Ethernet to robot is: enx34298f73882f + +Internet interface is: wlp0s20f3 (WiFi) or enp0s31f6 (LAN) + +1. Enable IP Forwarding +Check if enabled: +```bash +cat /proc/sys/net/ipv4/ip_forward +``` +If it returns 0, enable it: +```bash +echo "1" > /proc/sys/net/ipv4/ip_forward +``` +2. Set Up NAT and Forwarding Rules +```bash +# Replace wlp0s20f3 with your actual internet interface +# Replace enx34298f73882f with your robot ethernet interface + +sudo iptables --table nat --append POSTROUTING --out-interface wlp0s20f3 -j MASQUERADE +sudo iptables --append FORWARD --in-interface enx34298f73882f --out-interface wlp0s20f3 -j ACCEPT +sudo iptables --append FORWARD --in-interface wlp0s20f3 --out-interface enx34298f73882f -m state --state RELATED,ESTABLISHED -j ACCEPT +``` +3. Verify the NAT Rule Exists +```bash +sudo iptables -t nat -L -n -v +``` +*Look for a MASQUERADE rule under POSTROUTING.* + +### Step 4: Test the Connection + +#### On the robot (internal computer): +1. Check IP address: +```bash +ifconfig +``` +2. Ping the host computer: +```bash +ping 192.168.1.1 +``` +3. Try pinging a public IP: +```bash +ping 8.8.8.8 +``` \ No newline at end of file diff --git a/tutorial/unitree/img/lshw.png b/tutorial/unitree/img/lshw.png new file mode 100644 index 0000000000000000000000000000000000000000..a22cc41f6235dcbd585a085413d03969727cd2c8 GIT binary patch literal 34644 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 CO#xE? literal 0 HcmV?d00001 From 5100ef9f69c7bcab5fcacc887d6572e967885956 Mon Sep 17 00:00:00 2001 From: karthee-weston Date: Thu, 12 Jun 2025 16:51:25 +0800 Subject: [PATCH 2/3] tutorial: unitree: added physical connection information --- tutorial/unitree/g1_internet_guide.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tutorial/unitree/g1_internet_guide.md b/tutorial/unitree/g1_internet_guide.md index d6fa4be..cb0d4b4 100644 --- a/tutorial/unitree/g1_internet_guide.md +++ b/tutorial/unitree/g1_internet_guide.md @@ -7,13 +7,22 @@ The second method configures a host computer to connect to the internal developm ## Method 1: Connect Internal Development PC to WiFi -1. Show Network Devices +1. Connect to the internal development PC via LAN using **port 4 or 5** on the G1 electrical interface. +[![lshw -C network output](./img/dev_pc_hw_interface.jpg)](./img/dev_pc_hw_interface.jpg) + +2. ssh into the internal development PC +```bash +ssh unitree@192.168.123.164 +Password: 123 +``` + +3. Show Network Devices ```bash lshw -C network ``` [![lshw -C network output](./img/lshw.png)](./img/lshw.png) -2. Check Wi-Fi Block Status +4. Check Wi-Fi Block Status ```bash sudo rfkill list ``` @@ -23,21 +32,24 @@ If Wi-Fi is blocked, unblock it: ```bash sudo rfkill unblock wlan ``` -3. Enable WiFi +5. Enable WiFi ```bash sudo nmcli radio wifi on ``` -4. Connect to a WiFi Network +6. Connect to a WiFi Network ```bash sudo nmcli device wifi connect password ``` -5. Test +7. Test ```bash ping 8.8.8.8 ``` ## Method 2: Network Sharing Between Host and Internal Development PC +Connect to the internal development PC via a USB-hub using **port 9** on the G1 electrical interface. +[![lshw -C network output](./img/dev_pc_hw_interface.jpg)](./img/dev_pc_hw_interface.jpg) + ### Step 1: Configure Static IP on Robot (Internal Development PC) Create a Netplan config file From 7dc393f738ce431ce261b9f4176f8dce5f1e039e Mon Sep 17 00:00:00 2001 From: karthee-weston Date: Mon, 23 Jun 2025 15:34:17 +0800 Subject: [PATCH 3/3] tutorial: unitree: added guide for providing internet access to g1 --- tutorial/unitree/g1_internet_guide.md | 36 +++++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tutorial/unitree/g1_internet_guide.md b/tutorial/unitree/g1_internet_guide.md index cb0d4b4..75d6a7b 100644 --- a/tutorial/unitree/g1_internet_guide.md +++ b/tutorial/unitree/g1_internet_guide.md @@ -54,7 +54,7 @@ Connect to the internal development PC via a USB-hub using **port 9** on the G1 Create a Netplan config file ```bash -sudo nano /etc/netplan/01-network-manager-all.yaml +sudo vim /etc/netplan/01-network-manager-all.yaml ``` Paste the following into the file: ```bash @@ -65,10 +65,11 @@ network: eth0: # replace with the unassigned ethernet interface dhcp4: no addresses: [192.168.1.2/24] + gateway4: 192.168.1.1 # This IP address corresponds to the host's static IP, to be created in step 2 nameservers: addresses: [8.8.8.8, 8.8.4.4] ``` -*Note: The internal development PC has 2 ethernet interfaces (eth0 and eth1). One of the interfaces will already be assigned an IP of 192.168.123.164. **Please do not configure this interface in the netplan config file, instead use the unassigned interface.*** +*Note: The internal development PC has 2 ethernet interfaces (eth0 and eth1). One of the interfaces will already be assigned an IP of 192.168.123.164. **Please do not configure this interface in the netplan config file, instead use the UNASSIGNED interface.*** Test the Netplan configuration ```bash @@ -76,9 +77,19 @@ sudo netplan try ``` Press the "Enter" key when prompted. +Verify the default gateway on the internal computer +```bash +ip route +``` +The expected output: +```bash +default via 192.168.1.1 dev eth0 proto static metric 101 +``` + ### Step 2: Configure Static IP on Host (Your Computer) -Assign a static IP to your host’s Ethernet interface that is in the same subnet, e.g., 192.168.1.1. +Assign a static IP to your host’s Ethernet interface that is in the same subnet, e.g., 192.168.1.1.\ +**The IP address must follow the gateway address set in the netplan config file in step 1.** ```bash sudo nmcli con modify ipv4.addresses 192.168.1.1/24 sudo nmcli con modify ipv4.method manual @@ -86,13 +97,22 @@ sudo nmcli con up ``` ### Step 3: Enable Internet Sharing on the Host -For this sample setup, we'll use the interfaces below. Please change the interfaces according to your host computer +1. Verify the internet-connected interface on host computer +```bash +ip route get 8.8.8.8 +``` +The expected output should be similar to: +```bash +8.8.8.8 via 192.168.29.1 dev wlp0s20f3 src 192.168.29.179 uid 1000 +``` + +For this sample setup, we'll use the interfaces below. Please change the interfaces according to your host computer. Ethernet to robot is: enx34298f73882f -Internet interface is: wlp0s20f3 (WiFi) or enp0s31f6 (LAN) +Internet interface is the interface identified in step 3.1: wlp0s20f3 (WiFi) or enp0s31f6 (LAN) -1. Enable IP Forwarding +2. Enable IP Forwarding Check if enabled: ```bash cat /proc/sys/net/ipv4/ip_forward @@ -101,7 +121,7 @@ If it returns 0, enable it: ```bash echo "1" > /proc/sys/net/ipv4/ip_forward ``` -2. Set Up NAT and Forwarding Rules +3. Set Up NAT and Forwarding Rules ```bash # Replace wlp0s20f3 with your actual internet interface # Replace enx34298f73882f with your robot ethernet interface @@ -110,7 +130,7 @@ sudo iptables --table nat --append POSTROUTING --out-interface wlp0s20f3 -j MASQ sudo iptables --append FORWARD --in-interface enx34298f73882f --out-interface wlp0s20f3 -j ACCEPT sudo iptables --append FORWARD --in-interface wlp0s20f3 --out-interface enx34298f73882f -m state --state RELATED,ESTABLISHED -j ACCEPT ``` -3. Verify the NAT Rule Exists +4. Verify the NAT Rule Exists ```bash sudo iptables -t nat -L -n -v ```