目录

​​1.配置arduino ide的esp8266硬件支持​​

​​2. 安装rosserial库​​

​​3. 重构ros_lib库​​

​​4.上传串口程序测试​​

​​ 5.上传wifi程序测试​​


我这里的esp8266采用的是arduino ide的开发方式,所以就基于arduino ide开发方式进行配置。

1.配置arduino ide的esp8266硬件支持

这一步主要是在arduino ide里面添加esp8266的硬件支持,我们默认安装完arduino之后,arduino里的开发板选项是没有esp8266的,因此需要添加硬件支持,让arduino ide可以支持esp8266开发板。

添加硬件支持后arduino ide的开发板选项如下(可以看到开发板选项已经有esp8266了): 

ros+arduino学习(八):esp8266与ros局域网话题通讯_esp8266

2. 安装rosserial库

这里我也已经安装好了,没有安装好的小伙伴,可以自行安装,比较简单。

ros+arduino学习(八):esp8266与ros局域网话题通讯_#include_02

3. 重构ros_lib库

这里直接看这个链接就可以。

4.上传串口程序测试

上传如下esp8266代码:

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

ros::NodeHandle nh;
int led;

void messageCb(const std_msgs::Int16& msg) {
if (msg.data > 0) {
led = abs(msg.data);
digitalWrite(led, HIGH - digitalRead(led)); // blink the led
}
}

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
ros::Subscriber<std_msgs::Int16> sub("led", &messageCb);

char hello[15] = "ESP8266 alive!";

void setup()
{
pinMode(2, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(15, OUTPUT);
nh.initNode();
nh.advertise(chatter);
nh.subscribe(sub);
}

void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}

然后运行ros节点通过串口连接esp8266和ubuntu主机。

rosrun rosserial_arduino serial_node.py _port:=/dev/ttyACM0

可以看到已经连接成功。

ros+arduino学习(八):esp8266与ros局域网话题通讯_esp8266_03

 5.上传wifi程序测试

这里上传程序,就可以测试了。

#include <ESP8266WiFi.h>
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/UInt16.h>

#define LED_BUILTIN 2 //led test

const char* ssid = "Zhitong";
const char* password = "95359897";

IPAddress server(192,168,191,2); //设置ros server的IP地址,ros master主机地址
const uint16_t serverPort = 11411;
//设置ros节点句柄,发布者和发布的话题消息数据
ros::NodeHandle nh;
std_msgs::String str_msg;
std_msgs::UInt16 command_led; //the topic which can allowed you to control the led
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "zhitong come"; //话题消息字符数组

void control_led(const std_msgs::UInt16 &msg){
switch(msg.data)
{
case 0:digitalWrite(LED_BUILTIN,HIGH);break; //LOW为亮灯,HIGH为灭灯
case 1:digitalWrite(LED_BUILTIN,LOW);break;
default:digitalWrite(LED_BUILTIN,HIGH);
}

}

ros::Subscriber<std_msgs::UInt16> sub("/command_led", &control_led);

void setup()
{
//通过serial串口日志查看运行状态
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

//将esp8266连入wifi热点
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

//接入rosserial socket服务器
nh.getHardware()->setConnection(server, serverPort);
pinMode(LED_BUILTIN,OUTPUT);
nh.initNode();
nh.subscribe(sub);
nh.advertise(chatter);
}

void loop()
{

if (nh.connected()) {
Serial.println("Connected");
// Say hello
str_msg.data = hello;
chatter.publish( &str_msg );
} else {
Serial.println("Not Connected");
}
nh.spinOnce();
// Loop exproximativly at 1Hz
delay(500);
}

在终端运行(别忘了运行roscore):

rosrun rosserial_python serial_node.py tcp

启动这个程序之后,别忘了按一下esp8266的reset按键,过一会儿(大概十秒钟),就可以看到连接建立了。

如果一直建立不了通信,或者建立通信之后一会儿就掉线了,那可能是无线热点的问题或者路由器的问题,换一个无线路由器或者无线网卡再试试!

通信建立成功后效果如下图:

ros+arduino学习(八):esp8266与ros局域网话题通讯_ros_04

6.参考链接 

1.NodeMCU开发板详解 (第1章-第2节) – 太极创客