板子环境配置与自检(详细 + 踩坑)

对应总览:PROJECT_START.md
excerpt: 板子环境配置与自检:ROS、chitu_ws、frp、systemd、crontab、rosbridge;文中 IP 与 token 仅为示例占位。


1. ROS Noetic 与 apt 源

1.1 安装 ROS

sudo apt update
sudo apt install -y curl software-properties-common
# 若 raw.githubusercontent.com 超时,改用清华/中科大 ros.key 与 ros 源(见会话实践)
sudo apt install -y ros-noetic-ros-base python3-rosdep python3-rosinstall python3-catkin-tools build-essential
sudo rosdep init || true
rosdep update
source /opt/ros/noetic/setup.bash
rosversion -d   # 应输出 noetic

1.2 工作空间依赖(一次性装齐,避免 catkin 逐个缺包)

rosdep 对部分键在 ARM/镜像上解析失败时,可手动安装,例如:

sudo apt install -y \
  ros-noetic-serial ros-noetic-image-transport ros-noetic-camera-info-manager \
  ros-noetic-cv-bridge ros-noetic-nodelet ros-noetic-pcl-ros ros-noetic-pcl-conversions \
  ros-noetic-urdf ros-noetic-xacro ros-noetic-tf2-ros ros-noetic-tf2-geometry-msgs \
  ros-noetic-tf ros-noetic-nav-msgs ros-noetic-eigen-conversions ros-noetic-message-filters \
  ros-noetic-rosbag ros-noetic-rostest ros-noetic-urdf \
  libpcl-dev libeigen3-dev libopencv-dev libomp-dev python3-dev libapr1-dev libboost-all-dev

踩坑:只装 ros-noetic-ros-base 时,不会自带 urdf、pcl_ros、serial 等,需按上面补齐。
后续编译若还缺依赖,再执行:sudo apt install ros-noetic-<包名>(把尖括号里的包名换成实际缺的包)。


2. 拷贝与编译 chitu_ws

scp "D:\xxxx\chitu_ws" orangepi@板子网络ip:/home/orangepi/chitu_ws# 从开发机 scp 整个工作空间到板子 ~/chitu_ws
cd ~/chitu_ws
rm -rf build devel   # 若从 Windows 编译拷过,务必清掉再编
source /opt/ros/noetic/setup.bash
rosdep install --from-paths src --ignore-src -r -y
catkin_make -j2
source ~/chitu_ws/devel/setup.bash

可能遇到catkin_make -j2又缺依赖的情况,见2末尾

source ~/chitu_ws/devel/setup.bash 写入 ~/.bashrc(按需)。


3. 编译期踩坑(同类记一条;仓库侧多数已修)

3.1 CMake 声明了不存在的目录或库

典型报错:Could not find ... include、cannot find -lXXX(例如包里有不存在的 include/ 或链接 libMPU6050Pi)。
处理:在对应包的 CMakeLists.txt、package.xml 里删掉无效的 include_directories、catkin_package(... LIBRARIES ...)、target_link_libraries(...) 条目,与仓库实际文件一致后再 catkin_make

