本文参考https://blog.csdn.net/weifengdq/article/details/84374690

由于工程需要,需要Ubuntu16.04 + ROS与STM32通讯,主要有两种方案解决通讯,一种是在STM32上加载ROS库让STM32作为一个节点,发布自己的主题消息,在ROS上订阅STM32上发布的主题就可以接受消息,STM32订阅ROS上的主题即可接收消息。另一种方法是在ROS串口输出数据,STM32通过普通串口形式接收字符串。下面是我通过Ubuntu16.04 +  ROS通过串口助手测试ROS上收数据。

1、建立新的工作空间

mkdir -p ~/catkin_ws/src

2、打开catkin_ws/src

cd ~/catkin_ws/src

3、在src内创建一个C++工程

catkin_create_pkg serial_communication roscpp std_msgs
cd serial_communication/src
touch serial_communication.cpp
gedit serial_communication.cpp

4、编辑serial_communication.cpp 内容如下:

#include <string>
#include <ros/ros.h> // 包含ROS的头文件
#include <boost/asio.hpp> //包含boost库函数
#include <boost/bind.hpp>
#include "std_msgs/String.h" //ros定义的String数据类型 using namespace std;
using namespace boost::asio; //定义一个命名空间,用于后面的读写操作 unsigned char buf[12]; //定义字符串长度 int main(int argc, char **argv)
{ ros::init(argc, argv, "serial_communication"); //初始化节点
ros::NodeHandle n; ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); //定义发布消息的名称及sulv ros::Rate loop_rate(10); io_service iosev;
serial_port sp(iosev, "/dev/ttyACM0"); //定义传输的串口
sp.set_option(serial_port::baud_rate(115200));
sp.set_option(serial_port::flow_control());
sp.set_option(serial_port::parity());
sp.set_option(serial_port::stop_bits());
sp.set_option(serial_port::character_size(8)); while (ros::ok())
{
//write(sp, buffer(buf1, 6)); //write the speed for cmd_val
//write(sp, buffer("Hellq world", 12));
read(sp, buffer(buf));
string str(&buf[0], &buf[11]); //将数组转化为字符串
//if (buf[10] == '\n')
{
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;
}

5、保存后, 打开 ~/catkin_ws/src/serial_communication/CMakeLists.txt, 最后面加上:

add_executable(serial_communication src/serial_communication.cpp)
target_link_libraries(serial_communication ${catkin_LIBRARIES})

6、编译工作空间

cd ~/catkin_ws
catkin_make

7、开启一个新的终端 输入:

roscore

8、新开启另一个终端 输入:查看端口号

ls -l /dev |grep ttyUSB

9输入:   启动串口看是否有报错

rosrun serial_communication serial_communication

如出现下图,是因为端口号没有获取读写权限

10、输入:  获取权限

sudo chmod 777 /dev/ttyUSB0

11、最后结果:      使用串口发送的HELLO WORLD

最新文章

  1. ZooKeeper:Java客户端网络处理
  2. 拓扑编号 vijos1790
  3. asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间
  4. Json的序列化和反序列化
  5. liunx之:rpm包安装
  6. uva 10859
  7. 如何用visual studio控件(repeater)绑定数据库(SQL server)信息并显示
  8. OC——网络解析获取图片的应用
  9. ASP.NET从MVC5升级到MVC6
  10. SharePoint 2010 Form Authentication (SQL) based on existing database
  11. 超详细的 Linux CentOS 编译安装python3
  12. Struts2实现文件上传(三)
  13. Hadoop 的 TotalOrderPartitioner
  14. 获取radio、select、checkbox标签选中的值
  15. C/C++ 程序库
  16. ECMAscript5中的map
  17. verilog task2
  18. 弟三周作业之VS2015
  19. EasyNetQ介绍
  20. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group&amp; dialect&amp; date-effective

热门文章

  1. CentOS 6.5(x86_32)下安装Oracle 10g R2
  2. P1049 数列的片段和
  3. 【Linux】linux内核学习
  4. Python基础笔记:字符串和编码
  5. QT事件处理–notify()
  6. 124-PHP类析构函数
  7. 114-PHP判断类变量是否相同
  8. css mix-blend-mode 颜色滤镜混合模式
  9. junit基础学习之-测试service层(3)
  10. FTP故障排除