板子环境配置
板子环境配置与自检(详细 + 踩坑)
对应总览: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 等。
处理(同一类思路):
- 缺系统/ROS 包:
sudo apt install ros-noetic-<包名>,并在 package.xml、CMakeLists.txt 里声明 find_package / depend。 - 本工作空间生成的消息:在用的包的 CMakeLists.txt 里对生成目标加 add_dependencies(你的节点目标 motor_control_msgs_generate_messages_cpp) 等,避免 catkin_make -j 并行时先生成了用消息的节点。
- 头文件路径:必要时在对应 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 按步骤做
- 在 PC 上下载 与服务器 frps 同大版本 的 linux arm64 包(例如 0.33.0),解压得到可执行文件
frpc,再用scp frpc orangepi@板子IP:/tmp/等方式拷到板子。 - 在板子上建目录并放入 frpc(示例目录 /opt/frp/):
sudo mkdir -p /opt/frp
sudo cp /tmp/frpc /opt/frp/ # 若 frpc 在其它路径,改成实际路径
sudo chmod +x /opt/frp/frpc
- 编写 /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
- 选
remote_port:在云控制台或 frp 面板里看 6000–6040(以你们开放段为准)里未被占用的端口;local_port要与本机服务一致(SSH 一般为 22,rosbridge 与 launch 里监听端口一致,常见 9090 或 9092)。 - 执行下面命令,如果日志出现 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 shutdown | frpc 与 frps 主版本不一致(例如 0.68 连 0.33);换成同版本。 |
| port already used | remote_port 与别人冲突;换一个未占用端口并改 ini。 |
| 连上后仍访问不了 | 安全组/防火墙未放行该 remote_port;或 local_port 与本机 ss -tlnp 里实际监听不一致。 |
| token 错误 | frpc.ini 的 token 必须与 frps 配置里一致;以运维交付为准。 |
| dashboard 看占用端口 | 用 http://<服务器IP>:7500 等形式(以运维说明为准);勿把生产 token/密码写进公开文档。 |
| ini 弃用提示 | 0.33 用 ini 很常见,日志里 deprecated 可先忽略。 |
| 重复起两份 frpc | systemd 与 crontab 不要各起一份,会冲突。 |
5. systemd 自启 frpc(与 §4 衔接)
5.1 按步骤做
- 确认 /etc/systemd/system/frpc.service 存在,且 ExecStart= 指向 /opt/frp/frpc -c /opt/frp/frpc.ini(路径与现场一致)。
- 设置开机自启动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 按步骤做
- 打开 chitu_ws/shell_dir/cron_start.sh,把里面所有 /root/chitu_ws 改成板子真实路径(例如 /home/orangepi/chitu_ws)。
- 保证脚本可执行:
chmod +x /home/orangepi/chitu_ws/shell_dir/*.sh
- 用 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) 看 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 按步骤做
- 安装:
sudo apt install -y ros-noetic-rosbridge-server
- 启动(端口以 launch 为准,常见 9090 或 9092):
source /opt/ros/noetic/setup.bash
source ~/chitu_ws/devel/setup.bash
roslaunch rosbridge_server rosbridge_websocket.launch
- 本机确认监听:
ss -tlnp | grep -E '9090|9092'
frpc.ini里local_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。 |