创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印

1)创建一个工作空间和功能包,然后在功能包中完成如下工作,并使用launch文件启动涉及的节点。
创建一个工作区
工作区可以作为一个独立的项目进行编译,存放ROS程序的源文件、编译文件和执行文件。建立工作区的方法如图:
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第1张图片
编译工作区
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第2张图片
在bash中注册工作区
验证是否已经在bash中注册使用echo $ROS_PACKAGE_PATH,如果出现文件路径,则表示已经成功
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第3张图片
创建一个工程包
切换到工作区,使用catkin_create_pkg命令去创建一个叫learning_communication的包
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第4张图片
在工作区编译这个工程包。
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第5张图片
写一个发布(Publisher)节点
首先把目录切换到刚刚的learning_communication工程包中,编译过这个工程包后,会在learning_communication文件夹下看到CmakeList.txt、package.xml文件和include、src这两个目录。然后进入src子目录,在src目录中创建一个talker.cpp文件,
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第6张图片
里面的内容如下:

创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第7张图片
在这里插入图片描述
用vim建立文本文件后,按i进入编辑模式,编辑完成后按esc退出编辑模式进入普通模式,在输入:wq后保存并退出。
再在src目录中创建一个listener.cpp文件,代码如下

创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第8张图片
在编译我们创建的节点之前,我们还需要编辑Cmakelist.txt文件(注意:是learning_communication项目包下的CMakelist文件)一定要把目录切换到learning_communication目录下,否则就不会编辑learning_communication项目包下的CMakelist文件,而是新建一个文本文件,下面的步骤就会出错。
在文件末尾添加以下内容:

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

然后将目录切换到工作区,cd ~/catkin_ws,再通过catkin_make编译程序
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第9张图片
一定要切换到此目录,否则编译不了。
测试程序
首先,新开一个终端,通过roscore启动ROS核心程序,然后再新开一个终端,使用如下命令
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第10张图片
看到以上信息说明程序正确,再执行listener程序即可。
2)话题和服务编程:通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的实时位置并在终端打印;控制turtle2实现旋转运动。
首先按照上面创建工程包的步骤重新创建一个工程包进入src目录后,使用 catkin_create_pkg lesson2_homework std_msgs rospy roscpp
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第11张图片
然后在工程包下的src目录新建一个turtle_control.cpp文件
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第12张图片
Cpp文件代码如下

#include 
#include 
#include 
#include 

ros::Publisher turtle_vel;

void poseCallback(const turtlesim::PoseConstPtr& msg)
{
    ROS_INFO("Turtle2 position:(%f %f)",msg->x,msg->y);
}

int main(int argc,char** argv)
{
    //初始化节点
    ros::init(argc,argv,"turtle_control");
    
    ros::NodeHandle node;

    //通过服务调用,产生第二只乌龟turtle2
    ros::service::waitForService("spawn");
    ros::ServiceClient add_turtle=node.serviceClient<turtlesim::Spawn>("spawn");
    turtlesim::Spawn srv;
    srv.request.x=5;
    srv.request.y=5;
    srv.request.name="turtle2";
    add_turtle.call(srv);
    
    ROS_INFO("The turtle2 has been spawn!");

    //订阅乌龟的pose信息
    ros::Subscriber sub=node.subscribe("turtle2/pose",10,&poseCallback);

    //定义turtle的速度控制发布器
    turtle_vel=node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel",10);

    ros::Rate rate(10.0);
    
    while(node.ok())
    {
        //发布速度控制命令
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z=1;
        vel_msg.linear.x=1;
        turtle_vel.publish(vel_msg);
    
        ros::spinOnce();
        rate.sleep();
    }
    
    return 0;
}

然后同样的编辑Cmakelist.txt文件,位置也是lesson2_homework下的文件。输入以下代码

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

再在lesson2_homework工程包下新建一个launch文件夹,然后在文件夹里新建一个turtle_control.launch文件,文件内容如下:
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第13张图片
然后将目录切换到工作区,cd ~/catkin_ws,再通过catkin_make编译程序
出现以下内容即编译正确
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第14张图片
最后打开一个新的终端启动ros核心程序
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第15张图片
然后同样的注册程序
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第16张图片
运行程序
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第17张图片
因为是要用到小海龟,所以还需要启动小海龟仿真器,重新打开一个终端,输入以下内容,注意之前的两个终端不能关闭。
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第18张图片
然后就会出现任务所需的要求 出现一个小海龟不停的转圈
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第19张图片
并且在之前运行程序的终端上会不停的打印小海龟的位置
创建一个工作空间和功能包,并使用launch文件启动涉及的节点。 通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的位置并实时打印_第20张图片
实验比较简单,但是一定要专注,注意一些文件的位置和代码的正确性,如果遇到什么问题可以联系我。

你可能感兴趣的:(ROS)