在本教程之前,请先确认是否安装好arduino的IDE和加载了ROS的库文件;
安装IDE的参考文章
:https://blog.csdn.net/zengqz123/article/details/82712648
加载ROS库的参考文章
:http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup
在ROS库里面有很多的例程是基于串口的GPIO控制,但是esp8266不仅仅支持串口通讯,还能使用TCP进行通讯。因此我在例程上进行修改,通过TCP的连接方式对IO进行控制(无线控制)。
#include <ESP8266WiFi.h>
#include <ros.h>
#include <std_msgs/Empty.h>
const char* ssid = "qingzhaonizuishuai";
const char* password = "qingzhaonizuishuai123";
// Set the rosserial socket server IP address
IPAddress server(192,168,0,157);
// Set the rosserial socket server port
const uint16_t serverPort = 11411;
ros::NodeHandle nh;、
void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
void setup()
{
pinMode(13, OUTPUT);
// Use ESP8266 serial to monitor the process
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// Connect the ESP8266 the the wifi AP
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set the connection to rosserial socket server
nh.getHardware()->setConnection(server, serverPort);
nh.initNode();
// Another way to get IP
Serial.print("IP = ");
Serial.println(nh.getHardware()->getLocalIP());
nh.subscribe(sub);
}
void loop()
{
if (nh.connected()) {
Serial.println("Connected");
} else {
Serial.println("Not Connected");
}
nh.spinOnce();
delay(1);
}
注意要修改的地方!!!!我开始没注意到,修改了很久也没成功通讯。
第一要把ssid和password修改成你的wifi账号密码
第二要把IPAddress,修改成运行roscore主机的IP地址
const char* ssid = "qingzhaonizuishuai";
const char* password = "qingzhaonizuishuai123";
// Set the rosserial socket server IP address
IPAddress server(192,168,0,157);
将程序烧写进esp8266芯片后,把LED灯正负极连接到ESP8266的D7和GND。
主机运行以下命令连接eps8266:
rosrun rosserial_python serial_node.py tcp
当出现以下信息时说明连接成功:
主机运行以下命令,发布点亮LED信息:
rostopic pub toggle_led std_msgs/Empty --once
等待三秒后,LED被点亮了!
再一次运行当前命令,LED被熄灭了!