一、创建工作空间(包括包和脚本)
- 创建ROS工作空间,在终端执行此命令。
~$ mkdir -p ~/catkinws/src
~$ cd ~/catkin ws/src
~/catkin ws/src$ catkin_init_workspace
- 运行结果
- 在工作空间中创建一个包并生成所需文件。在终端执行此命令。
~/catkin_ws/src$ catkin _create_pkg keyboard_listener rospy std_msgs
- 意思为在~/catkin_ws/src目录下创建了一个名为keyboard_listener的包,并添加了rospy和std_msgs作为依赖。
- 创建一个名为keyboard_listener的包,并且在该包中创建一个Python脚本
~/catkin ws/src$ cd keyboard_listener
~/catkin ws/src/keyboard_listener$ touch keyboard_listener.py
二、编译脚本代码,创建ROS节点
打开并编辑此脚本,这里我使用的是nano编辑器
~/catkin ws/src/keyboard_listener$ touch keyboard_listener.py
~/catkin ws/src/keyboard listener$ nano keyboard_listener.py
1.创建ROS节点1:用于监听键盘动作并发布键盘控制指令
代码如下:
import rospy
from std_msgs.msg import Int32
def keyboard_listener():
rospy.init_node('keyboard_control')
pub = rospy.Publisher('led_command', Int32, queue_size=10)
"""
创建了一个名为’led_command’的发布者(Publisher)。该发布者将Int32类型的数据发布到名为’led_command’的主题(Topic)上,队列大小为10
"""
rate = rospy.Rate(10) #设置发布频率为10HZ
while not rospy.is_shutdown():
command = input('Enter 1 to turn on the LED or 0 to turn it off')
command = int(command)
print('--------------')
print(command)
pub.publish(command) #发布消息
rate.sleep()
keyboard_listener()
在上述代码中,我使用了rospy库来创建一个ROS节点,初始化节点并创建一个Publisher对象用于发布LED控制指令。在主循环中,我使用input函数获取从键盘获取的指令,并将其转为int,然后将消息发布。
给此文件添加可执行权限
~/catkin_ws/src/gpio_controller$ chmod +x ~/catkin_ws/src/gpio_controller/gpio_controller.py
2.同理创建ROS节点2:用于监听ROS1节点中的指令,并通过树莓派的引脚控制LED小灯。
import rospy
from std_msgs.msg import Int32
import RPi.GPIO as GPIO
GPIO.setwarnings(False) #引脚警报,如引脚被占用,设置错误等等
def gpio_controller(data):
led_pin = 18 #引脚号
GPIO.setmode(GPIO.BCM) #设置模式
GPIO.setup(led_pin, GPIO.OUT)
print(type(data))
print(data)
print(data.data)
if data.data: #Int32是一个实例化的类
GPIO.output(led_pin, GPIO.HIGH) #输出高电平
else:
GPIO.output(led_pin, GPIO.LOW) #输出低电平
def gpio_controller_node():
rospy.init_node('gpio_controller_node') #初始化节点
rospy.Subscriber('led_command', Int32, gpio_controller)
#订阅者节点(通过创建一个订阅者对象来实现,对象自动与ROS系统进行通信,订阅指定的主题,这样就能接受和处理其他节点发布的信息)
#还可以指定订阅的主题名称,消息类型,回调函数。
rospy.spin() #等待接受和处理来自其他节点的消息,直到节点被关闭。
三‘、实现终端键盘控制LED开关
新开一个终端
- 执行,运行ROS节点
$ roscore
- 再在一个新的终端运行
sudo python3 gpio_controller.py
- 发现报错则在终端运行
$ su
- 输入密码再执行(把sudo删了)
- 再再在一个新终端运行
sudo python3 keyboard_listener.py
接着输入0,1即可通过ros节点发布消息和接受消息控制led小灯开关
开放节点和话题查看
最后再将树莓派引脚和面包板连接起来。