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

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

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

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

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

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

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