查看: 3770|回复: 0

[经验] 【FirePrime】通过arduino学习ROS系列2ROS点亮LED

[复制链接]
  • TA的每日心情
    奋斗
    2018-11-15 08:49
  • 签到天数: 1031 天

    连续签到: 2 天

    [LV.10]以坛为家III

    发表于 2015-10-13 18:17:12 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 liuyu-419812 于 2015-10-13 18:23 编辑

          参考:http://wiki.ros.org/rosserial_arduino/Tutorials/Blink
          我们在之前的教程中已经创建了一个ROS发布者,在这里我们将创建一个订阅者,在Arduino每次收到消息的时候闪烁LED。通过在Arduino examples菜单选择ros_lib->Blink,你会打开下面的代码:
    1. /*
    2. * rosserial Subscriber Example
    3. * Blinks an LED on callback
    4. */
    5. #include <ros.h>
    6. #include <std_msgs/Empty.h>
    7. ros::NodeHandle nh;
    8. void messageCb( const std_msgs::Empty& toggle_msg){
    9.   digitalWrite(13, HIGH-digitalRead(13)); // blink the led
    10. }
    11. ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
    12. void setup()
    13. {
    14.   pinMode(13, OUTPUT);
    15.   nh.initNode();
    16.   nh.subscribe(sub);
    17. }
    18. void loop()
    19. {
    20.   nh.spinOnce();
    21.   delay(1);
    22. }
    复制代码
          现在,我们来分析下面的代码。
    1. #include <ros.h>
    2. #include <std_msgs/Empty.h>
    复制代码
          如之前一样,我们需要在任何ROS Arduino程序里包含ros.h。我们也需要为消息包含头文件,在这个例子下,为Empty消息。
    1. ros::NodeHandle nh;
    复制代码
          接着,我们需要实例化一个节点句柄,允许我们的程序创建发布者和订阅者。节点句柄需要串口通信。
    1. void messageCb( const std_msgs::Empty& toggle_msg){
    2. digitalWrite(13,HIGH-digitalRead(13));
    3. }
    复制代码
          然后,我们为订阅者创建回掉函数。这个回掉函数必须将一个消息的常量引用作为它的参数。在我们的回掉函数中,消息类型是std_msgs::Empty,消息名是toggle_msg在我们的回掉函数内部,我们可以引用toggle_msg,但是因为它是空的,所以不需要这么做。我们只是在Arduino每次收到消息的时候闪烁LED
    1. ros::Subscriber<std_msgs::Empty> sub(“toggle_led”,&messageCb);
    复制代码
          我们需要实例化我们要使用的发布者和订阅者。这里我们实例化名为“toggle_led”的主题的订阅者,消息类型为std_msgs::Empty。你必须知道基于消息的订阅者模板。它的两个参数是它要订阅的主题和它要使用的回掉函数。
    1. void setup()
    2. {
    3. pinMode(13,OUTPUT);
    4. nh.initNode();
    5. nh.subscribe(sub);
    6. }
    复制代码
          在Arduino setup函数,你需要初始化你的ROS节点句柄,广播将要发布的主题,订阅想监听的主题。
    1. void loop()
    2. {
    3. nh.spinOnce();
    4. delay(1);
    5. }
    复制代码
          最后,在loop函数里,我们调用ros::spinOnce()函数,处理所有的ROS通信回掉函数。在loop()函数里,我们不需要其他额外的处理,因为,ros::spinOnce()会将传递的消息传到订阅者回掉函数。
        分析完代码,下面需要编译上传。接着,在新的终端窗口,启动roscore
    1. roscore
    复制代码
          然后,运行rosserial客户端应用程序, 其中<ws>为你安装rosserial的工作空间,确保使用正确的串口:
    1. source ~/<ws>/install/setup.bash
    复制代码
    1. rosrun rosserial_python serial_node.py /dev/ttyACM0
    复制代码
          最后,你可以使用rostopic转换你的LEd状态。
    1. rostopic pub toggle_std std_msgs/Empty --once
    复制代码
    P51010-184020.jpg

    P51010-183955.jpg

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-6 13:56 , Processed in 0.115862 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.