Jetson nano 使用ROS 实现串口通信
1:首先安装ros下的serial库
sudo apt-get install ros-melodic-serial
其中的melodic根据自己的ros版本来修改
2:安装minicom和cutecom来首次检查串口是否通信成功
sudo apt-get install minicom
sudo apt-get install cutecom
3:将自己的串口设备连接到jetson nano上
jetson nano的引脚4 6 8 10 分别是VCC GND TX RX
对应引脚接好之后 应该是对应系统内的/dev/ttyTHS1设备
sudo chmod 777 /dev/ttyTHS1 使用该命令给串口权限
4:首先通过cutecom 软件查看设备是否连接成功,并且检查波特率等信息,可以自行百度cutecom的使用方法
5:在系统安装好ROS的前提下
mkdir -p ~/serial_ws/src
cd ~/serial/src
catkin_init_workspace
初始化工作空间
cd ~/serial_ws/
catkin_make
cd ~/serial_ws/src
catkin_create_pkg serial_node std_msgs rospy roscpp serial
创建功能包,并且添加依赖,主要serial这个库需要添加上,如果这里没有添加 也可以自手动修改package.xml 和CMakeList.tx
CMakeList.txt
cmake_minimum_required(VERSION 3.0.2)
project(serial_node)
find_package(catkin REQUIRED COMPONENTS
roscpp
serial
rospy
std_msgs
)
catkin_package(
CATKIN_DEPENDS
serial
std_msgs
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable( my_serial_node src/my_serial_node.cpp)
target_link_libraries( serial_node
${catkin_LIBRARIES}
)
package.xml
<?xml version="1.0"?>
<package format="2">
<name>serial_node</name>
<version>0.0.0</version>
<description>The serial_node package</description>
<maintainer email="wh@todo.todo">wh</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>serial</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>serial</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
</package>
然后进入serial_node功能包的src文件下添加下面的my_serial_node.cpp
#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/Float64.h>
#include<iostream>
//创建串口对象
serial::Serial ser;
//创建获取的距离信息保存的数据变量
std_msgs::Float64 distance;
int main (int argc, char** argv){
//创建ros节点
ros::init(argc, argv, "my_serial_node");
ros::NodeHandle nh;
//创建发布者
ros::Publisher distance_pub=nh.advertise<std_msgs::Float64>("distance",1000);
//打开串口设备
try
{
ser.setPort("/dev/ttyTHS1");
ser.setBaudrate(9600);
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 open");
}else{
return -1;
}
//设置运行频率
ros::Rate loop_rate(50);
while(ros::ok()){
//读取串口数据
size_t n=ser.available();
if(n!=0)
{
//buffer长度可以根据自己的通信协议来修改,可以改大一点如100
unsigned char buffer[11]={0};
n=ser.read(buffer,n);
for(int i=0;i<n;i++)
{
std::cout<<std::hex<<(buffer[i]&0xff)<<" ";
}
std::cout<<std::endl;
//此处为通信协议解析,使用者根据自己的实际情况就行修改
if((buffer[0]&0xff)==0x80&&(buffer[1]&0xff)==0x06&&(buffer[2]&0xff)==0x83)
{
distance.data=(buffer[3]&0xff-'0')*100+(buffer[4]&0xff-'0')*10+(buffer[5]&0xff-'0')*1+(buffer[7]&0xff-'0')*0.1+(buffer[8]&0xff-'0')*0.01+(buffer[9]&0xff-'0')*0.001;
std::cout<<std::dec<<distance.data<<std::endl;
}
}
//发布std_msgs::Float64类型的距离数据
distance_pub.publish(distance);
loop_rate.sleep();
}
}
6:cd ~/serial_ws
catkin_make
编译
7:roscore
rosrun serial_node my_serial_node
8:查看发布的距离信息
rostopic echo my_serial_node