20260206
This commit is contained in:
parent
515d6c5e8c
commit
5c3b41f717
@ -154,7 +154,7 @@ saveconfig
|
|||||||
### 操作
|
### 操作
|
||||||
|
|
||||||
#### 自动、远程驾驶
|
#### 自动、远程驾驶
|
||||||
首先进入工作空间 minibus
|
首先进入工作空间 JingMenBus
|
||||||
|
|
||||||
终端一:
|
终端一:
|
||||||
``` bash
|
``` bash
|
||||||
|
|||||||
2
can.sh
2
can.sh
@ -23,7 +23,7 @@ ip link set can0 type can bitrate 250000
|
|||||||
ip link set up can0
|
ip link set up can0
|
||||||
|
|
||||||
# RTK
|
# RTK
|
||||||
chmod 777 /dev/ttyUSB0
|
chmod 777 /dev/ttyCH341USB0
|
||||||
|
|
||||||
# remote
|
# remote
|
||||||
chmod 777 /dev/input/event*
|
chmod 777 /dev/input/event*
|
||||||
|
|||||||
214
install_frp.sh
Normal file
214
install_frp.sh
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "=============================="
|
||||||
|
echo " FRPC 安装程序"
|
||||||
|
echo "=============================="
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 0. 工具函数
|
||||||
|
# ==========================================
|
||||||
|
die() { echo "❌ $*" >&2; exit 1; }
|
||||||
|
info() { echo "✔ $*"; }
|
||||||
|
step() { echo "➡ $*"; }
|
||||||
|
|
||||||
|
need_cmd() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 统一下载:优先 wget,其次 curl(断点续传)
|
||||||
|
download() {
|
||||||
|
local url="$1"
|
||||||
|
local out="$2"
|
||||||
|
|
||||||
|
if need_cmd wget; then
|
||||||
|
# -c: 断点续传
|
||||||
|
# -T: 超时
|
||||||
|
# -t: 重试次数
|
||||||
|
info "使用 wget 下载(支持断点续传)"
|
||||||
|
wget -c \
|
||||||
|
--timeout=20 \
|
||||||
|
--read-timeout=20 \
|
||||||
|
-t 0 \
|
||||||
|
"$url" -O "$out"
|
||||||
|
|
||||||
|
elif need_cmd curl; then
|
||||||
|
# -C - : 断点续传
|
||||||
|
# -f : HTTP 非 2xx 失败
|
||||||
|
# -L : 跟随重定向
|
||||||
|
# --retry-* : 抗抖动
|
||||||
|
info "使用 curl 下载(断点续传)"
|
||||||
|
curl -fL -C - \
|
||||||
|
--connect-timeout 20 \
|
||||||
|
--retry 0 \
|
||||||
|
--retry-delay 3 \
|
||||||
|
--retry-all-errors \
|
||||||
|
"$url" -o "$out"
|
||||||
|
|
||||||
|
else
|
||||||
|
die "系统中既没有 wget 也没有 curl,无法下载:$url"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 1. 确保 sudo 权限
|
||||||
|
# ==========================================
|
||||||
|
if ! need_cmd sudo; then
|
||||||
|
die "系统未安装 sudo,请用 root 执行该脚本"
|
||||||
|
fi
|
||||||
|
sudo -v
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 2. 输入设备名
|
||||||
|
# ==========================================
|
||||||
|
read -r -p "请输入设备名称(deviceName,例如 z200_01): " deviceName
|
||||||
|
[ -n "${deviceName}" ] || die "设备名不能为空"
|
||||||
|
|
||||||
|
# 简单合法性校验:只允许字母数字下划线中划线
|
||||||
|
if ! [[ "$deviceName" =~ ^[A-Za-z0-9_-]+$ ]]; then
|
||||||
|
die "设备名不合法:仅允许字母/数字/_/-"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
info "设备名:$deviceName"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 3. 检测架构
|
||||||
|
# ==========================================
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
info "检测到架构:$ARCH"
|
||||||
|
|
||||||
|
case "$ARCH" in
|
||||||
|
aarch64) PKG="frp_0.65.0_linux_arm64.tar.gz" ;;
|
||||||
|
armv7l|armv7*) PKG="frp_0.65.0_linux_arm.tar.gz" ;;
|
||||||
|
x86_64|amd64) PKG="frp_0.65.0_linux_amd64.tar.gz" ;;
|
||||||
|
*) die "不支持架构:$ARCH" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
BASE="http://36.153.162.171:20080/frp"
|
||||||
|
URL="$BASE/$PKG"
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 4. 下载 / 解压(断电可恢复)
|
||||||
|
# ==========================================
|
||||||
|
FRP_DIR="/usr/local/frp"
|
||||||
|
FRPC_BIN="$FRP_DIR/frpc"
|
||||||
|
|
||||||
|
CACHE_DIR="/var/cache/frp"
|
||||||
|
PKG_PATH="$CACHE_DIR/$PKG"
|
||||||
|
|
||||||
|
if sudo test -x "$FRPC_BIN"; then
|
||||||
|
info "检测到本地已有 FRPC:$FRPC_BIN(跳过下载)"
|
||||||
|
else
|
||||||
|
step "准备缓存目录:$CACHE_DIR"
|
||||||
|
sudo mkdir -p "$CACHE_DIR"
|
||||||
|
sudo chown "$(id -u):$(id -g)" "$CACHE_DIR"
|
||||||
|
|
||||||
|
if [ -f "$PKG_PATH" ]; then
|
||||||
|
info "检测到缓存文件,继续断点续传:$PKG_PATH"
|
||||||
|
else
|
||||||
|
info "缓存中不存在安装包,将开始下载"
|
||||||
|
fi
|
||||||
|
|
||||||
|
step "下载:$URL"
|
||||||
|
download "$URL" "$PKG_PATH"
|
||||||
|
info "下载完成:$PKG_PATH"
|
||||||
|
|
||||||
|
step "解压到:$FRP_DIR"
|
||||||
|
sudo mkdir -p "$FRP_DIR"
|
||||||
|
sudo tar -xzf "$PKG_PATH" -C "$FRP_DIR" --strip-components=1
|
||||||
|
sudo chmod +x "$FRPC_BIN" || true
|
||||||
|
|
||||||
|
sudo test -x "$FRPC_BIN" || die "解压后未找到可执行 frpc:$FRPC_BIN"
|
||||||
|
info "解压完成"
|
||||||
|
|
||||||
|
# 可选:如果你希望节省空间,确认安装成功后再删
|
||||||
|
# sudo rm -f "$PKG_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 5. 生成 frpc.toml
|
||||||
|
# ==========================================
|
||||||
|
PROXY_NAME="${deviceName}_stcp"
|
||||||
|
SECRET_KEY="${deviceName}_key"
|
||||||
|
|
||||||
|
step "生成配置 /etc/frp/frpc.toml"
|
||||||
|
sudo mkdir -p /etc/frp
|
||||||
|
|
||||||
|
sudo tee /etc/frp/frpc.toml >/dev/null <<EOF
|
||||||
|
serverAddr = "36.153.162.171"
|
||||||
|
serverPort = 7001
|
||||||
|
|
||||||
|
[auth]
|
||||||
|
method = "token"
|
||||||
|
token = "token123456"
|
||||||
|
|
||||||
|
[transport]
|
||||||
|
protocol = "kcp"
|
||||||
|
|
||||||
|
[[proxies]]
|
||||||
|
name = "$PROXY_NAME"
|
||||||
|
type = "stcp"
|
||||||
|
localIP = "127.0.0.1"
|
||||||
|
localPort = 22
|
||||||
|
secretKey = "$SECRET_KEY"
|
||||||
|
|
||||||
|
# visitor 由服务器 callback 自动追加
|
||||||
|
EOF
|
||||||
|
|
||||||
|
info "已生成 /etc/frp/frpc.toml"
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 6. 回调注册(一定要在重启 frpc 之前)
|
||||||
|
# ==========================================
|
||||||
|
CALLBACK_URL="$BASE/callback?device=$deviceName"
|
||||||
|
step "回调注册(在重启 frpc 之前):$CALLBACK_URL"
|
||||||
|
|
||||||
|
# 用 download 抓取返回文本(落到临时文件)
|
||||||
|
tmp_cb="$(mktemp)"
|
||||||
|
trap 'rm -f "$tmp_cb"' EXIT
|
||||||
|
|
||||||
|
download "$CALLBACK_URL" "$tmp_cb" || die "回调请求失败"
|
||||||
|
RESULT="$(cat "$tmp_cb" 2>/dev/null || true)"
|
||||||
|
info "服务器返回:$RESULT"
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# 7. systemd 服务
|
||||||
|
# ==========================================
|
||||||
|
step "写入 systemd 服务 /etc/systemd/system/frpc.service"
|
||||||
|
|
||||||
|
sudo tee /etc/systemd/system/frpc.service >/dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=FRPC Client
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=$FRPC_BIN -c /etc/frp/frpc.toml
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable frpc
|
||||||
|
|
||||||
|
info "即将重启 frpc,当前 SSH 连接可能会断开"
|
||||||
|
sudo systemctl restart frpc
|
||||||
|
|
||||||
|
# 给 1 秒让它起起来再检查
|
||||||
|
sleep 1
|
||||||
|
sudo systemctl --no-pager -l status frpc || die "frpc 服务启动失败,请看上面的日志"
|
||||||
|
|
||||||
|
info "FRPC 已重新启动(新配置已生效)"
|
||||||
|
|
||||||
|
|
||||||
|
echo "=============================="
|
||||||
|
echo " 安装完成!"
|
||||||
|
echo " 设备名:$deviceName"
|
||||||
|
echo "=============================="
|
||||||
|
|
||||||
@ -9,4 +9,4 @@ sudo modprobe 8021q
|
|||||||
sudo vconfig add eth3 129
|
sudo vconfig add eth3 129
|
||||||
sudo ifconfig eth3.129 172.31.129.38 up
|
sudo ifconfig eth3.129 172.31.129.38 up
|
||||||
|
|
||||||
sudo tcpreplay --loop=0 --multiplier=1 -i eth3.129 /home/nvidia/Downloads/minibus/4647.pcap
|
sudo tcpreplay --loop=0 --multiplier=1 -i eth3.129 /home/nvidia/Downloads/JingMenBus/4647.pcap
|
||||||
|
|||||||
25
rosbag/rosbag2_2026_02_06-15_38_46/metadata.yaml
Normal file
25
rosbag/rosbag2_2026_02_06-15_38_46/metadata.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
rosbag2_bagfile_information:
|
||||||
|
version: 4
|
||||||
|
storage_identifier: sqlite3
|
||||||
|
relative_file_paths:
|
||||||
|
- rosbag2_2026_02_06-15_38_46_0.db3
|
||||||
|
duration:
|
||||||
|
nanoseconds: 552772372058
|
||||||
|
starting_time:
|
||||||
|
nanoseconds_since_epoch: 1770363529066087141
|
||||||
|
message_count: 6266
|
||||||
|
topics_with_message_count:
|
||||||
|
- topic_metadata:
|
||||||
|
name: /mc_message
|
||||||
|
type: interface/msg/MC
|
||||||
|
serialization_format: cdr
|
||||||
|
offered_qos_profiles: "- history: 3\n depth: 0\n reliability: 1\n durability: 2\n deadline:\n sec: 2147483647\n nsec: 4294967295\n lifespan:\n sec: 2147483647\n nsec: 4294967295\n liveliness: 1\n liveliness_lease_duration:\n sec: 2147483647\n nsec: 4294967295\n avoid_ros_namespace_conventions: false"
|
||||||
|
message_count: 184
|
||||||
|
- topic_metadata:
|
||||||
|
name: /rtk_message
|
||||||
|
type: interface/msg/RTK
|
||||||
|
serialization_format: cdr
|
||||||
|
offered_qos_profiles: ""
|
||||||
|
message_count: 6082
|
||||||
|
compression_format: ""
|
||||||
|
compression_mode: ""
|
||||||
Binary file not shown.
25
rosbag/rosbag2_2026_02_06-16_07_46/metadata.yaml
Normal file
25
rosbag/rosbag2_2026_02_06-16_07_46/metadata.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
rosbag2_bagfile_information:
|
||||||
|
version: 4
|
||||||
|
storage_identifier: sqlite3
|
||||||
|
relative_file_paths:
|
||||||
|
- rosbag2_2026_02_06-16_07_46_0.db3
|
||||||
|
duration:
|
||||||
|
nanoseconds: 525753341144
|
||||||
|
starting_time:
|
||||||
|
nanoseconds_since_epoch: 1770365270093730756
|
||||||
|
message_count: 5960
|
||||||
|
topics_with_message_count:
|
||||||
|
- topic_metadata:
|
||||||
|
name: /rtk_message
|
||||||
|
type: interface/msg/RTK
|
||||||
|
serialization_format: cdr
|
||||||
|
offered_qos_profiles: ""
|
||||||
|
message_count: 5785
|
||||||
|
- topic_metadata:
|
||||||
|
name: /mc_message
|
||||||
|
type: interface/msg/MC
|
||||||
|
serialization_format: cdr
|
||||||
|
offered_qos_profiles: ""
|
||||||
|
message_count: 175
|
||||||
|
compression_format: ""
|
||||||
|
compression_mode: ""
|
||||||
Binary file not shown.
Binary file not shown.
18
service.md
18
service.md
@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
## 二、准备工作
|
## 二、准备工作
|
||||||
1. **确认脚本路径**
|
1. **确认脚本路径**
|
||||||
记录当前脚本所在的完整路径(`minibus`目录的绝对路径),示例:
|
记录当前脚本所在的完整路径(`JingMenBus`目录的绝对路径),示例:
|
||||||
`/home/nvidia/Downloads/minibus`
|
`/home/nvidia/Downloads/JingMenBus`
|
||||||
(若主机更换,只需替换`minibus`之前的可变路径部分)
|
(若主机更换,只需替换`JingMenBus`之前的可变路径部分)
|
||||||
|
|
||||||
2. **验证脚本可执行性**
|
2. **验证脚本可执行性**
|
||||||
确保所有脚本具有执行权限(若已配置可跳过):
|
确保所有脚本具有执行权限(若已配置可跳过):
|
||||||
```bash
|
```bash
|
||||||
cd /home/nvidia/Downloads/minibus # 替换为实际路径
|
cd /home/nvidia/Downloads/JingMenBus # 替换为实际路径
|
||||||
chmod +x can.sh lidar128.sh start.sh pubJM.sh
|
chmod +x can.sh lidar128.sh start.sh pubJM.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ Documentation=https://www.freedesktop.org/wiki/Software/systemd/
|
|||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
# 替换为实际的can.sh路径
|
# 替换为实际的can.sh路径
|
||||||
ExecStart=/home/nvidia/Downloads/minibus/can.sh
|
ExecStart=/home/nvidia/Downloads/JingMenBus/can.sh
|
||||||
User=root # 必须root权限(配置CAN接口和设备权限)
|
User=root # 必须root权限(配置CAN接口和设备权限)
|
||||||
RemainAfterExit=yes # 确保服务状态在执行后保持为active
|
RemainAfterExit=yes # 确保服务状态在执行后保持为active
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ Documentation=https://www.freedesktop.org/wiki/Software/systemd/
|
|||||||
[Service]
|
[Service]
|
||||||
Type=simple # 因tcpreplay是持续运行的进程,需用simple类型
|
Type=simple # 因tcpreplay是持续运行的进程,需用simple类型
|
||||||
# 替换为实际的lidar128.sh路径
|
# 替换为实际的lidar128.sh路径
|
||||||
ExecStart=/home/nvidia/Downloads/minibus/lidar128.sh
|
ExecStart=/home/nvidia/Downloads/JingMenBus/lidar128.sh
|
||||||
User=root # 需root权限(配置网络接口和vlan)
|
User=root # 需root权限(配置网络接口和vlan)
|
||||||
Restart=on-failure # 进程意外退出时自动重启
|
Restart=on-failure # 进程意外退出时自动重启
|
||||||
|
|
||||||
@ -85,8 +85,8 @@ Requires=can.service lidar128.service
|
|||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=nvidia
|
User=nvidia
|
||||||
WorkingDirectory=/home/nvidia/Downloads/minibus
|
WorkingDirectory=/home/nvidia/Downloads/JingMenBus
|
||||||
ExecStart=/home/nvidia/Downloads/minibus/start.sh
|
ExecStart=/home/nvidia/Downloads/JingMenBus/start.sh
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
Environment=RMW_IMPLEMENTATION=rmw_fastrtps_cpp
|
Environment=RMW_IMPLEMENTATION=rmw_fastrtps_cpp
|
||||||
# 如果需要ROS_DOMAIN_ID等环境变量,也在这里加 Environment=
|
# 如果需要ROS_DOMAIN_ID等环境变量,也在这里加 Environment=
|
||||||
@ -156,7 +156,7 @@ journalctl -u start.service -f # 查看start服务日志
|
|||||||
|
|
||||||
1. 路径变更处理
|
1. 路径变更处理
|
||||||
|
|
||||||
若主机更换导致minibus目录路径变化,需重新修改 3 个服务文件中的ExecStart路径,并执行:
|
若主机更换导致JingMenBus目录路径变化,需重新修改 3 个服务文件中的ExecStart路径,并执行:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
|
|||||||
BIN
src/auto_ctrl/auto_ctrl/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
src/auto_ctrl/auto_ctrl/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
src/auto_ctrl/auto_ctrl/__pycache__/auto_node.cpython-38.pyc
Normal file
BIN
src/auto_ctrl/auto_ctrl/__pycache__/auto_node.cpython-38.pyc
Normal file
Binary file not shown.
2
start.sh
2
start.sh
@ -3,7 +3,7 @@ set -e
|
|||||||
|
|
||||||
source /opt/ros/foxy/setup.bash
|
source /opt/ros/foxy/setup.bash
|
||||||
|
|
||||||
source /home/nvidia/Downloads/minibus/install/setup.bash
|
source /home/nvidia/Downloads/JingMenBus/install/setup.bash
|
||||||
|
|
||||||
ros2 run mc mc_node &
|
ros2 run mc mc_node &
|
||||||
ros2 run rtk rtk_node &
|
ros2 run rtk rtk_node &
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user