在本教程之前,請先確認是否安裝好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被熄滅了!