当前位置:网站首页>esp32发布机器人电池电压到ros2(micro-ros+CoCube)
esp32发布机器人电池电压到ros2(micro-ros+CoCube)
2022-08-04 01:24:00 【zhangrelay】
示例程序测试端口ad数值:
#include "Arduino.h"
#include <ESP32AnalogRead.h>
ESP32AnalogRead adc;
void setup()
{
adc.attach(34);
Serial.begin(115200);
}
void loop()
{
delay(50);
Serial.println("Voltage = "+String(adc.readVoltage()));
}
这只是一个简单测试ad口电压的程序,没有滤波,没有依据实际进行数值变换。
34是测量电压端口。
初始化,ad和串口波特率:
void setup()
{
adc.attach(34);
Serial.begin(115200);
}
循环测电压并输出串口,时延50ms:
void loop()
{
delay(50);
Serial.println("Voltage = "+String(adc.readVoltage()));
}
这是单片机简单测电压的程序。
需要补充滤波和标度变换。留作思考题。
效果如下图:
micro-ros发布一个消息案例如下:
#include <micro_ros_arduino.h>
#include <stdio.h>
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <std_msgs/msg/int32.h>
#if !defined(ESP32) && !defined(TARGET_PORTENTA_H7_M7) && !defined(ARDUINO_NANO_RP2040_CONNECT)
#error This example is only avaible for Arduino Portenta, Arduino Nano RP2040 Connect and ESP32 Dev module
#endif
rcl_publisher_t publisher;
std_msgs__msg__Int32 msg;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
#define LED_PIN 13
#define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}
#define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}
void error_loop(){
while(1){
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(100);
}
}
void timer_callback(rcl_timer_t * timer, int64_t last_call_time)
{
RCLC_UNUSED(last_call_time);
if (timer != NULL) {
RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
msg.data++;
}
}
void setup() {
set_microros_wifi_transports("***", "***", "***", 8888);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
delay(2000);
allocator = rcl_get_default_allocator();
//create init_options
RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));
// create node
RCCHECK(rclc_node_init_default(&node, "micro_ros_arduino_wifi_node", "", &support));
// create publisher
RCCHECK(rclc_publisher_init_best_effort(
&publisher,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"topic_name"));
msg.data = 0;
}
void loop() {
RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
msg.data++;
}
需要修改哪些代码?
ROS1/2中的数据类型如下:
ROS Message Types
Bool
Byte
ByteMultiArray
Char
ColorRGBA
Duration
Empty
Float32
Float32MultiArray
Float64
Float64MultiArray
Header
Int16
Int16MultiArray
Int32
Int32MultiArray
Int64
Int64MultiArray
Int8
Int8MultiArray
MultiArrayDimension
MultiArrayLayout
String
Time
UInt16
UInt16MultiArray
UInt32
UInt32MultiArray
UInt64
UInt64MultiArray
UInt8
UInt8MultiArray
battery电池,电压情况:
高>4.1v为插入usb口,低为电池供电。
需要启动agent:
参考程序如下:
#include <micro_ros_arduino.h>
#include <stdio.h>
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <std_msgs/msg/float32.h>
#if !defined(ESP32) && !defined(TARGET_PORTENTA_H7_M7) && !defined(ARDUINO_NANO_RP2040_CONNECT)
#error This example is only avaible for Arduino Portenta, Arduino Nano RP2040 Connect and ESP32 Dev module
#endif
#define BAT_DET 34
rcl_publisher_t publisher;
std_msgs__msg__Float32 msg;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
#define LED_PIN 13
#define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}
#define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}
void error_loop(){
while(1){
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(100);
}
}
void timer_callback(rcl_timer_t * timer, int64_t last_call_time)
{
RCLC_UNUSED(last_call_time);
if (timer != NULL) {
RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
msg.data++;
}
}
void setup() {
set_microros_wifi_transports("***", "***", "***", 8888);
pinMode(BAT_DET, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
delay(2000);
allocator = rcl_get_default_allocator();
//create init_options
RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));
// create node
RCCHECK(rclc_node_init_default(&node, "robot_battery_wifi_node", "", &support));
// create publisher
RCCHECK(rclc_publisher_init_best_effort(
&publisher,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Float32),
"robot_battery"));
msg.data = 0.66;
}
void loop() {
float battery = 4.21 * analogRead(BAT_DET) / 2435;
RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
msg.data=battery;
delay(1000);
}
边栏推荐
- C 学生管理系统 显示链表信息、删除链表
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
- The 600MHz band is here, will it be the new golden band?
- 如何用C语言代码实现商品管理系统开发
- nodejs+npm的安装与配置
- nodejs installation and environment configuration
- 《The Google File System》新说
- - heavy OpenCV 】 【 mapping
- 即席查询——Presto
- Thinkphp commonly used techniques
猜你喜欢
随机推荐
boot issue
js中常用的几种遍历处理数据的方法梳理
FeatureNotFound( bs4.FeatureNotFound: Couldn‘t find a tree builder with the features you requested:
What warehouse management problems can WMS warehouse management system solve in the electronics industry?
typescript57-数组泛型接口
GNSS【0】- 专题
typescript50-交叉类型和接口之间的类型说明
C 学生管理系统_分析
GraphQL背后处理及执行过程是什么
Vant3 - click on the corresponding name name to jump to the next page corresponding to the location of the name of the TAB bar
优秀的测试/开发程序员,是怎样修炼的?步步为营地去执行......
The 600MHz band is here, will it be the new golden band?
typescript54-泛型约束
《Greenplum构建实时数据仓库实践》简介
贴纸拼词 —— 记忆化搜索 / 状压DP
typescript58 - generic classes
Web3 security risks daunting?How should we respond?
114. 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因
Observability:你所需要知道的关于 Syslog 的一些知识
VR panorama shooting online exhibition hall, 3D panorama brings you an immersive experience