关注微信公众号“混沌无形”,后台回复: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实现消息通信(含源码)相关推荐

  1. 【Matlab WSN通信】A_Star改进LEACH多跳传输协议【含源码 487期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法机器人大规模栅格地图最短路径规划[含源码 1860期] 二.蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接.灾 ...

  2. python视频网站项目_Python开发教育网站项目实例教学(105集视频课程含源码)

    Python开发教育网站项目实例教学(105集视频课程含源码)课程简介: Python开发教育网站项目实例教学(105集视频课程含源码)通过这105集Python实例视频课程的学习,学员可以掌握到使用 ...

  3. 手把手教你SSM整合开发办公系统(OA)——报销单(含源码)

    文章目录 前言 项目展示 技能要求 一.开始前的准备 1.OA系统是什么? 2.人员权利与报销流程 3.数据库设计 4.创建项目及作用说明 5.包与全局变量配置 6.编写过滤器 7.静态资源的复制与请 ...

  4. Eatting外卖基于瑞吉外卖代码全功能优化含源码

    Eatting外卖基于瑞吉外卖代码全功能优化含源码 文章目录 项目的最终部署 源码地址 github:[源码地址](https://github.com/yangxingyue0623/Eating_ ...

  5. 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)

    文章目录 一.项目介绍 二.代码及报告获取 一.项目介绍 基于Vue.js的移动端购物商城网站(含源码.课设报告),代码获取放在文末了,码字不易,感谢点赞~ 一.系统概述 本部分主要是对项目进行简要描 ...

  6. Odoo16 教程含源码

    Odoo16 教程含源码 Odoo16 开发教程 版本变化 模块开发步骤 源码 Odoo16 开发教程 Odoo 号称全球第一的开源ERP平台,除了提供一站式的企业应用开发解决方案,作为一个网站设计器 ...

  7. 老男孩GO语言线下培训班1期整套教程(完整18天含源码)

    老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │      01 Go开发1期 day1 ...

  8. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  9. ONNX MLIR应用示例(含源码链接)

    ONNX MLIR应用示例(含源码链接) 开放式神经网络交换在MLIR中的实现 (http://onnx.ai/onnx-mlir/). Prebuilt Containers 开始使用ONNX-ML ...

最新文章

  1. radioGroup中radiobutton不能互斥问题
  2. Java 多线程(二)线程间的通信应用--生产者消费者(未完)
  3. Spring【AOP模块】就是这么简单
  4. python 列表拼接_【Python杂货铺】速学python基础
  5. 这款电脑升降桌美到我了
  6. java定义js函数_JS中可以先使用函数,然后再定义.
  7. node搭建服务器,写接口,调接口,跨域
  8. cocos2dx 背景用小尺寸图片滚动填充的方法
  9. 操作系统学习笔记-03-操作系统的发展和分类
  10. 支付宝php rsa签名验签工具,alipay rsa2 签名验证
  11. 导师评价网北工大计算机段老师,北京工业大学怎么样好不好(排名-师资-专业-评价)...
  12. 【NOIP1999】【codevs1083】Cantor表(找规律)
  13. 甲醛|甲醛介绍|甲醛如何清理
  14. Have Fun with Numbers及循环链表(约瑟夫问题)
  15. Geth私链的多节点运行
  16. 中国生物oa系统服务器地址,每周一库 | 第十八期:中国生物医学文献服务系统(SinoMed) | 四川大学图书馆...
  17. 欢迎来到大数据时代-----赶快来了解一些大数据的基础知识
  18. 如何从Docker容器内部获取Docker主机的IP地址
  19. 「管理数学基础」1.6 矩阵理论:方阵相似的条件、若当标准形
  20. ERP/MIS系统中集成命令行式的功能调用

热门文章

  1. SwiftTour基础学习(五)控制流
  2. [Yii2] 前台用户与后台用户分离
  3. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
  4. 5)Javascript设计模式:extends模式
  5. Andirod——网络连接(HttpURLConnection)
  6. Microsoft Dynamics CRM MVP
  7. JAVA如何插入MySql的datetime类型
  8. 我发现我对人类活动的认识开始有一点点变化了
  9. ELK收集java日志
  10. Linux 服务器感染kerberods 病毒