0%

背景

局域网内有些 PC 访问 GitHub repo 受限,但本机可以正常访问 GitHub。目标是在本机提供一个局域网 HTTP/HTTPS 正向代理,让其他电脑通过本机代理执行:

1
2
3
git clone https://github.com/xxx/yyy.git
git fetch
git pull

本机环境:

  • Ubuntu 22.04
  • 本机局域网 IP:192.168.111.231/24
  • 代理端口:3128
  • 允许访问的网段:192.168.111.0/24

为什么不用 Nginx

Nginx 默认适合做 Web 服务和反向代理,例如把外部请求转发到某个内部 HTTP 服务。

但是 GitHub repo 通常走 HTTPS,Git 客户端需要 HTTP 代理支持 CONNECT 方法来建立 HTTPS 隧道。标准 Nginx 不适合作为通用正向 HTTPS 代理,除非额外编译第三方模块,例如 ngx_http_proxy_connect_module

这个场景更适合使用 Squid:

  • 原生支持 HTTP/HTTPS 正向代理
  • 支持 CONNECT
  • 支持 ACL 限制来源网段,避免变成开放代理
  • 日志和诊断能力更直接

安装 Squid

1
2
sudo apt update
sudo apt install -y squid

安装后 Squid 的主配置文件在:

1
/etc/squid/squid.conf

配置正向代理

先备份原配置:

1
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak.codex-20260608-1022

/etc/squid/squid.conf 改成下面的最小配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Squid forward proxy for LAN Git HTTPS access.
# Host LAN address: 192.168.111.231/24

acl local_lan src 192.168.111.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow local_lan
http_access deny all

http_port 3128

access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

关键点:

  • acl local_lan src 192.168.111.0/24:只允许当前局域网使用代理。
  • acl SSL_ports port 443:允许 HTTPS 目标端口。
  • acl CONNECT method CONNECT:识别 HTTPS 隧道请求。
  • http_access deny CONNECT !SSL_ports:只允许对安全端口做 CONNECT
  • http_access deny all:最后兜底拒绝其他来源,避免开放代理。

校验配置并重启

配置写完后先检查语法:

1
squid -k parse -f /etc/squid/squid.conf

重启并设置开机启动:

1
2
3
sudo systemctl enable --now squid
sudo systemctl restart squid
sudo systemctl status squid --no-pager

检查监听端口:

1
ss -ltnp

正常情况下可以看到:

1
LISTEN ... *:3128 ...

防火墙

这次实践中检查到 UFW 没有启用:

1
cat /etc/ufw/ufw.conf

结果:

1
ENABLED=no

所以没有额外添加防火墙规则。

如果 UFW 是启用状态,可以放行当前局域网访问 3128/tcp

1
sudo ufw allow from 192.168.111.0/24 to any port 3128 proto tcp

本机验证

通过本机回环地址验证:

1
curl -I --max-time 10 -x http://127.0.0.1:3128 https://github.com

通过本机局域网地址验证,模拟其他 PC 的访问方式:

1
curl -I --max-time 10 -x http://192.168.111.231:3128 https://github.com

成功时会看到类似结果:

1
2
3
4
HTTP/1.1 200 Connection established

HTTP/2 200
server: github.com

再用 Git 验证 repo 访问:

1
2
3
git -c http.proxy=http://192.168.111.231:3128 \
-c https.proxy=http://192.168.111.231:3128 \
ls-remote https://github.com/git/git.git HEAD

成功结果:

1
9ac3f193c05c2237e2b14ebaa1149e9fc8a1abe0 HEAD

局域网客户端使用

在其他 PC 上设置 Git 全局代理:

1
2
git config --global http.proxy http://192.168.111.231:3128
git config --global https.proxy http://192.168.111.231:3128

验证:

1
git ls-remote https://github.com/git/git.git HEAD

临时使用代理,不写入 Git 全局配置:

1
HTTPS_PROXY=http://192.168.111.231:3128 git clone https://github.com/git/git.git

取消 Git 全局代理:

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

日志排查

查看 Squid 访问日志:

1
sudo tail -f /var/log/squid/access.log

查看 Squid 服务日志:

1
sudo journalctl -u squid -f

如果客户端无法访问,优先检查:

  1. 客户端和代理机器是否在 192.168.111.0/24 网段。
  2. 客户端能否 ping 到 192.168.111.231
  3. 代理机器 3128 是否在监听。
  4. Squid 日志里是否出现 TCP_DENIED
  5. 本机自己是否能访问 GitHub。

小结

这个场景本质上是正向代理,不是反向代理。Nginx 可以做很多 Web 代理场景,但 GitHub HTTPS repo 访问需要稳定支持 CONNECT,所以 Squid 更直接。

最终局域网电脑只需要把 Git 的 HTTP/HTTPS proxy 指向:

1
http://192.168.111.231:3128

就可以通过本机访问 GitHub HTTPS repo。

OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

切换到绘制线段/图形 —> 绘制参数 —> 更新

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。如创建窗口、处理输入(如键盘、鼠标、游戏手柄)以及管理 OpenGL 上下文,GLFW是开发 OpenGL 应用程序的常用工具之一

