你好,我是爱吃鱼香ros的小鱼。本节将学习在开发板上实现话题的发布,最终实现通过话题发布当前开发板的电池电量信息,关于电量信息的测量,请参考:4.电池电压测量-学会使用adc。
硬件开发平台为方便学习,本教程配套的硬件是小鱼自制的microros学习板,同时该板可以作为下一章节搭建实体移动机器人的主控板以及后续制作机械臂的驱动板使用。
板载资源图如下:
该主控板可以在小鱼的店铺直接购买,性价比接地气,点击左下角阅读原文直达鱼香小铺。
一、新建工程添加依赖新建example12_microros_topic_pub工程
修改platformio.ini添加依赖
; platformio project configuration file;; build options: build flags, source filter; upload options: custom upload port, speed and extra flags; library options: dependencies, extra library storages; advanced options: extra scripting;; please visit documentation for the other options and examples; https://docs.platformio.org/page/projectconf.html[env:featheresp32]platform = espressif32board = featheresp32framework = arduinolib_deps = https://gitee.com/ohhuo/micro_ros_platformio.git二、编写代码-实现订阅编辑main.cpp,代码如下,注释小鱼已经添加到代码中来了
#include #include #include #include #include // 添加头文件#include rclc_executor_t executor;rclc_support_t support;rcl_allocator_t allocator;rcl_node_t node;rcl_timer_t timer;// 声明话题发布者rcl_publisher_t publisher;// 声明消息文件std_msgs__msg__float32 pub_msg;// 定义定时器接收回调函数void timer_callback(rcl_timer_t *timer, int64_t last_call_time){ rclc_unused(last_call_time); if (timer != null) { rcl_publish(&publisher, &pub_msg, null); }}void setup(){ serial.begin(115200); // 设置通过串口进行microros通信 set_microros_serial_transports(serial); // 延时时一段时间,等待设置完成 delay(2000); // 初始化内存分配器 allocator = rcl_get_default_allocator(); // 创建初始化选项 rclc_support_init(&support, 0, null, &allocator); // 创建节点 topic_sub_test rclc_node_init_default(&node, topic_pub_test, , &support); // 订阅者初始化 rclc_publisher_init_default( &publisher, &node, rosidl_get_msg_type_support(std_msgs, msg, float32), battery_voltage); // 创建定时器,200ms发一次 const unsigned int timer_timeout = 200; rclc_timer_init_default( &timer, &support, rcl_ms_to_ns(timer_timeout), timer_callback); // 创建执行器 rclc_executor_init(&executor, &support.context, 1, &allocator); // 给执行器添加定时器 rclc_executor_add_timer(&executor, &timer); // 初始化adc pinmode(34, input); analogsetattenuation(adc_11db);}void loop(){ delay(100); // 循环处理数据 rclc_executor_spin_some(&executor, rcl_ms_to_ns(100)); // 通过adc获取电压值 int analogvalue = analogread(34); // 读取原始值0-4096 int analogvolts = analogreadmillivolts(34); // 读取模拟电压,单位毫伏 float realvolts = 5.02 * ((float)analogvolts * 1e-3); // 计算实际电压值 pub_msg.data = realvolts;}三、代码注解相比之前的节点代码这里主要多了这几行
•#include 包含flaot32类型头文件
•rcl_publisher_t publisher; 定义发布者
•std_msgs__msg__float32 pub_msg; 定义发布消息,也需要提前定义
•void timer_callback(rcl_timer_t *timer, int64_t last_call_time) 定义定时器回调函数,当我们需要以某个频率做什么的时候定时器可以派上用场
•rclc_publisher_init_default 初始化发布者
•rclc_timer_init_default 初始化定时器
•rclc_executor_add_timer 给执行器添加一个定时器回调
四、下载测试4.1 编译下载连接开发板,编译下载。
4.2 启动agent服务接着打开终端启动agent
sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ros_distro serial --dev /dev/ttyusb0 -v点击下rst按钮,重启开发板,正常可以看到下图内容
4.3 测试是否连通ros2 node listros2 topic list
4.4 查看话题数据ros2 topic echo /battery_voltage
这里小鱼连接了小车的电池,vm电压代表电池电压,符合正常电压值范围。
同时可以使用下面指令测量话题频率
fishros@fishros-ms-7d42:~/example12_microros_topic_pub$ ros2 topic hz /battery_voltage average rate: 4.828 min: 0.207s max: 0.208s std dev: 0.00021s window: 6average rate: 5.034 min: 0.106s max: 0.208s std dev: 0.02793s window: 12average rate: 4.973 min: 0.106s max: 0.208s std dev: 0.02378s window: 17average rate: 4.941 min: 0.106s max: 0.208s std dev: 0.02104s window: 22average rate: 5.005 min: 0.106s max: 0.208s std dev: 0.02594s window: 28average rate: 4.977 min: 0.106s max: 0.208s std dev: 0.02404s window: 33average rate: 4.958 min: 0.106s max: 0.208s std dev: 0.02249s window: 38average rate: 4.997 min: 0.106s max: 0.208s std dev: 0.02541s window: 44五、总结本节我们通过电量信息发布例程,学习了如何在开发板上实现话题发布流程。下一节我们开始尝试在开发板上建立服务端,尝试服务通信。
结合电能质量的模块化智能电网解决方案
量子传感器的特性与应用解析
宠物经济飞速崛起,对智能家居行业带来何种影响?
Fluke Ti401 PRO红外热像仪的主要特性及功能分析
博通CIO:预测 2014年的七大技术潮流
如何在开发板上实现话题发布流程
Animatrick宣布与Lifelike&Believable合作,帮助实现实时in-VR性能捕获
气动薄膜切断阀的特点_气动薄膜切断阀的特性
人工智能将对人类生活产生重大影响 并将成为下一个技术奇点的起因
谷歌在不久的将来开发新的增强现实(AR)产品
三种保护LED电路方法的经验总结,three methods of protection Experience of LED circuit
LED屏企业如何才能实现弯道超车成为行业巨头
指纹、面部、虹膜三大生物识别技术各有能耐 屏下指纹将是手机卖点
一站式元宇宙活动管理云平台视创云会场,助力企业营销活动玩出新高
连接器生产厂商有哪些 接触器有什么作用
传感器技术在医疗行业中进行非接触式生命体征监测的应用解析
奥地利微电子高精度电池管理数据采集前端IC
智能蓝牙技术原理及设计方案集锦
结合云端发展,2020年VR游戏将走向何方?
关于三星贴片电容两种识别方法的详细说明