实现基础:1、上位机、下位机通讯;2、ROS读取前轮转角传感器速度

​​​​​​​​​​​​​​上位机系统Ubuntu 20.04与下位机arduino UNO通讯_可见一班的博客-CSDN博客

读取拉线位移传感器(RS485协议)的ROS驱动包_可见一班的博客-CSDN博客


方案一:判断了旋转方向就向下位机发布指令,可以实现转向,但是会出现咯噔咯噔的卡顿现象,因为下位机接收到了指令频率太高了。

方案二:在上个方案的基础上增加判断条件,也就是电机工作状态量,用大小为2的队列实现。核心代码如下,需结合前两篇博客使用:

queue<int> q;
int windowSize = 2; // 滤波窗口大小(可以根据自己需要改)

//回调函数包括: 
   if(q.size()<2){
		key_c.data = q.back();
		key_publisher.publish(key_c);
		ROS_INFO("First!");
	}
	else
	{
		int diff = q.back() - q.front();
		if (diff != 0){
			key_c.data = q.back();
			key_publisher.publish(key_c);
			ROS_INFO("state change!");
		}
	}

//主函数:
int main(int argc, char  **argv)
{
	
	ros::init(argc, argv, "steer_control");
	ros::NodeHandle nh;

	key_publisher = nh.advertise<std_msgs::UInt16>("key_command", 10);
	laxian_sub = nh.subscribe("/steering_angle", 10, steer_callback);
	

	ros::spin();
	return 0;
}

参考:

ROS里在回调函数里获取前后两帧(多帧)数据的差值_辉——书生意气的博客-CSDN博客

07-07 19:01