ROS与Arduino学习小案例节点通信

Posted #Cloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS与Arduino学习小案例节点通信相关的知识,希望对你有一定的参考价值。

ROS与Arduino学习(七)小案例节点通信

 

Tutorial Level:Logging日志

Next Tutorial:电机控制(基于rosserial_arduino)

       本节主要用一个小的案例介绍用PC客户端对Arduino的灯进行控制。共有两个节点,一个几点在PC上将用户的数据输入,并将数据发布到话题中,然后Arduino的节点订阅话题获取消息对灯进行控制。

 

Tips 1 PC端节点程序

 整体代码如下所示:

#include "ros/ros.h"  
#include "std_msgs/Int16.h"  
#include "std_msgs/String.h" 
#include <cstdlib>  
#include <sstream>  
int main(int argc, char **argv)  
{  
    int count;
    ros::init(argc, argv, "Control2Arduino");  
    

    if (argc != 2)
    {
        ROS_INFO("usage: add_speed v");
        return 1;
    }
    ros::NodeHandle n;  

    std::stringstream ss; 

    std_msgs::Int16 msg;  


    ros::Publisher chatter_pub = n.advertise<std_msgs::Int16>("Pc2Arduino", 1000);  
      
    ros::Rate loop_rate(10);  
  
    while (ros::ok())  
    {  
        msg.data = atoll(argv[1]);//读入数据
  
        chatter_pub.publish(msg); 
   
        ros::spinOnce(); 
       
        loop_rate.sleep();  
    }  
      
      
    return 0;  
    }  

 

代码解释:

1、运行功能包时需要给定一个参数,我们读取argv[1],并将其作为速度值消息发布到话题中。

2、程序开始有一个参数检测,当输入为两个值时(其中一个值为回车),此时继续运行后面的代码,如果错误则返回异常。

        if (argc != 2)
	{
		ROS_INFO("usage: add_speed v");
		return 1;
	}

 3、读取数据

 msg.data = atoll(argv[1]);//读入数据

 4、发布数据

 

Tips 2 Arduino端节点程序

 

程序如下:

#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int16.h>

ros::NodeHandle nh;

std_msgs::String str_msg;
//publish and subscribe
//
ros::Publisher pub("Arduino2PC",&str_msg);

void Control(const std_msgs::Int16& cmd_msg)
{
  if(cmd_msg.data == 1)
  {
    digitalWrite(13, LOW);  
  }
  if(cmd_msg.data == 0)
  {
    digitalWrite(13, HIGH);  
  }

}

ros::Subscriber <std_msgs::Int16>  sub("Pc2Arduino", &Control );

char hello[]="hello world!";




void setup()
{
        pinMode(13, OUTPUT);
        digitalWrite(13, HIGH);
	nh.initNode();
	nh.advertise(pub);// publish
	nh.subscribe(sub);// subscribe 

}

void loop()
{
	str_msg.data = hello;
	pub.publish(&str_msg);//publish a message
	nh.spinOnce();
	delay(1000);


}

 

 

 

Tips 3 测试程序

#新终端打开
$ roscore
#新终端打开
$  rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
#新终端打开
$  rosrun PCSystem Control2Arduino 1

 

以上是关于ROS与Arduino学习小案例节点通信的主要内容,如果未能解决你的问题,请参考以下文章

《ROS理论与实践》学习笔记ROS通信编程

从零搭建一辆ROS小车 串口通信功能包

ros_arduino_bridge功能包的使用

ROS学习笔记- 节点消息话题服务节点管理器

ROS学习笔记3.(理论)什么是ROS以及一些核心概念

C++文件与STM32进行串口通信例程