f


文章目录

前言

硬件

英伟达NX

USB转串口模块

环境

Ubuntu18.04

ROS Melodic

串口助手

一、安装ROS串口驱动

安装ROS串口

sudo apt-get install ros-melodic-serial

安装完后在一个新的终端里输入

roscd serial/

如果能够正常cd到​​/opt/ros/melodic/share/serial​​,说明串口驱动安装成功.

二、新建软件包编译

mkdir -p ~/serial_ws/src
cd ~/serial_ws/src/
catkin_init_workspace
cd ~/serial_ws/
catkin_make
echo "source ~/serial_ws/devel/setup.bash">>~/.bashrc
source ~/.bashrc
echo $ROS_PACKAGE_PATH

新建功能包:

cd ~/serial_ws/src/
catkin_create_pkg serial_test roscpp rospy std_msgs serial

编辑代码

cd ~/serial_ws/src/serial_test/src
gedit serial_test.cpp

填入以下代码并保存

代码取自 ​

//serial_port.cpp
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>

int main(int argc, char** argv)
{
ros::init(argc, argv, "serial_port");
//创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
ros::NodeHandle n;

//创建一个serial类
serial::Serial sp;
//创建timeout
serial::Timeout to = serial::Timeout::simpleTimeout(100);
//设置要打开的串口名称
sp.setPort("/dev/ttyTHS0");
//设置串口通信的波特率
sp.setBaudrate(115200);
//串口设置timeout
sp.setTimeout(to);

try
{
//打开串口
sp.open();
}
catch(serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port.");
return -1;
}

//判断串口是否打开成功
if(sp.isOpen())
{
ROS_INFO_STREAM("/dev/ttyTHS0 is opened.");
}
else
{
return -1;
}

ros::Rate loop_rate(500);
while(ros::ok())
{
//获取缓冲区内的字节数
size_t n = sp.available();
if(n!=0)
{
uint8_t buffer[1024];
//读出数据
n = sp.read(buffer, n);

for(int i=0; i<n; i++)
{
//16进制的方式打印到屏幕
std::cout << std::hex << (buffer[i] & 0xff) << " ";
}
std::cout << std::endl;
//把数据发送回去
sp.write(buffer, n);
}
loop_rate.sleep();
}

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

return 0;
}

修改​​~/serial_ws/src/serial_test/​​下的CmakeLists.txt.

cd ~/serial_ws/src/serial_test/
gedit CMakeLists.txt

在文件的最后加上:

add_executable(serial_test src/serial_test.cpp)
add_dependencies(serial_test ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(serial_test ${catkin_LIBRARIES})

编译

cd ~/serial_ws
catkin_make
. ~/serial_ws/devel/setup.bash

三、测试

NX上有三个板载串口,我这里使用ttyTHS0.

对应的引脚如下:

ROS串口通信实验_机器学习

其中ttyTHS0的TX对应上图引脚8,RX对应上图引脚10.

将ttyTHS0的TX接到USB转串口模块的RX,将tyTHS0的RX接到USB转串口模块的TX,同时将USB转串口模块的GND接到NX上的GND,我这里接的是6号引脚.

ROS串口通信实验_串口_02

接好线后,将USB转串口模块接到电脑的串口助手上.

可以在NX的终端上查看一下串口的端口号

cd /dev
ls

ttyTHS开头的就是板载串口

ROS串口通信实验_自动驾驶_03

在NX上先执行如下命令赋予权限,否则无法打开串口

sudo chmod 777 /dev/ttyTHS0

然后运行节点

roscore
rosrun serial_test serial_test

打开串口助手,连接上USB转串口模块,设置波特率为115200,数据位8位,无校验位,1位停止位,无流控,然后发送一些数据进行测试,电脑每向NX发送一个数据,NX会向电脑返回发送相同的数据.如下图:

ROS串口通信实验_机器学习_04

在NX上运行节点的终端上可以看到接收到的数据(我在串口助手上是以文本进行发送的,终端是以ASCII码进行显示的)

ROS串口通信实验_人工智能_05

代码地址: