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超声波测距程序匹配,可直接使用)。
https://download.youkuaiyun.com/download/vampirewolf/11222221
https://download.youkuaiyun.com/download/vampirewolf/11221707
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通过串口发送的实时数据。