实现基础: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;
}
参考: