博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ROS为上位机与STM32为下位机串口通讯(一)
阅读量:4083 次
发布时间:2019-05-25

本文共 5069 字,大约阅读时间需要 16 分钟。

 

摘自:

ROS为上位机与STM32为下位机串口通讯(一)

 

2019-07-10 15:27:27 1715

分类专栏:

版权

STM32通过串口向ROS上位机发送信息

主要实现了STM32 通过串口向ROS上位机发送数据,发布者将接收到的数据发布出去并打印出来,订阅者订阅发布者发布的消息并打印出来,最后通过roslaunch启动。

STM32端

u16 times=0;int arr[10] = {0,1,2,3,4,5,6,7,8,9};int main(void){   	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	delay_init(168);			uart_init(115200);	    //波特率115200	while(1)	{			times++;			printf("%3d\r\n",times);			if(times>=100) times=0; 			delay_ms(100);   	}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

ROS端

创建工作空间

mkdir -p ~/serial/srccd ~/serial/srccatkin_init_workspace
  • 1
  • 2
  • 3

编译

cd ~/serial/catkin_make
  • 1
  • 2

设置环境变量

echo "source ~/serial/devel/setup.bash" >> ~/.bashrcsource ~/.bashrc
  • 1
  • 2

创建功能包

catkin_create_pkg serial_communication roscpp std_msgs
  • 1

在/catkin_ws/src/serial_communication/src/下新建serial_communication_pub.cpp和serial_communication_sub.cpp

serial_communication_pub.cpp内容如下

#include 
#include
// 包含ROS的头文件#include
//包含boost库函数#include
#include
//ros定义的String数据类型using namespace std;using namespace boost::asio;//定义一个命名空间,用于后面的读写操作unsigned char times_buf[5];//接收区int main(int argc,char** argv){ ros::init(argc,argv,"serial_communication_pub");//初始化节点 ros::NodeHandle n;//创建节点句柄 /*创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String*/ ros::Publisher chatter_pub = n.advertise
("chatter",1000); ros::Rate loop_rate(10);//设置循环频率10Hz io_service iosev; serial_port sp(iosev, "/dev/ttyUSB0");//定义传输的串口 sp.set_option(serial_port::baud_rate(115200));//波特率115200 sp.set_option(serial_port::flow_control());//串口选项允许更改流量控制,默认值0 sp.set_option(serial_port::parity());//奇偶性,默认值为none sp.set_option(serial_port::stop_bits()); //停止位,默认值为1 sp.set_option(serial_port::character_size(8)); //数据位,默认值为8 while(ros::ok()) { read(sp,buffer(times_buf)); string str(×_buf[0],×_buf[4]);//将数组转化为字符串 std_msgs::String msg; std::stringstream ss; ss << str; msg.data = ss.str(); ROS_INFO("%s",msg.data.c_str());//打印接受到的字符串 chatter_pub.publish(msg); //发布消息 ros::spinOnce(); loop_rate.sleep(); } iosev.run(); return 0;}

serial_communication_sub.cpp内容如下

#include 
#include
//接收到订阅消息后,进入消息回调函数执行任务void chatterCallback(const std_msgs::String::ConstPtr& msg){ ROS_INFO("I hear:%s",msg->data.c_str());}int main(int argc, char **argv){ /* code for main function */ ros::init(argc, argv, "serial_communication_sub");//初始化ROS节点 ros::NodeHandle n;//创建节点句柄 /*创建一个Subscriber,订阅名为chatter的话题,注册回调函数chatterCallback*/ ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); ros::spin();//循环等待回调函数 return 0;}

打开 ~/serial/src/serial_communication/CMakeLists.txt, 最后面加上:

add_executable(serial_communication_pub src/serial_communication_pub.cpp)target_link_libraries(serial_communication_pub ${catkin_LIBRARIES})add_executable(serial_communication_sub src/serial_communication_sub.cpp)target_link_libraries(serial_communication_sub ${catkin_LIBRARIES})
  • 1
  • 2
  • 3
  • 4
  • 5

保存

在/catkin_ws/src/serial_communication/下新建文件夹launch
并在launch文件夹下新建一个serial_communication_pub.launch文件
未见内容如下

  • 1
  • 2
  • 3
  • 4

写好后记得再次编译

cd ~/serial/catkin_make
  • 1
  • 2

最后运行

autolabor@autolabor-host:~$ roslaunch serial_communication serial_communication_pub.launch ... logging to /home/autolabor/.ros/log/b1175c24-a2e2-11e9-8d53-000c299981e9/roslaunch-autolabor-host-11059.logChecking log directory for disk usage. This may take awhile.Press Ctrl-C to interruptDone checking log file disk usage. Usage is <1GB.started roslaunch server http://autolabor-host:40439/SUMMARY========PARAMETERS * /rosdistro: kinetic * /rosversion: 1.12.13NODES  /    serial_communication_pub (serial_communication/serial_communication_pub)    serial_communication_sub (serial_communication/serial_communication_sub)auto-starting new masterprocess[master]: started with pid [11069]ROS_MASTER_URI=http://localhost:11311setting /run_id to b1175c24-a2e2-11e9-8d53-000c299981e9process[rosout-1]: started with pid [11082]started core service [/rosout]process[serial_communication_pub-2]: started with pid [11099]process[serial_communication_sub-3]: started with pid [11100][ INFO] [1562743016.360922738]:  51[ INFO] [1562743016.365478840]: I hear: 51[ INFO] [1562743016.460078115]:  52[ INFO] [1562743016.460510462]: I hear: 52[ INFO] [1562743016.560876337]:  53[ INFO] [1562743016.561298464]: I hear: 53[ INFO] [1562743016.664422539]:  54[ INFO] [1562743016.664840175]: I hear: 54[ INFO] [1562743016.761167086]:  55[ INFO] [1562743016.761580444]: I hear: 55[ INFO] [1562743016.860703796]:  56[ INFO] [1562743016.861023292]: I hear: 56[ INFO] [1562743016.973725366]:  57[ INFO] [1562743016.974084649]: I hear: 57[ INFO] [1562743017.060380804]:  58[ INFO] [1562743017.060940934]: I hear: 58[ INFO] [1562743017.160667823]:  59[ INFO] [1562743017.161122159]: I hear: 59[ INFO] [1562743017.260142425]:  60[ INFO] [1562743017.260559162]: I hear: 60[ INFO] [1562743017.360150478]:  61[ INFO] [1562743017.362249269]: I hear: 61[ INFO] [1562743017.460271112]:  62[ INFO] [1562743017.460853910]: I hear: 62

运行之前要先

sudo minicom

否则打印出的数据有问题

转载地址:http://zalni.baihongyu.com/

你可能感兴趣的文章
C++报错:C4700:使用了非初始化的局部变量
查看>>
C++类、结构体、函数、变量等命名规则详解
查看>>
C++ goto语句详解
查看>>
【数据结构周周练】008 二叉树的链式创建及测试
查看>>
《软件体系结构》 第九章 软件体系结构评估
查看>>
《软件体系结构》 第十章 软件产品线体系结构
查看>>
《软件过程管理》 第六章 软件过程的项目管理
查看>>
《软件过程管理》 第九章 软件过程的评估和改进
查看>>
分治法 动态规划法 贪心法 回溯法 小结
查看>>
《数据库系统概论》 第一章 绪论
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>
IA32时钟周期的一些内容
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>