ROS与STM32F407实现消息通信(含源码)
关注微信公众号“混沌无形”,后台回复: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;}
喜欢的话,请关注微信公众号,可好文!
ROS与STM32F407实现消息通信(含源码)相关推荐
- 【Matlab WSN通信】A_Star改进LEACH多跳传输协议【含源码 487期】
一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法机器人大规模栅格地图最短路径规划[含源码 1860期] 二.蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接.灾 ...
- python视频网站项目_Python开发教育网站项目实例教学(105集视频课程含源码)
Python开发教育网站项目实例教学(105集视频课程含源码)课程简介: Python开发教育网站项目实例教学(105集视频课程含源码)通过这105集Python实例视频课程的学习,学员可以掌握到使用 ...
- 手把手教你SSM整合开发办公系统(OA)——报销单(含源码)
文章目录 前言 项目展示 技能要求 一.开始前的准备 1.OA系统是什么? 2.人员权利与报销流程 3.数据库设计 4.创建项目及作用说明 5.包与全局变量配置 6.编写过滤器 7.静态资源的复制与请 ...
- Eatting外卖基于瑞吉外卖代码全功能优化含源码
Eatting外卖基于瑞吉外卖代码全功能优化含源码 文章目录 项目的最终部署 源码地址 github:[源码地址](https://github.com/yangxingyue0623/Eating_ ...
- 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)
文章目录 一.项目介绍 二.代码及报告获取 一.项目介绍 基于Vue.js的移动端购物商城网站(含源码.课设报告),代码获取放在文末了,码字不易,感谢点赞~ 一.系统概述 本部分主要是对项目进行简要描 ...
- Odoo16 教程含源码
Odoo16 教程含源码 Odoo16 开发教程 版本变化 模块开发步骤 源码 Odoo16 开发教程 Odoo 号称全球第一的开源ERP平台,除了提供一站式的企业应用开发解决方案,作为一个网站设计器 ...
- 老男孩GO语言线下培训班1期整套教程(完整18天含源码)
老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │ 01 Go开发1期 day1 ...
- 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...
区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍 区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...
- ONNX MLIR应用示例(含源码链接)
ONNX MLIR应用示例(含源码链接) 开放式神经网络交换在MLIR中的实现 (http://onnx.ai/onnx-mlir/). Prebuilt Containers 开始使用ONNX-ML ...
最新文章
- radioGroup中radiobutton不能互斥问题
- Java 多线程(二)线程间的通信应用--生产者消费者(未完)
- Spring【AOP模块】就是这么简单
- python 列表拼接_【Python杂货铺】速学python基础
- 这款电脑升降桌美到我了
- java定义js函数_JS中可以先使用函数,然后再定义.
- node搭建服务器,写接口,调接口,跨域
- cocos2dx 背景用小尺寸图片滚动填充的方法
- 操作系统学习笔记-03-操作系统的发展和分类
- 支付宝php rsa签名验签工具,alipay rsa2 签名验证
- 导师评价网北工大计算机段老师,北京工业大学怎么样好不好(排名-师资-专业-评价)...
- 【NOIP1999】【codevs1083】Cantor表(找规律)
- 甲醛|甲醛介绍|甲醛如何清理
- Have Fun with Numbers及循环链表(约瑟夫问题)
- Geth私链的多节点运行
- 中国生物oa系统服务器地址,每周一库 | 第十八期:中国生物医学文献服务系统(SinoMed) | 四川大学图书馆...
- 欢迎来到大数据时代-----赶快来了解一些大数据的基础知识
- 如何从Docker容器内部获取Docker主机的IP地址
- 「管理数学基础」1.6 矩阵理论:方阵相似的条件、若当标准形
- ERP/MIS系统中集成命令行式的功能调用