GLFW window hint 枚举

安装环境

执行日期:2026-06-03

系统版本:

1
cat /etc/os-release

结果:

1
2
3
PRETTY_NAME="Ubuntu 24.04.4 LTS"
VERSION_CODENAME=noble
UBUNTU_CODENAME=noble

当前系统未安装 ROS2:

1
2
3
which ros2
which colcon
dpkg -l ros2-apt-source ros-jazzy-desktop ros-dev-tools python3-colcon-common-extensions

结果:

1
2
3
4
5
6
which ros2:无输出
which colcon:无输出
dpkg-query: no packages found matching ros2-apt-source
dpkg-query: no packages found matching ros-jazzy-desktop
dpkg-query: no packages found matching ros-dev-tools
dpkg-query: no packages found matching python3-colcon-common-extensions

版本选择

Ubuntu 24.04 Noble 对应 ROS2 Jazzy Jalisco。虽然 2026 年已经有更新的 ROS2 Lyrical,但 Lyrical 的 deb 包面向 Ubuntu 26.04;当前机器是 Ubuntu 24.04,因此选择 Jazzy。

官方文档:

1
https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html

前置检查

检查 locale:

1
locale

结果:

1
2
LANG=zh_CN.UTF-8
LC_ALL=C.UTF-8

已满足 UTF-8 要求。

检查 Ubuntu apt suites:

1
grep Suites /etc/apt/sources.list.d/ubuntu.sources

结果:

1
2
Suites: noble noble-updates noble-backports
Suites: noble-security

noble-updatesnoble-backports 已存在,安装 ros-dev-tools 前不需要修改 Ubuntu 源。

检查前置包:

1
apt-cache policy software-properties-common curl locales

结果:

1
2
3
software-properties-common 已安装
locales 已安装
curl 未安装

安装命令

安装 Ubuntu Universe 源工具与 curl:

1
2
3
sudo apt update
sudo apt install -y software-properties-common curl
sudo add-apt-repository -y universe

安装 ROS2 apt source:

1
2
3
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb

安装 ROS2 Desktop 和开发工具:

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install -y ros-jazzy-desktop ros-dev-tools

配置当前 shell 环境:

1
source /opt/ros/jazzy/setup.bash

可选:写入 ~/.bashrc,让新终端自动加载 ROS2:

1
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc

验证命令

检查命令:

1
2
3
ros2 --version
colcon --help
ros2 doctor

运行 demo:

终端 1:

1
2
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker

终端 2:

1
2
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_py listener

如果 talker 持续输出 Publishinglistener 持续输出 I heard,说明 C++ 和 Python demo 都正常。

遇到的问题

sudo 需要本机密码

执行:

1
2
sudo -n true
sudo apt update

遇到:

1
2
sudo: a password is required
[sudo] password for qqs:

处理:安装流程暂停。需要在本机终端执行一次:

1
sudo -v

输入当前用户密码完成 sudo 授权后,再继续执行上面的 ROS2 安装命令。

当前状态

截至 2026-06-03:已完成系统检查和安装方案记录;因为 sudo 需要本机密码,ROS2 尚未实际安装完成。

关节控制链:

控制器->伺服驱动器->伺服电机->减速器->机械关节<-编码器反馈

步进电机 多对电极依次通断 吸引转子转动指定角度

舵机是加入控制电路的步进电机

伺服电机(Servo Motor)= 电机 + 编码器 + 驱动控制

编码器 霍尔元件 ADC电位器 磁编码器

安装环境

Ubuntu24.04lts

1
2
3
4
5
6
apt install build-essencial gcc make perl dkms

# 可分割的终端窗口 Ctrl+Shift+O Ctrl+Shift+E
apt install terminator
snap install code --classic
apt install gedit

install ROS 2 Jazzy

download deb package

VLM、VLN、VLA, RL

VLM、VLN、VLA

RL(Reinforcement Learning 强化学习) 让机器通过不断试错自主学习最优策略

Tsai-Lenz HandEye(蔡-伦兹手眼标定 Eye-in-Hand) Calibration

AX=XB

六轴机械臂

六轴机械臂之所以能在全球工业界如此普及,甚至成为工业自动化的“标准配置”和“万金油”,主要归功于它在运动能力、成本效益和技术成熟度三者之间达到了一个完美的平衡点

在三维空间中,要确定一个物体(比如机械臂末端的焊枪或夹爪)的完整状态,需要6个参数:3个平移自由度(X, Y, Z)和3个旋转自由度(Roll, Pitch, Yaw)。
不多不少刚刚好:6轴机械臂的6个关节,恰好对应这6个自由度。这意味着它可以在工作空间内,让末端执行器到达任意位置并保持任意姿态。

  • 6轴机械臂在求解逆运动学时,数学模型相对明确,计算速度快且稳定
  • 成熟的策略回避奇异点(如万向锁)
  • 生态完善 主流的机器人厂商(如发那科、库卡、ABB等)

DH 表示法

FK IK

正运动学FK

输入: 6 个关节角度 (弧度)
输出: 末端法兰的 4x4 齐次变换矩阵 (SE3)
算法: DH 参数链式矩阵乘法
延迟: < 1ms

