ESP8266和ROS收发消息读取模拟量控制LED亮度ESP8266和ROS调试一些问题汇总

举报
zhangrelay 发表于 2021/07/15 01:27:35 2021/07/15
【摘要】 如果需要ESP8266和ROS通信先阅读如下博客: ESP8266和ROS调试一些问题汇总 https://zhangrelay.blog.csdn.net/article/details/108762844 这里测试环境melodic和noetic都可行。 源代码如下: #if (ARDUINO >= 100) #include <Arduino....

如果需要ESP8266和ROS通信先阅读如下博客:


这里测试环境melodic和noetic都可行。

源代码如下:


  
  1. #if (ARDUINO >= 100)
  2. #include <Arduino.h>
  3. #else
  4. #include <WProgram.h>
  5. #endif
  6. #include <ESP8266WiFi.h>
  7. #include <ros.h>
  8. #include <std_msgs/String.h>
  9. #include <std_msgs/Int16.h>
  10. #include <std_msgs/Float64.h>
  11. #include <Servo.h>
  12. #include <rosserial_arduino/Adc.h>
  13. //
  14. // WiFi Definitions //
  15. //
  16. const char* ssid = "HUAWEI_WiFi";
  17. const char* password = "cslgcslg";
  18. IPAddress server(192, 168, 3, 153); // ip of your ROS server
  19. IPAddress ip_address;
  20. int status = WL_IDLE_STATUS;
  21. WiFiClient client;
  22. class WiFiHardware {
  23. public:
  24. WiFiHardware() {};
  25. void init() {
  26. // do your initialization here. this probably includes TCP server/client setup
  27. client.connect(server, 11411);
  28. }
  29. // read a byte from the serial port. -1 = failure
  30. int read() {
  31. // implement this method so that it reads a byte from the TCP connection and returns it
  32. // you may return -1 is there is an error; for example if the TCP connection is not open
  33. return client.read(); //will return -1 when it will works
  34. }
  35. // write data to the connection to ROS
  36. void write(uint8_t* data, int length) {
  37. // implement this so that it takes the arguments and writes or prints them to the TCP connection
  38. for(int i=0; i<length; i++)
  39. client.write(data[i]);
  40. }
  41. // returns milliseconds since start of program
  42. unsigned long time() {
  43. return millis(); // easy; did this one for you
  44. }
  45. };
  46. Servo s;
  47. int i;
  48. void chatterCallback(const std_msgs::String& msg) {
  49. i = atoi(msg.data);
  50. s.write(i);
  51. }
  52. std_msgs::String str_msg;
  53. rosserial_arduino::Adc adc_msg;
  54. ros::Publisher chatter("chatter", &str_msg);
  55. ros::Publisher p("adc", &adc_msg);
  56. ros::Subscriber<std_msgs::String> sub("message", &chatterCallback);
  57. ros::NodeHandle_<WiFiHardware> nh;
  58. char hello[20] = "ESP8266 wifi alive!";
  59. void setupWiFi()
  60. {
  61. WiFi.begin(ssid, password);
  62. Serial.print("\nConnecting to "); Serial.println(ssid);
  63. uint8_t i = 0;
  64. while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  65. if(i == 21){
  66. Serial.print("Could not connect to"); Serial.println(ssid);
  67. while(1) delay(500);
  68. }
  69. Serial.print("Ready! Use ");
  70. Serial.print(WiFi.localIP());
  71. Serial.println(" to access client");
  72. }
  73. int averageAnalog(int pin){
  74. int v=0;
  75. for(int i=0; i<2; i++) v+= analogRead(pin);
  76. return v/2;
  77. }
  78. void setup() {
  79. Serial.begin(115200);
  80. setupWiFi();
  81. delay(2000);
  82. s.attach(13); // PWM pin
  83. nh.initNode();
  84. nh.advertise(chatter);
  85. nh.subscribe(sub);
  86. nh.advertise(p);
  87. }
  88. void loop() {
  89. str_msg.data = hello;
  90. chatter.publish( &str_msg );
  91. adc_msg.adc0 = averageAnalog( 0 );
  92. p.publish( &adc_msg );
  93. nh.spinOnce();
  94. delay( 10 );
  95. }

简单解释一下,发布节点chatter,adc,订阅节点message。

  1. message提取数值作为PWM波送到13脚控制LED亮度(占空比);
  2. adc采集模拟量绘制曲线;
  3. chatter只用作发布消息,告知主机连接成功。

使用如下命令启动wemos D1和ROS:

  • roscore
  • rosrun rosserial_python serial_node.py tcp
  • rostopic pub /message std_msgs/String "data: '10'"
  • rostopic echo /adc
  • rostopic echo /chatter

过程如下:

roscore

rosrun rosserial_python serial_node.py tcp

主题列表:

rostopic pub /message std_msgs/String "data: '10'"

使用rqt_graph查看所有节点状态:

使用rosbag记录ADC数据并使用plot查看曲线:

关闭所有节点,只留下roscore,使用rosbag play查看记录数据:

 所有Arduino,stm32等单片机都可以借助ROS实现物联网硬件功能。


-Fin-


 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/108856947

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。