ROS与STM32F407实现消息通信(含源码)

2023-10-31

关注微信公众号“混沌无形”,后台回复:13462EE。免费获取完整工程源码!

本文参考STM32F1与ROS的通信工程:https://blog.csdn.net/qq_36349536/article/details/82773064,针对STM32F4的相关寄存器进行修改,实现STM32F407与ROS kinetic实现串口通信 ,message格式遵循ROS消息标准。

并实现4WD机器人驱动控制及轨迹跟踪,其代码包含:GY901陀螺仪数据读取、通过CAN总线控制4个大疆电机M1、电机的PID控制以及4WD机器人的正逆运动学模型。

文件目录为

C:.
├─BSP
├─CORE
├─DRIVER
│  ├─CAN1
│  ├─gy85
│  ├─Kinematics
│  ├─LED
│  ├─MOTORCONTROLL
│  ├─PID
│  └─WT901C
├─FWLIB
│  ├─inc
│  └─src
├─HARDWARE
│  ├─BEEP
│  ├─KEY
│  └─LED
├─OBJ
├─ROSLIB
│  ├─actionlib
│  ├─actionlib_msgs
│  ├─actionlib_tutorials
│  ├─bond
│  ├─control_msgs
│  ├─diagnostic_msgs
│  ├─driver_base
│  ├─dynamic_reconfigure
│  ├─examples
│  │  ├─ADC
│  │  ├─Blink
│  │  ├─BlinkM
│  │  ├─button_example
│  │  ├─Clapper
│  │  ├─HelloWorld
│  │  ├─IrRanger
│  │  ├─Logging
│  │  ├─Odom
│  │  ├─pubsub
│  │  ├─ServiceClient
│  │  ├─ServiceServer
│  │  ├─ServoControl
│  │  ├─Temperature
│  │  ├─TimeTF
│  │  └─Ultrasound
│  ├─gazebo_msgs
│  ├─geometry_msgs
│  ├─hector_mapping
│  ├─hector_nav_msgs
│  ├─laser_assembler
│  ├─nav_msgs
│  ├─nodelet
│  ├─pcl_msgs
│  ├─polled_camera
│  ├─riki_msgs
│  ├─ros
│  ├─roscpp
│  ├─roscpp_tutorials
│  ├─rosgraph_msgs
│  ├─rospy_tutorials
│  ├─rosserial_arduino
│  ├─rosserial_msgs
│  ├─ros_arduino_msgs
│  ├─sensor_msgs
│  ├─shape_msgs
│  ├─smach_msgs
│  ├─std_msgs
│  ├─std_srvs
│  ├─stereo_msgs
│  ├─tests
│  │  ├─array_test
│  │  ├─float64_test
│  │  └─time_test
│  ├─tf
│  ├─tf2_msgs
│  ├─theora_image_transport
│  ├─topic_tools
│  ├─trajectory_msgs
│  ├─turtlesim
│  ├─turtle_actionlib
│  └─visualization_msgs
├─SYSTEM
│  ├─delay
│  ├─sys
│  └─usart
└─USER
    ├─Listings
    └─Objects

main函数部分如下


#include <stdio.h>
#include "hardwareserial.h"
#include "millisecondtimer.h"

#include <ros.h>
#include "std_msgs/String.h"
#include "std_msgs/Float64.h"
#include "sstream"
#include <geometry_msgs/Vector3.h>
#include <geometry_msgs/Quaternion.h>
#include <ros/time.h>
#include <geometry_msgs/Twist.h>
#include <sensor_msgs/Imu.h>

#include "led.h"
#include "Kinematics.h"
#include "wt901.h"
#include "can1.h"
#include "motorcontroll.h"
#include "PID.h"

Led led0(LED0);
Led led1(LED1);

Kinematics car(MAX_RPM, WHEEL_DIAMETER, BASE_WIDTH,X_COEFFICIENT_CAR, MOTORGEARRATIO);

PID motor1SpdPID(-16384, 16384, K_P, K_I, K_D);
PID motor2SpdPID(-16384, 16384, K_P, K_I, K_D);
PID motor3SpdPID(-16384, 16384, K_P, K_I, K_D);
PID motor4SpdPID(-16384, 16384, K_P, K_I, K_D);

//更新IMU信息
sensor_msgs::Imu updateIMUMsg()
{
	sensor_msgs::Imu wt901Msg;
	wt901Msg.angular_velocity.x = getAngularVelocity().angvel0;
	wt901Msg.angular_velocity.y = getAngularVelocity().angvel1;
	wt901Msg.angular_velocity.z = getAngularVelocity().angvel2;
	
	wt901Msg.linear_acceleration.x = getLinearAccleration().linacc0;
	wt901Msg.linear_acceleration.y = getLinearAccleration().linacc1;
	wt901Msg.linear_acceleration.z = getLinearAccleration().linacc2;
	
	wt901Msg.orientation.w = getOrientation().orien0;
	wt901Msg.orientation.x = getOrientation().orien1;
	wt901Msg.orientation.y = getOrientation().orien2;
	wt901Msg.orientation.z = getOrientation().orien3;
	
	return wt901Msg;
}




ros::NodeHandle  nh;

//陀螺仪信息
sensor_msgs::Imu IMUMsg;
//发布IMU信息
ros::Publisher imu_msg_pub("imu", &IMUMsg);

//定义几何中心速度信息
float vx = 0;
float wz = 0;
uint32_t previous_command_time = 0;

//**********
geometry_msgs::Twist viewVel;

void vel_callback( const geometry_msgs::Twist& cmd_msg)
{
		wz = cmd_msg.angular.z;
		vx = cmd_msg.linear.x;
	  viewVel = cmd_msg;
}

ros::Subscriber<geometry_msgs::Twist> vel_cmd_sub("cmd_vel", &vel_callback); 

//*************查看电机速度-临时使用
geometry_msgs::Quaternion mspd;
ros::Publisher mspd_msg_pub("mspd", &mspd);

ros::Publisher vel_msg_pub("viewVelCmd", &viewVel);

int main(void) 
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //很有必要性
	uint32_t previous_control_time = 0;
	uint32_t previous_led_time = 0;
	uint32_t previous_imu_time = 0;
	uint32_t previous_motor_time = 0;
	bool OnOff = true;
	
	SystemInit();							//系统时钟初始化
	initialise();							//延时函数初始化*/
	
	CAN1_Configuration();
	
	led0.init();
	led1.init();
	
	wt901Init(9600);
  
	
	nh.initNode();                                                                //初始化
  while (!nh.connected())                                                       //等待连接
	{
		nh.spinOnce();

	}   
	nh.loginfo("robot_Star Connected!");                                          //打印连接成功                                          
	delay(10);
	nh.advertise(imu_msg_pub);
	nh.advertise(mspd_msg_pub);
	nh.advertise(vel_msg_pub);
	nh.subscribe(vel_cmd_sub);
	delay(10);
	
	while(1)
	{           	      
		//速度控制
		if( (millis() - previous_control_time) >= (1000/PID_RATE) )
		{
			Kinematics::motorSpd spd = car.VelToMotorSpd(vx, 0 ,wz);
			int M1Spd = int(motor1SpdPID.compute(spd.m_left_front, readMotorSpd(1)));
			int M2Spd = int(motor1SpdPID.compute(spd.m_right_front, readMotorSpd(2)));
			int M3Spd = int(motor1SpdPID.compute(spd.m_left_back, readMotorSpd(3)));
			int M4Spd = int(motor1SpdPID.compute(spd.m_right_back, readMotorSpd(4)));
			Set_CM_Current(M1Spd, M2Spd, M3Spd, M4Spd);
      
			//待改
//      mspd.w = M1Spd;
//			mspd.x = M2Spd;
//			mspd.y = M3Spd;
//			mspd.z = M4Spd;
		  mspd.w = spd.m_left_front;
			mspd.x = spd.m_right_front;
			mspd.y = spd.m_left_back;
			mspd.z = spd.m_right_back;

			previous_control_time = millis();
		}
		
		//停止电机
//	 if ((millis() - previous_command_time) >= 2000)
//		{
//			vx = 0;
//			wz = 0;
//			Set_CM_Current(0, 0, 0, 0);
//		}
		
		//发布陀螺仪信息
		if ((millis() - previous_imu_time) >= (1000 / IMU_PUBLISH_RATE))
		{
			IMUMsg = updateIMUMsg();
			imu_msg_pub.publish(&IMUMsg);
			previous_imu_time = millis();
		}
		
		//发布电机信息---需要改
		if ((millis() - previous_motor_time) >= (1000 / VEL_PUBLISH_RATE))
		{
			mspd_msg_pub.publish(&mspd);
			vel_msg_pub.publish(&viewVel);
			previous_motor_time = millis();
		}
		
		//led闪烁
		if ((millis() - previous_led_time) >= (1000 / LED_RATE))
		{
			led0.on_off(OnOff);
			OnOff = !OnOff;
			previous_led_time = millis();
		}

		nh.spinOnce();

	}
	return 0;

}

喜欢的话,请关注微信公众号,可阅读更多好文!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS与STM32F407实现消息通信(含源码) 的相关文章

  • 人脸识别技术也被应用到了移动支付领域

    随着智能手机及互联网的发展 移动支付已经成为了目前我国增速最快的支付方式 在移动支付发展过程中 各种新型的支付方式层出不穷 如二维码支付 NFC支付等 近年来 伴随着人工智能 机器学习及传感器的逐步发展 生物识别技术也被应用到了移动支付领域
  • 什么是软件外包公司?要不要去外包公司?

    关注后回复 进群 拉你进程序员交流群 作者丨土豆居士 来源丨一口Linux ID yikoulinux 一 什么是外包 软件外包分为 人力外包和项目外包两个方向 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约
  • Qt的ui文件不能简单复制

    在使用vs Qt开发时 直接复制另外一个widget类的ui文件 简单改名成当前类对应的ui文件 会导致编译出错 尽可能使用添加的Qt class自带的ui文件 因为ui文件的配置文件中有许多与当前类相关的字符串 简单复制容易报错
  • 刷脸支付是新奇的安全的支付体验

    扫脸支付 刷脸付钱的新奇 便利 有效率和安全的支付体验 能够大大提高客户对刷脸商品的和信赖度 刷脸不仅仅在过程中时间 还将吸引消费者注意力的时间延长了5秒到8秒右左 这几秒就会有巨大的商业价值 是让顾客同商家的经营生产有效多维 充分接触的5
  • Windows 10版本business_editions和consumer_editions的区别?

    Windows 10版本business editions和consumer editions的区别 答1 二者都内置专业版 不同之处在于 consumer editions 版本包含 Home 家庭版 Education 教育版 Prof
  • 刷脸支付服务商提供极致的用户体验

    刷脸支付正在攻占人们生活中的各个场景 在北京 可能依靠刷脸就可乘坐地铁了 据报道 北京地铁部门已开始测试面部识别技术 目前正在机场线内部测试中 一旦验证成功 将会在全路网铺开 最近一个月 垃圾分类成了热点 全国开始进入生活垃圾强制分类新时代
  • 技术和商业角度刷脸支付都将成为未来趋势

    刷脸支付 我们作为消费者来说 最直观的感受就是我们的支付方式发生了变化 付钱更方便了 从最开始我们带着现金出门买东西 到后来二维码支付 一个手机扫遍天下 对于商家来说他不需要停下来手中在做的事情来收钱找零 而对于我们消费者来说也是非常的快捷
  • 数字化时代新经营模式千载难逢的翻身机会

    随着互联网的兴起 它对于线下实体商户的冲击早已不是一天两天了 网上店铺的崛起 吸引走了大部分流量 这对于靠流量吃饭的线下商户来说 是致命的打击 相关数据统计 这几年 随着网络购物越来越火热 越来越成为一种消费主流 线下实体商户的闭店率出现了
  • 为什么会说:程序员年龄越大,越容易失业?

    在程序员的世界里 一直有一个传言 互联网公司没有35岁以上的中年人 从华为辞退34岁以上的员工 到腾讯辞退35 高级员工 似乎老程序员面临着 年龄危机 要时刻警惕在职场被 踢出 的危险 而国内其他很多职业 比如教师 医生 公务员 都在稳步发
  • 仅仅是一张照片就是不能刷脸支付的

    科技改变未来并不是一句口号 就拿买东西来讲 以前人们都是一手交钱一手交货 拿到大额的纸币 还要验真假 而现在移动支付成为主要付款方式 只要一部手机 扫一扫就能付款 一开始也有很多人不习惯手机支付 因为觉得没有现金实在 整天就是一堆数字转来转
  • 刷脸支付横空问世便利了人们的生活

    刷脸支付的横空问世 极大的便利了用户的生活 即使没有手机 出门也不会受到阻碍 甚至在刷脸支付问世后 手机反而成了多余的摆设 无需携带任何东西便能出门 宛若武林中的大侠般 挥一挥衣袖 不带走任何云彩 潇洒出门 潇洒归来 刷脸支付的便利引得无数
  • Adobe PhotoShop安装程序无法初始化的解决办法

    近日需要使用PhotoShop 不想下了好几个水版 给大家一个可以用的 http pan baidu com s 1dDnJLy5 不仅安装不了而且把机子的注册表改了 再次安装时就出现了 安装程序无法初始化 的问题 网上各种查找 零零散散的
  • 优秀网站源码、编程源码下载网站大集中

    摘自http topic csdn net u 20080501 12 0a9bc720 0bb1 42b0 98bc da9783782d09 html 优秀网站源码 编程源码下载网站大集中 1 51源码 http www 51aspx
  • 软件版本详细对比alpha,beta,Gamma,RC,RT

    开源软件发布的时候 经常有alpha beta RC1 RC2 RC3等等 看得云里雾里 不知道啥意思 做了个简单总结 缩写 全称 中文意思 详细说明 功能与bug alpha 内测 开发团队内部测试的版本或者有限用户体验测试版本 功能不全
  • 刷脸支付技术更多的是想要助力数字化运营

    刷脸支付是在原有的收银系统基础上增加一种收款方式 不影响收银系统 收银更有效 支付更便捷 体验感更好 节省时间成本 资金更安全 支付宝 微信官方为推广刷脸支付 两大官方投入巨额资金普及刷脸支付 日常生活中可避免忘记带手机 手机没电 通话中
  • 如果你找不到东西,请先确保你在正确的地方寻找

    之前我们在几篇文章中描述了如何进行 思想 调试 今天的文章我将不会这样做 因为下面的编程错误大部分人都会遇到 如果你看一眼下面的代码 你不会发现有什么问题 这仅仅是因为你的的大脑只给你希望看到的 而不是那些真实存在的东西 有没有一种黑客帝国
  • 使用C语言设计并实现一个成绩管理系统

    使用C语言设计并实现一个成绩管理系统 该系统用于教师管理一门课程的成绩 系统功能 成绩录入 打印成绩单 修改成绩 统计分数段 统计平均分 统计不及格学生 相关要求 1 系统要有主菜单界面 让教师了解系统的功能 以及如何选择系统功能 2 系统
  • 为什么我的对话框创建失败了?菜鸟错误1

    对话框中的资源要么被定义为一个整数 要么被定义为一个字符串 仅仅一个简单的错误将会将其中的一个类型错误的变成另一个类型 我们来看一个例子 gt gt 请移步至 www topomel com 以查看图片 lt lt 你是否能发现其中的两处
  • mysql忘记密码的三种解决方案

    1 修改密码的三种方式 mysql用户分为root用户 超级管理员 拥有所有权限 和普通用户 mysql服务器通过权限表来控制用户对数据库的访问 这些权限表存于root用户下的mysql数据库中 在使用mysql数据库过程中 往往需要修改密
  • JNPF——面向研发使用、全栈开发、前后端分离的低代码平台

    1 背景 JNPF是一个快速开发应用的平台 一款 面向研发开发使用 全栈开发 前后端分离 的低代码工具 拥有强大的 可视化建模 数据库和API集成能力 目前已有将 超千家企业 将JNPF低代码开发工具融入内部研发体系 相较于传统的产研开发

