ROS通过串口,读写STM32和HC-SR04超声波测距信息

ROS通过串口,读写STM32和HC-SR04超声波传感器测距信息,ROS判断距离值,将控制信息通过串口发回给STM32,点亮led灯

ROS可以通过串口与stm32进行通信,以超声波传感器为例实现ROS与stm32通信。 (STM32的超声波测距程序以及相应的ROS程序在我的上传资源中有)

1.需要下载 http://wjwwood.io/serial/ serial串口功能包到工作区文件下;(Serial是一个跨平台,易于使用的库,用于在计算机上使用串行端口。该库提供了一个C ++,面向对象的接口,用于在Linux和Windows上与类似RS-232的设备进行交互。)具体安装方式按照该链接提供的方式安装即可。

2.使用命令:catkin_create_pkg supersonic std_msgs roscpp rospy 创建功能包; (命令模式为catkin_create_pkg [package_name] [depend1] [depend2] [depend3])。

3.在创建的功能包文件src文件下,编写程序

int main (int argc, char** argv) 
{ 
    //初始化节点 
    ros::init(argc, argv, "serial_a_node"); 
    //声明节点句柄 
    ros::NodeHandle nh; 
    
    //订阅主题,并配置回调函数 
   // ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback); 
    //发布主题 
    ros::Publisher read_pub = nh.advertise<std_msgs::Float32>("read", 10); 
    try 
    { 
    //设置串口属性,并打开串口 
        ser.setPort("/dev/ttyUSB0"); 
        ser.setBaudrate(115200); 
        serial::Timeout to = serial::Timeout::simpleTimeout(1000); 
        ser.setTimeout(to); 
        ser.open(); 
    } 
    catch (serial::IOException& e) 
    { 
        ROS_ERROR_STREAM("Unable to open port "); 
        return -1; 
    } 
    //检测串口是否已经打开,并给出提示信息 
    if(ser.isOpen()) 
    { 
        ROS_INFO_STREAM("Serial Port initialized"); 
    } 
    else 
    { 
        return -1; 
    } 
    //指定循环的频率 
    ros::Rate loop_rate(20);
    std_msgs::Float32 result;
    while(ros::ok()) 
    { 
        if(ser.available())
        { 
            Set_Led_init();
            ser.read(read_data,3); 
            if (read_data[0]==0x0A && read_data[2]==0x0D)
            {
                result.data=read_data[1];
                float fdist=result.data;    
                if ( 15 < fdist && fdist < 20)
                 {
                    Light_led(0x01);
                 }
                else
                 {
                    Light_led(0x02);
                }
                ser.write(sSendData,DATA_LENGTH);
            }            
            read_pub.publish(result);             
        } 
        ser.flush ();//清空串口存储空间
        ros::spinOnce(); 
        loop_rate.sleep(); 
    } 
    return 0;
}

(具体代码实现我已上传,与stm32超声波测距程序匹配,可直接使用)。 4.修改创建的功能包文件下的CMakeLiests.txt文件;在find_package(catkin REQUIRED COMPONENTS)中添加serial。如下图: 该文件末尾添加: add_executable(sonic src/sonic.cpp) target_link_libraries(sonic ${catkin_LIBRARIES}) add_dependencies(sonic ultarsonic_generate_messages_cpp)

5 .使用catkin_make命令编译,开放串口权限(sudo chmod 777 /dev/ttyUSB0)。

6.首先运行 roscore; 新打开一个终端,运行rosrun supersonic sonic即可; 新打开一个终端运行命令rostopic list,可以看到此时运行的主题,运行rostopic echo /read便可以查看stm32通过串口发送的实时数据。

经验分享 程序员 微信小程序 职场和发展