版权声明:本文为博主原创文章,未经博主允许不得转载,转载请设置文章链接! 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)
这是调角速度,线速度也一样,如有问题错误等欢迎留言指出。