本文参考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

Ubuntu16.04 + ROS下串口通讯的更多相关文章

  1. ubuntu16.04 ROS环境下配置和运行SVO

    ubuntu16.04 ROS环境下配置和运行SVO https://blog.csdn.net/nnUyi/article/details/78005552

  2. Ubuntu16.04 LTS下apt安装WireShark

    Ubuntu16.04 LTS下apt安装WireShark 安装与配置 首先通过apt安装WireShark: $ sudo apt install wireshark 会同时安装许多的依赖包,其中 ...

  3. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  4. Ubuntu16.04环境下的硬盘挂载

    需求:在Ubuntu16.04系统下,挂载一个新的硬盘 第一步:查看目前已经存在的分区的状态 命令:df -l 如上图所示,并未看到要挂载的硬盘(sda)的状态. 第二步:查看计算机硬盘的状态(包括格 ...

  5. Ubuntu16.04系统下 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)、无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”的方法

    在Ubuntu16.04下安装软件,例如:sudo apt-get install lrzsz时提示: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) 无法 ...

  6. Ubuntu16.04环境下搭建基于三台主机的mysql galera cluster集群(实测有效)

    (注意: (1)文中红色字体部分不一定需要操作 (2)由于word文档编辑的原因,实际操作时部分命令需要手动输入!!直接复制粘贴会提示错误!! ) 一  搭建环境: 1 Ubuntu16.04版本(系 ...

  7. java web下串口通讯

       最近在做java串口通讯,主要是用个人电脑通过串口从RS485读取数据,并通过crc循环冗余校验,把接收正确的数据解析,插入数据库mysql,并用SSH技术把数据库数据以表格以及图表形式显示   ...

  8. faster-rcnn在ubuntu16.04环境下的超级详细的配置(转)

    首先,下载好必须要的安装包.为了方便,我已经全部上传在了百度云. - ubuntu16.04系统 链接:http://pan.baidu.com/s/1geU8piz 密码:25mk - cuda8. ...

  9. ubuntu16.04环境下在docker上部署javaweb项目简单案例

    因为一些原因,接触到了docker,经过一番研究,总算是有了一些自己的看法,有什么不对的地方,希望多多指教. 废话不多说,首先我这里使用的虚拟机安装的是ubuntu16.04版本,其他版本应该也可以. ...

随机推荐

  1. 《TensorFlow实战Google深度学习框架》笔记——TensorFlow环境搭建

    一.TensorFlow的主要依赖包 1.Protocol Buffer Protocol Buffer负责将结构化的数据序列化,并从序列化之后的数据流中还原出原来的结构化数据.TensorFlow中 ...

  2. C#编码习惯2

    1.一定要用大括号括住流程控制元素,如for,while,if,switch内嵌的代码,即便只包含一行代码. 2.如果语句中有else if,一定要有一个else跟着最后一个else if. 3.只要 ...

  3. 吴裕雄--天生自然C++语言学习笔记:C++ 引用

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的 ...

  4. poj 3262 Protecting the Flowers 贪心 牛吃花

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11402   Accepted ...

  5. 个人vim简单配置

    精简.vimrc配置,简约不简单 该配置没有花里胡哨的插件,只是用ctags和cscope然后配合vim提供的基础功能就可以完成常见的代码编辑,浏览,查找等工作. "************ ...

  6. springboot - 使用ErrorAttributes 在我们自定义的 ErrorController中

    1.概览 基于<springboot - 映射 /error 到自定义且实现了ErrorController的Controller>改造,仅将MyCustomErrorController ...

  7. vue路由 视图命名

    <body> <div id="app"> <p @click="go">hello app!</p> < ...

  8. Dynamic Route Matching Vue路由(1)

    Dynamic Route Matching 动态的 路由 匹配 Very often we will need to map routes with the given pattern to the ...

  9. C++基础--智能指针

    智能指针其实也不是完全的指针,应该说是像指针一样的类对象,智能指针通常有指针的功能,当然同时也包含了一些额外的功能.目前比较常见的智能指针有auto_ptr.unique_ptr和shared_ptr ...

  10. 理解Production- Ready特性

    1.外部配置(externalized configuration) 1).基于环境变量的配置 2).基于YAML的配置 3).默认配置值 2.健康检查(health checks) 1).它是否有一 ...