随机推荐

  • php 递归面试题_8个PHP数组面试题,php数组试题

    8个PHP数组面试题 php数组试题 网上找的PHP数组题 准备自己做一遍并且记录下来 1 写函数创建长度为10的数组 数组中的元素为递增的奇数 首项为1 复制代码 代码如下 function arrsort first length ar
  • Python 十大装 B 语法【Python干货】

    Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 本文精心筛选了最能展现 Python 语法之精妙的十个知识点 并附上详细的实例代码 如能在实战中融会贯通
  • Exception 处理之最佳实践

    作者 Gunjan Doshi 2003 11 19 译者注 本文算是一篇学习笔记 仅供学习参考使用 有不妥之处 还请指出 2003 12 04 本文是Exception处理的一篇不错的文章 从Java Exception的概念介绍起 依次
  • L3 Hive操作

    示例 1 建表 create table t dml detail id bigint sale date date province string city string product id bigint cnt double amt
  • Yarn的安装详解?Yarn的各种系统安装详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如何在不同系统环境中安装Yarn Yarn在各种系统的安装详解 Yarn的安装详细的教程 希望能帮助一些程序袁 工具 原料 电脑 Yarn Windows安装详解 1 可以
  • NJUPT南邮

    设计可用于该实验的进程控制块 进程控制块至少包括进程号 状态和要求服务时间 动态或静态创建多个进程 模拟操作系统四种进程调度算法 先进先出 短作业优先 高优先级优先 高相应比优先中的任意两种 调度所创建的进程并显示调度结果 package
  • matlab2021版关于csv文件读写的一些方法

    首先给出一些演示数据 直接给出来大家看起来都方便 完整代码在最后 有基础的可以直接看代码 下面是data csv的文件内容 可以看得出里面有文本也有数值 代码 名称 最新价 涨跌额 涨跌幅 买入 卖出 昨收 今开 最高 最低 成交量 成交额
  • MySQL binlog 日志解析

    很多时候 当我们的业务数据产生了不正常的变化 但却无法得知这类操作是在哪里进行 并且如何进行 单单从程序当面排查很费力 那么就需要通过分析数据库日志来得到历史执行 SQL 根据 SQL 执行逻辑来确认代码位置 进而确认是否是 BUG 亦或是
  • configure –prefix 的用法

    源码的安装一般由有这三个步骤 配置 configure 编译 make 安装 make install 其中 prefix选项就是配置安装的路径 如果不配置该选项 安装后可执行文件默认放在 usr local bin 库文件默认放在 usr
  • spring boot 根据模板生成新的文件(exec),复杂一点的,新的导出

  • Timesat提取物候信息并绘图

    Timesat提取物候信息并绘图 前言 一 准备数据 1 将 Tiff 数据转成 dat 数据并生成 Filelist 2 使用python生成单个像素点text时序数据 二 Timesat 打开时序数据 1 处理dat文件 提取物候信息
  • Windows 随意切换node版本

    第一步 先清空本地安装的node js版本 卸载 删除 第二步 安装nvm管理工具 先关掉360等软件 不然会弹出警告 1 从官网下载安装包 https github com coreybutler nvm windows releases
  • Java实现微信扫码登录并实现认证授权

    Java实现微信扫码登录并实现认证授权 1 登录流程及原理 1 1 OAuth2协议 网站应用微信登录是基于OAuth2 0协议标准构建的微信OAuth2 0授权登录系统 在进行微信OAuth2 0授权登录接入之前 在微信开放平台注册开发者
  • java中的date_Java中Date类型详解

    一 Date类型的初始化 1 Date int year int month int date 直接写入年份是得不到正确的结果的 因为java中Date是从1900年开始算的 所以前面的第一个参数只要填入从1900年后过了多少年就是你想要得
  • Spring:IOC控制反转、@Bean和@Component、日志、注入、注解

    Spring核心知识点 Spring 核心功能 IOC 控制反转 和 AOP 面向切面编程 一 什么是IOC Inversion of Control 控制反转 1 主动控制 2 控制反转 二 使用原生Spring创建Demo项目 1 导入
  • 基于python的opencv入门到精通(一)

    记录自己从0开始成长的研究生生活 文章目录 前言 一 Anaconda是什么 二 已经安装了python如何与Anaconda共存 三 如何将PyCharm与Anaconda进行关联 四 配置Anaconda源 五 如何彻底删除python
  • 使用tf.data.Dataset.from_tensor_slices五步加载数据集

    前言 最近在学习tf2 数据加载感觉蛮方便的 这里记录下使用 tf data Dataset from tensor slices 进行加载数据集 使用tf2做mnist kaggle 的代码 思路 Step0 准备要加载的numpy数据
  • 记:判断字符串中空格字符的个数

    描述 输入一行可能带空格的字符串 输入其中空格字符的数量 输入 只有一组案例 一行可能带空格的字符串s 输出 一个正整数 表示字符串s里空格字符的数量 不要换行 样例输入 abc xyz 样例输出 1 法一 string include
  • 别只知道JVM 而不知道JMM

    JAVA 内存模型 JMM 内存模型概念 在特定的操作协议下 对特定的内存或高速缓存进行读写访问的过程抽象 JMM 主要就是因为CPU的多核多级缓存 为了优化代码而进行的指令重排序 从而处理器会对代码乱序的问题 保证最终的并发安全 JMM是
  • ROS与STM32F407实现消息通信(含源码)

    关注微信公众号 混沌无形 后台回复 13462EE 免费获取完整工程源码 本文参考STM32F1与ROS的通信工程 https blog csdn net qq 36349536 article details 82773064 针对STM