ros+arduino学习(八):esp8266与ros局域网话题通讯
原创
©著作权归作者所有:来自51CTO博客作者mb6376218bdd5cf的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
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库
这里直接看这个链接就可以。
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节) – 太极创客