1
T_flange = T_base × T_1(q1) × T_2(q2) × ... × T_6(q6)

每个 T_i 由 DH 参数 (a, d, alpha, theta_offset 参数可从 URDF 提取) 构建。

nalgebra 矩阵库 | 零拷贝、SIMD 加速、f64 精度满足工业要求

逆运动学IK

解析IK和数值IK

第4、5、6轴(手腕部分)的轴线完美地交汇在一点(Pieper 准则 解析ik可解),形成了经典的“球形腕”结构

在机器人学中,IK解算出的关节角带回FK(正运动学)验证时,发现与目标位姿不一致的现象,通常被称为“IK收敛失败”、“求解误差”或“无解”。

  • 超出工作空间
  • 数值法 陷入局部最优或初始猜测不当 导致收敛停止
  • 奇异点
  • 求解器参数限制

有解的情况

以Fanuc_M_20iD_25为例

坐标系系统

注意是坐标系而不是坐标 是讨论问题的参考 所有的位置和姿态都要相对某坐标系而言

  • 世界坐标系 World
  • Base 坐标系 - 机器人基座
  • Joint 坐标系

虽然关节只有一个转轴 但为了数学表达和统一建模 我们会给每个joint附带一个完整的三维坐标系(frame)

  • TCP 坐标系 - 工具末端

TCP是工业机器人最重要的概念之一 多轴机械臂每个关节的transform连乘 得到TCP

1
2
3
4
5
6
7
TCP_in_world
=
Base
× Joint1
× Joint2
× Joint3
× ToolOffset
  • User Frame - 工件坐标系

工件会移动 程序的位点要跟着工件走

  • 笛卡尔位置

示教(Teach Pendant)

  • Joint Motion
  • Linear Motion
  • Circular Motion
  • 姿态(Orientation)

奇异点和翻腕 安全限制

Gizmo

拖动TCP的工具 在three.js中以TransformControls实现
Gizmo 英文俚语原义‘小装置’

加载模型

  • urdf 提供关节链、关节轴、关节上下限、link 变换、碰撞几何这些“结构数据”
  • dh_params.json DH 参数

解析IK

对于Fanuc_* 这类机型 设置 joint_direction = [1,1,-1,-1,-1,-1],并把 arm type 标成 PumaType。然后解析 IK
用“通用 PUMA 型 6 轴公式 + 这台机器的 DH 参数 + 关节限位 + theta offset”去算

flange TCP 传给solver

解析 IK 不是只吐一个解,它会枚举多个 branch,然后选最接近 ref_joints 的那个。
对 PUMA 型结构,典型是 shoulder / elbow / wrist flip 的多分支组合。ref_joints 的作用很关键:一方面帮助选“离当前姿态最近”的 branch,另一方面在退化到数值 IK 时也作为初始值

解析 IK 成功以后,并不会直接盲信。
项目还会做一次 FK(solved) 回验:如果回算出来的末端位姿和目标差太大,就把这次“解析成功”判成失败,再退到数值 IK。

数值IK

Jacobian 法迭代 + Damped Least Squares

RRT

Rapidly-Exploring Random Tree

碰撞检测

轨迹

  • MoveJ
  • MoveL
  • MoveC

插补

仿真

  • webots

✅ 应该掌握的(会用即可)

这些是工业开发必需品:


1️⃣ 基础UI开发

包括:

  • 页面布局
  • 数据绑定
  • 命令绑定
  • MVVM 基础

你需要达到:

👉 能快速做一个工业界面。


2️⃣ 实时数据展示

比如:

  • 设备状态
  • 曲线图
  • 报警信息
  • IO状态

这是工业上位机核心能力。


3️⃣ 多线程 + Dispatcher

因为工业系统有:

  • 实时通信
  • 后台采集

必须理解:

  • UI线程
  • 后台线程

4️⃣ 通信整合

比如:

  • Socket
  • OPC UA
  • PLC 数据接入

重点不是 WPF。

重点是:

👉 “数据如何进入系统”


5️⃣ 工业项目架构

你需要理解:

  • 模块化
  • 状态管理
  • 日志系统
  • 配置系统

工业软件真正值钱的是:

👉 “系统理解能力”

包括:


1️⃣ 数据流

你要能回答:

  • 数据从哪来?
  • 谁控制谁?
  • 状态如何同步?
  • 故障如何传播?

2️⃣ 设备协同

比如:

机器人:

  • 为什么停?
  • 为什么等待?
  • 为什么报警?

3️⃣ 工艺逻辑

比如:

焊接流程:

1
定位 → 视觉识别 → 轨迹生成 → 焊接 → 检测

你需要理解:

👉 为什么流程这么设计。


4️⃣ 空间表达(你的巨大优势)

你最值得放大的能力其实是:

👉 “把复杂工业系统可视化”

比如:

  • 机器人轨迹
  • 工艺流程
  • 状态联动
  • 实时仿真

这是很多传统工业程序员不会的。


“如果不用 WPF,我还值钱吗?” 如果答案是不值钱说明陷进去了