3.2 livox_ros_driver2 误走 ROS2(找 ament_cmake_auto

原因:该包用 CMake 变量 ROS_EDITION 区分 ROS1 / ROS2。

处理

  • 本仓库已在 livox_ros_driver2/CMakeLists.txt 里 未定义时默认 ROS1一般直接编译即可
    catkin_make -j2
  • 若你本地 build 里曾被缓存成 ROS2(仍报 ament_cmake),可先 rm -rf build devel 再编,或显式指定 ROS1(指令无误,与官方 build.sh-DROS_EDITION=ROS1 同类写法):
cd ~/chitu_ws
rm -rf build devel
source /opt/ros/noetic/setup.bash
catkin_make -j2 -DROS_EDITION=ROS1

说明:DROS_EDITION=ROS1是传给顶层 CMake 的缓存变量,不是写错;只是当前默认已是 ROS1,多数情况不必加

3.3 缺 .h、缺自定义消息、或并行编译顺序错

典型报错:找不到 Pose6D.h、MotorControl.h、Livox 头文件;或 Could not find tf2_geometry_msgs 等。
处理(同一类思路)

  1. 缺系统/ROS 包sudo apt install ros-noetic-<包名>,并在 package.xml、CMakeLists.txt 里声明 find_package / depend。
  2. 本工作空间生成的消息:在用的包的 CMakeLists.txt 里对生成目标加 add_dependencies(你的节点目标 motor_control_msgs_generate_messages_cpp) 等,避免 catkin_make -j 并行时先生成了用消息的节点。
  3. 头文件路径:必要时在对应 CMakeLists.txt 中增加 ${CATKIN_DEVEL_PREFIX}/include 或正确的 target_include_directories(与 fast_lio 等修复方式一致)。

3.4 缺 Livox 系统库(LIVOX_LIDAR_SDK_LIBRARY NOTFOUND)

处理:在板子上按 Livox 官方方式安装 Livox-SDK2(cmake、make、sudo make install、sudo ldconfig),再重新 catkin_make。未装 SDK 时仅改 CMake 无法通过链接阶段。


4. 板端 frp 客户端配置(frpc)

说明frps 跑在云服务器;板子只装 frpc。下面按板子上的操作写。

4.1 按步骤做

  1. 在 PC 上下载 与服务器 frps 同大版本linux arm64 包(例如 0.33.0),解压得到可执行文件 frpc,再用 scp frpc orangepi@板子IP:/tmp/ 等方式拷到板子。
  2. 在板子上建目录并放入 frpc(示例目录 /opt/frp/):
sudo mkdir -p /opt/frp
sudo cp /tmp/frpc /opt/frp/   # 若 frpc 在其它路径,改成实际路径
sudo chmod +x /opt/frp/frpc
  1. 编写 /opt/frp/frpc.ini(可从仓库 chitu/frpc_board.ini 复制再改)。至少包含 [common](server_addr、server_port、token)和若干 [xxx] 的 tcp 映射。
    若团队提供 frp Web 管理面板,浏览器访问 http://<FRPS公网IP>:7500/…(路径以实际 frps 版本为准),进去可以看哪些端口可以用
[common]
server_addr = 203.0.113.50
server_port = 7000
token = 请替换为与 frps 一致的 token

[ssh-示例]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6021

[rosbridge-示例]
type = tcp
local_ip = 127.0.0.1
local_port = 9092
remote_port = 9092

heartbeat_interval = 30
heartbeat_timeout = 60

  1. remote_port:在云控制台或 frp 面板里看 6000–6040(以你们开放段为准)里未被占用的端口;local_port 要与本机服务一致(SSH 一般为 22,rosbridge 与 launch 里监听端口一致,常见 90909092)。
  2. 执行下面命令,如果日志出现 login to server success / start proxy success,就通了。
sudo mv /tmp/frpc.ini /opt/frp/frpc.ini
sudo chmod 600 /opt/frp/frpc.ini
sudo /opt/frp/frpc -c /opt/frp/frpc.ini

然后你本机测试:
ssh -p 6021 orangepi@示例ip,能连上就没问题了。或者你去http://示例ip:7500/static/#/proxies/tcp后台看有没有[sshyz-6021]端口的一个启动

4.2 常见问题与踩坑

现象原因与处理
Exec format error下了 amd64 的 frpc,板子要 arm64(aarch64)。
EOF / session shutdownfrpc 与 frps 主版本不一致(例如 0.68 连 0.33);换成同版本。
port already usedremote_port 与别人冲突;换一个未占用端口并改 ini。
连上后仍访问不了安全组/防火墙未放行该 remote_port;或 local_port 与本机 ss -tlnp 里实际监听不一致。
token 错误frpc.ini 的 token 必须与 frps 配置里一致;以运维交付为准。
dashboard 看占用端口用 http://<服务器IP>:7500 等形式(以运维说明为准);勿把生产 token/密码写进公开文档。
ini 弃用提示0.33 用 ini 很常见,日志里 deprecated 可先忽略。
重复起两份 frpcsystemd 与 crontab 不要各起一份,会冲突。

5. systemd 自启 frpc(与 §4 衔接)

5.1 按步骤做

  1. 确认 /etc/systemd/system/frpc.service 存在,且 ExecStart= 指向 /opt/frp/frpc -c /opt/frp/frpc.ini(路径与现场一致)。
  2. 设置开机自启动frpc
sudo tee /etc/systemd/system/frpc.service > /dev/null <<'EOF'
[Unit]
Description=FRP Client
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager

要看是否真的生效,继续执行这 4 条最关键验证:

sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager
sudo systemctl is-enabled frpc

判断标准:
status 里有 active (running)
is-enabled 输出 enabled

5.2 常见问题

  • crontab 里又起了一次 frpc → 只保留 systemd 或只保留 cron 之一。
  • ini 后必须 systemctl restart frpc 才加载新配置。

6. crontab 与 shell_dir(开机起 ROS)

6.1 按步骤做

  1. 打开 chitu_ws/shell_dir/cron_start.sh,把里面所有 /root/chitu_ws 改成板子真实路径(例如 /home/orangepi/chitu_ws)。
  2. 保证脚本可执行:
chmod +x /home/orangepi/chitu_ws/shell_dir/*.sh
  1. root 的 crontab 写入 @reboot(示例:整行以你脚本为准):
sudo bash -lc 'cat > /tmp/root_cron.txt << "EOF"
@reboot systemctl restart netfilter-persistent
0 * * * * /home/orangepi/chitu_ws/shell_dir/seq_hd_scan.sh 1 63 >/dev/null 2>&1
58 * * * * /home/orangepi/chitu_ws/shell_dir/tf2.sh 1 >/dev/null 2>&1
#0 2 * * * /home/orangepi/chitu_ws/shell_dir/websocket.sh 1 >/dev/null 2>&1
@reboot /home/orangepi/chitu_ws/shell_dir/cron_start.sh >/dev/null 2>&1
EOF
crontab /tmp/root_cron.txt
crontab -l'
  1. 验证:
    (1) 看 crontab 是否写进去
    sudo crontab -l

(2) 看脚本是否有执行权限(x)
ls -l /home/orangepi/chitu_ws/shell_dir/*.sh

(3) 看 frpc 自启服务是否正常
sudo systemctl status frpc --no-pager
sudo systemctl is-enabled frpc
5.如果cron_start.sh脚本写错的问题没被解决(如果后面代码更新可以不用管这个)。修改cron_start.sh脚本,执行:


cat > /home/orangepi/chitu_ws/shell_dir/cron_start.sh <<'EOF'
#!/bin/bash
set -e

WS="/home/orangepi/chitu_ws"
ROS_SETUP="/opt/ros/noetic/setup.bash"
WS_SETUP="$WS/devel/setup.bash"

# GPIO init
sudo gpio mode 20 in
sudo gpio mode 25 out
sudo gpio write 25 1
sudo gpio mode 9 out
sudo gpio mode 10 out
sudo gpio write 10 0
sudo gpio write 9 0

# stop old screens (ignore if not exists)
for s in serial_port power lidar hd_scan mpu6050 video websocket lio tf2; do
  screen -S "$s" -X quit >/dev/null 2>&1 || true
done

# start nodes in detached screens
screen -dmS serial_port bash -lc "source $ROS_SETUP && source $WS_SETUP && sleep 5 && roslaunch serial_port serial_port.launch"
screen -dmS power       bash -lc "source $ROS_SETUP && source $WS_SETUP && sleep 50 && rosrun power_pkg power_node"
screen -dmS hd_scan     bash -lc "source $ROS_SETUP && source $WS_SETUP && sleep 50 && roslaunch hd_scan hd_scan.launch"
screen -dmS websocket   bash -lc "source $ROS_SETUP && source $WS_SETUP && sleep 60 && roslaunch rosbridge_server rosbridge_websocket.launch"
screen -dmS tf2         bash -lc "source $ROS_SETUP && source $WS_SETUP && sleep 60 && rosrun tf2_web_republisher tf2_web_republisher"

sleep 30

# reset stm32f103
sudo gpio mode 6 out
sleep 3
sudo gpio write 6 1
sleep 3
sudo gpio write 6 0

exit 0
EOF

chmod +x /home/orangepi/chitu_ws/shell_dir/cron_start.sh

然后手动试跑一次:

bash /home/orangepi/chitu_ws/shell_dir/cron_start.sh
screen -ls
如果 screen -ls 能看到 serial_port/power/hd_scan/websocket/tf2 这些会话,就说明这版可用。

5) 看有没有报错日志(若脚本有输出)

sudo journalctl -u frpc -n 80 --no-pager

要看到什么算“通过”
sudo crontab -l:能看到你那 4 行任务。
ls -l ...:每个脚本权限里有 x(例如 -rwxr-xr-x)。
systemctl is-enabled frpc:输出 enabled。
systemctl status frpc:active (running)。
5. 需要验证时:重启板子,登录后 screen -ls / rosnode list 看节点是否起来。或者直接登录frps后台看节点。

6.2 常见问题

现象处理
脚本路径 /root/chitu_ws 不存在全文替换为 /home/orangepi/chitu_ws(或实际路径)。
screen 里命令变成 "creen 等脚本被错误编辑;改用 screen -dmS 名字 bash -lc '整行 source 与 roslaunch'。
roslaunch 找不到包cron 环境无 ROS;须先 source /opt/ros/noetic/setup.bash 再 source …/devel/setup.bash,且用 setup.bash 不要用错 setup.sh。

8. rosbridge(Foxglove / Web 连接)

8.1 按步骤做

  1. 安装:
sudo apt install -y ros-noetic-rosbridge-server
  1. 启动(端口以 launch 为准,常见 90909092):
source /opt/ros/noetic/setup.bash
source ~/chitu_ws/devel/setup.bash
roslaunch rosbridge_server rosbridge_websocket.launch
  1. 本机确认监听:
ss -tlnp | grep -E '9090|9092'
  1. frpc.inilocal_port 必须与这里 一致;Foxglove 填的 ws://...:端口remote_port 一致。

8.2 常见问题

  • rosbridge_server not found → 未安装 ros-noetic-rosbridge-server。
  • Foxglove 连上无自定义消息曲线 → 先用 rostopic hz /某话题 确认板端在发;自定义消息需本机 source 工作空间后再用命令行工具。
  • HTTPS 网页里连 ws:// 被拦 → 用桌面版 Foxglove、http 页或 wss,

9. 收尾自检(建议每次改环境后跑一遍)

9.1 按步骤做

source /opt/ros/noetic/setup.bash
source ~/chitu_ws/devel/setup.bash
rosnode list
rostopic list
ss -tlnp | grep -E '9090|9092|11311'
systemctl is-active frpc
sudo crontab -l

9.2 常见问题

现象处理
rostopic、rosmsg 提示 not found未 source /opt/ros/noetic/setup.bash 与 …/devel/setup.bash。
Cannot load message class未 source 含该消息包的工作空间;或该包未 catkin_make。