ROS学习日志:通过节点发布和接收消息控制LED灯的开关

一、创建工作空间(包括包和脚本)

  • 创建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的包,并添加了rospystd_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小灯开关

开放节点和话题查看

 最后再将树莓派引脚和面包板连接起来。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值