zoukankan      html  css  js  c++  java
  • Ubuntu16.04 + ROS下串口通讯

    本文参考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] == '
    ')
        {
          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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/qilai/p/11313308.html
Copyright © 2011-2022 走看看