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