目录

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了):

2. 安装rosserial库

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

3. 重构ros_lib库

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

https://guyuehome.com/35223

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

可以看到已经连接成功。

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按键,过一会儿(大概十秒钟),就可以看到连接建立了。

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

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

6.参考链接 

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