ROS笔记(39) 串口配置


1. 前言

假如要搭建一个真实的ROS机器
以移动小车为例,其仿真机器
算法功能包运算的运动控制指令输出到仿真环境(如Gazebo)或者仿真驱动(如Arbotix)
仿真环境或者驱动再反馈运动数据等消息到算法功能包供运算或可视化

而在搭建一个真实的移动小车时
需要把算法功能包运算的运动控制指令真的执行起来,利用该指令去控制证实的车轮电机转动
并且利用编码器采集转动状态进过解析,整理并发送算法功能包说需要的数据

惯性思维,忽略了仿真环境就是代替真实环境为ROS提供数据
那么,用真实数据去代替仿真数据,这样真实的机器就完成了


2. 串口通讯

在实际搭建ROS机器时,通常主控硬件和驱动执行硬件分开的

  • 主控硬件:运行Ubuntu,大量数据采集,算法运算和人机交互等
  • 驱动执行硬件:运行RTOS,小量数据采集,数据反馈和驱动设备等

需要通讯机构把这两部分硬件连接起来,这里就采用了串口通讯
主控硬件通过通讯串口发布消息到下层执行器,并读取下层执行器发送的所需数据
如简单的移动小车,主控发送运动控制指令/cmd_vel的解析数据(如左右轮速度)到下层执行器
下层执行器按接受到的数据去执行控制行驶驱动装置工作

那么首先需要配置主控硬件的串口驱动
而下层执行器有很多平台:STM,NXP,Arduino等等
不同平台的开发都不一样,看个人选用
其实也大同小异,不过其学问深无止境

因此,在这就不做下层执行器开发的相关叙述


3. C++配置

ROS已经内置了的串口包serial


3.1. 安装serial

下载安装ROS对应版本的serial功能包
在Ubuntu16.04环境下:

$ sudo apt-get install ros-kinetic-serial

在Ubuntu18.04环境下:

$ sudo apt-get install ros-melodic-serial

检测serial功能包的路径:

$ roscd serial

3.2. 配置

在功能包hhbot_bringup 中新建 /src/hhbot_bsp_serial_test.cpp 测试文件

#include <ros/ros.h>
#include <serial/serial.h> // ROS内置串口功能包

int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "hhbot_bsp_serial_test");

    // 创建节点句柄
    ros::NodeHandle n;

    // 设置循环的频率
    ros::Rate loop_rate(1);

    // 声明串口对象
    serial::Serial ser;

    // 默认配置端口hhbot_bsp(已绑定),波特率115200,连接超时0.01秒
    ser.setPort("/dev/hhbot_bsp");
    ser.setBaudrate(115200);
    serial::Timeout to = serial::Timeout::simpleTimeout(10);
    ser.setTimeout(to);

    // 打开串口
    ser.open();

    //检测串口是否已经打开,并给出提示信息
    if (ser.isOpen())
    {
        ROS_INFO_STREAM("BSP serial init ok");
        ROS_INFO_STREAM("Start BSP serial test");
    }
    else
    {
        ROS_ERROR("BSP serial init error");
        ROS_ERROR("End of BSP serial test");
        return -1;
    }
}

连接超时0.01秒,设备需迅速反馈


3.3. 编译

接着需要在CMakeLists.txt中添加编译选项
增加serial功能包依赖

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  sensor_msgs
  geometry_msgs
  tf
  serial // 新添加
)

添加catkin声明

catkin_package(
#  INCLUDE_DIRS include
  LIBRARIES hhbot_bringup
  CATKIN_DEPENDS roscpp rospy sensor_msgs
#  DEPENDS system_lib
)

增加编译

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

编译功能包:

$ catkin_make -DCATKIN_WHITELIST_PACKAGES="hhbot_bringup"

在这里插入图片描述


3.4. 通讯测试

同样的,测试前需要配置HHbot下层执行器(HHbot BSP)为通信回环模式
即接受以‘\r\n’结尾的数据并返回发送

连上设备并开始测试

while (ros::ok())
{
    // 显示并发送串口数据
    std::string send_data;
    send_data = "Hello HHbot BSP\r\n";
    ROS_INFO("Send data: Hello HHbot BSP");
    ser.write(send_data);

    // 接受并显示串口数据
    std::string read_data;
    ser.read(read_data, ser.available());
    ROS_INFO("Read data: %s", read_data.c_str());

    // 按照循环频率延时
    loop_rate.sleep();
}

// 关闭串口
ser.close();

运行该文件:

$ rosrun hhbot_bringup hhbot_bsp_serial_test

正常如下:
在这里插入图片描述


4. Python配置

配置相比C++有点简便,个人推荐Python
Python串口通信部分主要依赖pyserial模块的功能实现


4.1. 安装pyserial

在Ubuntu16.04环境下:

$ pip install pyserial

在Ubuntu18.04环境下:

$ pip3 install pyserial

4.2. 配置

在功能包hhbot_bringup 中新建 /scripts/hhbot_bsp_serial.py 文件

首先定义 HHbot BSP 串口通信初始化配置函数SerialInit

#!/usr/bin/env python
# coding=utf-8

import serial  # 导入serial包 串口通信


def SerialInit():
    """
    HHbot BSP 串口通信初始化配置函数

    默认配置端口hhbot_bsp(已绑定),波特率115200,连接超时0.01秒
    """
    try:
        # 配置USB设备端口
        ser = serial.Serial("/dev/hhbot_bsp", 115200, timeout=0.01)
        print("BSP serial init ok")
        return ser
    except:
        print("BSP serial init error")
        return None

配置端口hhbot_bsp,波特率为115200,连接超时0.01秒(设备需迅速反馈
当没插入设备时,运行该文件将提示初始化错误

$ rosrun hhbot_bringup hhbot_bsp_serial.py

把设备连接上就提示没问题了

在这里插入图片描述


4.3. 通讯测试

测试前需要配置HHbot下层执行器(HHbot BSP)为通信回环模式
即接受以‘\r\n’结尾的数据并返回发送

定义 HHbot BSP 串口通信测试函数 SerialTest
配置串口并发送'Hello HHbot BSP\r\n'数据并读取 HHbot BSP 发送的数据
读取完成后关闭串口通信完成测试

def SerialTest():
    # 串口通信初始化配置函数
    ser = SerialInit()

    # 串口开启的情况下
    if ser.isOpen():

        # 显示开始测试
        print("Start BSP serial test")

        # 编辑并显示发送的数据
        send_data = b"Hello HHbot BSP\r\n"
        print("Send data: %r" % send_data)

        # 发送数据
        ser.write(send_data)

        # 读取并显示数据
        read_data = ser.read(len(send_data))
        print("Read data: %s" % read_data)

        # 关闭串口通信并显示测试结束
        ser.close()
        print("End of BSP serial test")

连上设备并开始测试

if __name__ == '__main__':
    try:
        SerialTest()
    except:
        pass

运行该文件:

$ rosrun hhbot_bringup hhbot_bsp_serial.py

正常如下:
在这里插入图片描述


参考:

ROS官方wiki


相关推荐:

ROS笔记(38) Xbox360手柄控制移动
ROS笔记(37) 抓取和放置
ROS笔记(36) 避障运动规划
ROS笔记(35) 笛卡尔运动规划
ROS笔记(34) 工作空间规划


谢谢!

发布了217 篇原创文章 · 获赞 290 · 访问量 288万+

猜你喜欢

转载自blog.csdn.net/qq_32618327/article/details/103978586
今日推荐