ROS中Python节点运行报Not running on a RPi!错误问题求助
报错信息
Traceback (most recent call last): File "/home/ubuntu/catkin_ws/src/pijoy/src/pijoy_node.py", line 13, in <module> GPIO.setup(LED_GPIO, GPIO.OUT) RuntimeError: Not running on a RPi!
报错触发逻辑
这个报错是RPi.GPIO库在初始化阶段没有检测到合法的树莓派硬件标识触发的,和你已经配置的GPIO用户组权限、ROS环境变量没有关系,这两项配置不影响库的硬件识别流程。
排查与解决步骤
按优先级依次排查:
- 第一步先确认运行硬件:执行
cat /proc/device-tree/model查看输出,如果内容不包含Raspberry Pi字样,说明当前设备不是原生树莓派。RPi.GPIO库仅支持官方树莓派硬件,其他ARM开发板(香橙派、Rockchip系列板卡等)、x86 PC、WSL/普通虚拟机环境都会触发这个报错。这种场景下要么更换树莓派硬件运行节点,要么替换为适配当前硬件的GPIO库(比如原厂SDK、跨硬件的lgpio库),纯功能调试不需要操作实际硬件的话,可以用GPIO模拟库替换RPi.GPIO,无需修改后续业务代码。 - 确认是树莓派硬件的情况下,检查系统依赖完整性:如果你刷的是第三方定制系统(第三方Ubuntu、Armbian等),大概率缺失树莓派硬件识别相关的固件包,执行以下命令重装依赖后重启设备:
sudo apt update sudo apt install -y raspberrypi-bootloader rpi.gpio-common python3-rpi.gpio - 检查运行环境是否为容器/虚拟化实例:如果是用Docker、LXC跑ROS节点,默认容器没有权限读取宿主机硬件信息、访问GPIO接口,启动容器时需要添加
--privileged权限,同时挂载/dev/gpiomem、/sys/class/gpio目录到容器内,否则库无法识别硬件。 - 检查GPIO接口权限配置:执行
ls /dev/gpiomem确认设备节点存在,如果提示文件不存在,执行sudo raspi-config,进入Interface Options分类,开启GPIO硬件访问权限,重启后设备节点会自动生成。 - 仅做代码逻辑调试、不需要实际控制GPIO时,可以在导入GPIO库前添加环境变量跳过硬件检测。顺带提一句,你贴的原始代码还有一个逻辑问题:
SetBool服务的回调直接返回字典会触发序列化报错,修复GPIO问题后也需要调整,完整修正后的参考代码如下:#!/usr/bin/env python3 import rospy import os # 加在导入RPi.GPIO之前,开启模拟模式可跳过硬件检测 os.environ['GPIO_EMULATION'] = '1' from std_srvs.srv import SetBool, SetBoolResponse import RPi.GPIO as GPIO LED_GPIO = 20 def set_led_state_callback(req): GPIO.output(LED_GPIO, req.data) return SetBoolResponse(success=True, message='Successfully changed LED state') if __name__ == '__main__': rospy.init_node('led_actuator') GPIO.setmode(GPIO.BCM) GPIO.setup(LED_GPIO, GPIO.OUT) rospy.Service('set_led_state', SetBool, set_led_state_callback) rospy.loginfo("Service server started. Ready to get requests.") rospy.spin() GPIO.cleanup()
内容的提问来源于stack exchange,提问作者mattcrouse
相关产品推荐
相关产品推荐

