QT界面用Slider调节ROS小乌龟控制速度

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请设置文章链接! https://blog.csdn.net/qq_30460905/article/details/84898515

昨天有同学问我如何用滑动条实现调速,我今天想了想,中午午休时加了几行程序调了一下,大致实现了,晚上正好整理一下,详情如下!

1.添加按钮与slider

首先建立一个包含Qt界面的工程文件(不会的话看我之前的Qt-ROS 下的文章),在界面里面添加几个上下左右键,再添加一个Slider滑动条,修改名称为AngularSlider。

2.修改main_window.cpp

在main_window.cpp添加slider的信号和槽的连接,程序如下:

//将slider值改变信号和角度改变槽连接
QObject::connect(ui.AngularSlider, SIGNAL(valueChanged(int)), this, SLOT(set_angular_value(int)));
//实现槽函数
void MainWindow::set_angular_value(int slider_value)
{
    //先在头文件中声明 float angular_value;
    angular_value = slider_value*0.1;//slider 值0-100,转化为0-10弧度
    qnode.turtle_angular = angular_value;//将值传给qnode.cpp中turtle角速度
    std::cout<<"Angular Value: "<<angular_value<<std::endl;
}

3.修改qnode.cpp

在qnode.cpp中添加geometry_msgs::Twist 的Publisher,发布话题到/turtle1/cmd_vel,并将速度值输出,程序如下:

//以右转向程序为例,左转类似
void QNode::runRight()
{
  ros::NodeHandle n;
  // Add your ros communications here.
  chatter_publisher = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1);
  ros::Rate loop_rate(1);
  std::string right_log ="I'm turning right, speed";
  //字符串转换并连接,参考:https://blog.csdn.net/wangshubo1989/article/details/50241899
  std::string speed= static_cast<std::ostringstream*>( &(std::ostringstream() << turtle_angular) )->str();
  right_log += speed;
  log(Info,std::string(right_log));
  if ( ros::ok() ) {

    geometry_msgs::Twist msg;
            msg.linear.x = 3.0;
            msg.angular.z = -turtle_angular;
    chatter_publisher.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }
}
/×××××××
 × 注意在头文件声明变量,初始化为零
 × float turtle_angular = 0.0;
 × float turtle_linear = 0.0;
 ×××××××/

4.运行查看结果

滑动条改变的是角速度,是为了方便大家查看结果,在限速度不变的情况下,角速度越大,小乌龟跑得半径越小!

5.其他问题

注意在CmakeLists文件中添加下面一行,不然会有警告

add_compile_options(-std=c++11)

这是调角速度,线速度也一样,如有问题错误等欢迎留言指出。

猜你喜欢

转载自blog.csdn.net/qq_30460905/article/details/84898515
今日推荐