在​​上一篇文章​​中,我们通过在终端用命令行发布一条ROS话题消息来通知下位机控制舵机运动。

在这一篇文章中,我们学习一下通过程序自动发布消息来控制舵机运动。

我们可以使用nanopi k2当作上位机来使用,这里暂时还是使用虚拟机,一切调试好之后可以一起部署到nanopi上面。

下位机还是一样的用arduino,arduino程序也没有变化。

1.首先,我们创建一个功能包并添加好依赖:

下方为示意图,实际上依赖只需要roscpp和std_msgs即可

ros+arduino学习(五):ros发布消息控制舵机之二(arduino做下位机)(程序控制)Nanopi k2_ubuntu

2.创建publish_servo.cpp程序并编写程序(程序如下,可以直接复制使用):

#include <ros/ros.h>
#include <std_msgs/UInt16.h>

int main(int argc,char**argv)
{
ros::init(argc,argv,"publish_servo");
ros::NodeHandle n;
//ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
//turtle_vel_pub是发布者,advertise()函数用于向ros master也就是ros管理器声明我要发布一个cmd_vel的话题
ros::Publisher servo_publisher = n.advertise<std_msgs::UInt16>("servo_led",10);
//servo_publisher是发布者
ros::Rate loop_rate(10);
std_msgs::UInt16 servo_msg;
while(ros::ok())
{
servo_msg.data=30;
servo_publisher.publish(servo_msg);

/*
for(servo_msg.data=0;servo_msg.data<180;servo_msg.data++)
{
servo_publisher.publish(servo_msg);

}
for(servo_msg.data=180;servo_msg.data>0;servo_msg.data--)
{
servo_publisher.publish(servo_msg);
}
//ROS_INFO("Publish turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msgs.linear.x,vel_msgs.angular.z);
*/
loop_rate.sleep();
}
return 0;
}

 3.更改CMakeLists.txt文件,增加编译项。

add_executable(publish_servo src/publish_servo.cpp)
target_link_libraries(publish_servo ${catkin_LIBRARIES})

 然后还是跟上一篇文章一样,但是在终端命令行无需手动发布消息,只需要执行publish_servo程序即可看到舵机从0度转到180度,再从180度转回来。

rosrun publish_servo publish_servo