• SLAM从入门到精通(编写第一个package)


    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

            前面我们安装了ROS环境,接着就可以开始进行ROS程序的开发了。在开发之前,我们有几个概念需要厘清一下。第一个是workspace,它相当于一个项目。毕竟,一个电脑上面可以有很多的workspace,也就相当于有很多的项目。第二个是package,它相当于功能块,功能块里面可以有很多的程序,package本身就是很多程序的一个集合。第三个就是node,直接把它看成独立的程序就可以了。

    1、创建workspace

            创建工作区是所有工作的第一步。可以通过创建workspace下面src目录的方法,直接进行创建,

    mkdir -p ./catkin_ws/src

    2、编译workspace

            创建完成之后,就可以直接编译了。这个时候虽然什么也没有,但是catkin_make命令会帮我们自动创建build和dev这两个目录,

    1. cd ./catkin_ws
    2. catkin_make

    3、创建package

            有了工作区,就可以开始创建工作包了。工作包的创建方法也不复杂,主要使用catkin_create_pkg命令即可,前提是先进入src目录,

    1. cd ./catkin_ws/src
    2. catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

    4、开始准备代码talker.cpp & listener.cpp

            package里面也是有src目录的,虽然有点绕,这个我们可以稍微花点时间理解一下。现在假设有两个程序,一个是talker.cpp,一个是listener.cpp,他们都是放在package的src目录里面。所以第一步,先进入package里面的src目录,即,

    ./catkin_ws/src/beginner_tutorials/src

            准备talker.cpp文件,

    1. #include "ros/ros.h"
    2. #include "std_msgs/String.h"
    3. #include <sstream>
    4. int main(int argc, char **argv)
    5. {
    6. ros::init(argc, argv, "talker");
    7. ros::NodeHandle n;
    8. ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    9. ros::Rate loop_rate(10);
    10. int count = 0;
    11. while (ros::ok())
    12. {
    13. std_msgs::String msg;
    14. std::stringstream ss;
    15. ss << "hello world " << count;
    16. msg.data = ss.str();
    17. ROS_INFO("%s", msg.data.c_str());
    18. chatter_pub.publish(msg);
    19. ros::spinOnce();
    20. loop_rate.sleep();
    21. ++count;
    22. }
    23. return 0;
    24. }

            接着准备listener.cpp文件,

    1. #include "ros/ros.h"
    2. #include "std_msgs/String.h"
    3. void chatterCallback(const std_msgs::String::ConstPtr& msg)
    4. {
    5. ROS_INFO("I heard: [%s]", msg->data.c_str());
    6. }
    7. int main(int argc, char **argv)
    8. {
    9. ros::init(argc, argv, "listener");
    10. ros::NodeHandle n;
    11. ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    12. ros::spin();
    13. return 0;
    14. }

    5、修改CMakeLists.txt

            这里需要注意的是,相关的CMakeLists.txt文件不是src目录下面文件,而是package下面的文件。这一点很容易改错的。

    1. cmake_minimum_required(VERSION 2.8.3)
    2. project(beginner_tutorials)
    3. ## Find catkin and any catkin packages
    4. find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
    5. ## Declare ROS messages and services
    6. #add_message_files(FILES Num.msg)
    7. #add_service_files(FILES AddTwoInts.srv)
    8. ## Generate added messages and services
    9. generate_messages(DEPENDENCIES std_msgs)
    10. ## Declare a catkin package
    11. catkin_package()
    12. ## Build talker and listener
    13. include_directories(include ${catkin_INCLUDE_DIRS})
    14. add_executable(talker src/talker.cpp)
    15. target_link_libraries(talker ${catkin_LIBRARIES})
    16. add_dependencies(talker beginner_tutorials_generate_messages_cpp)
    17. add_executable(listener src/listener.cpp)
    18. target_link_libraries(listener ${catkin_LIBRARIES})
    19. add_dependencies(listener beginner_tutorials_generate_messages_cpp)

    6、开始编译

            编译就非常简单了。需要回到workspace的目录,然后输入catkin_make就可以了,

    1. cd ./catkin_ws
    2. catkin_make

            不出意外的话,我们在./catkin_ws/devel/lib/beginner_tutorials看到对应的可执行文件。

    7、启动程序

            启动程序需要三个步骤。第一个步骤,设置一下rosrun的环境,即,

    source devel/setup.sh

            这样后期rosrun的时候,就可以直接启动node程序了。第二个步骤,输入roscore,这个相当于整个底层信息交换的大脑。第三个步骤,就是启动talker和listener了,

    1. rosrun beginner_tutorials talker
    2. rosrun beginner_tutorials listener

            所有操作都完成之后,我们就可以看到talker程序这边在不断发送消息,而listener这边在不断地接收消息。这是一个完整的publish和subscribe程序对。

            整个过程看上去自己要做的内容很少。这是因为ros已经帮助我们完成了大部分的工作,用ldd命令看下生成的程序就知道了,

    1. feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws/devel/lib/beginner_tutorials$ ldd listener
    2. linux-vdso.so.1 (0x00007ffeb4bfe000)
    3. libroscpp.so => /opt/ros/noetic/lib/libroscpp.so (0x00007f2381bc9000)
    4. libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2381b69000)
    5. librosconsole.so => /opt/ros/noetic/lib/librosconsole.so (0x00007f2381b06000)
    6. libroscpp_serialization.so => /opt/ros/noetic/lib/libroscpp_serialization.so (0x00007f2381b01000)
    7. libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f238191f000)
    8. libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2381904000)
    9. libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2381710000)
    10. libxmlrpcpp.so => /opt/ros/noetic/lib/libxmlrpcpp.so (0x00007f23816ec000)
    11. librostime.so => /opt/ros/noetic/lib/librostime.so (0x00007f23816bf000)
    12. libcpp_common.so => /opt/ros/noetic/lib/libcpp_common.so (0x00007f23816b1000)
    13. libboost_thread.so.1.71.0 => /lib/x86_64-linux-gnu/libboost_thread.so.1.71.0 (0x00007f2381685000)
    14. libboost_chrono.so.1.71.0 => /lib/x86_64-linux-gnu/libboost_chrono.so.1.71.0 (0x00007f2381677000)
    15. libboost_filesystem.so.1.71.0 => /lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0 (0x00007f2381657000)
    16. libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2381508000)
    17. /lib64/ld-linux-x86-64.so.2 (0x00007f2381db2000)
    18. librosconsole_log4cxx.so => /opt/ros/noetic/lib/librosconsole_log4cxx.so (0x00007f23814e8000)
    19. librosconsole_backend_interface.so => /opt/ros/noetic/lib/librosconsole_backend_interface.so (0x00007f23814e3000)
    20. liblog4cxx.so.10 => /lib/x86_64-linux-gnu/liblog4cxx.so.10 (0x00007f2381305000)
    21. libboost_regex.so.1.71.0 => /lib/x86_64-linux-gnu/libboost_regex.so.1.71.0 (0x00007f2381205000)
    22. libconsole_bridge.so.0.4 => /lib/x86_64-linux-gnu/libconsole_bridge.so.0.4 (0x00007f23811fd000)
    23. libapr-1.so.0 => /lib/x86_64-linux-gnu/libapr-1.so.0 (0x00007f23811c4000)
    24. libaprutil-1.so.0 => /lib/x86_64-linux-gnu/libaprutil-1.so.0 (0x00007f2381196000)
    25. libicui18n.so.66 => /lib/x86_64-linux-gnu/libicui18n.so.66 (0x00007f2380e97000)
    26. libicuuc.so.66 => /lib/x86_64-linux-gnu/libicuuc.so.66 (0x00007f2380cb1000)
    27. libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f2380ca6000)
    28. libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2380ca0000)
    29. libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f2380c65000)
    30. libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2380c37000)
    31. libicudata.so.66 => /lib/x86_64-linux-gnu/libicudata.so.66 (0x00007f237f176000)

  • 相关阅读:
    VScode配置Ros环境
    【建议收藏】回收站数据恢复如何操作?3个方案帮你恢复删除的文件
    【毕业设计】基于php+mysql+mvc的网上留言管理系统设计与实现(毕业论文+程序源码)——网上留言管理系统
    Pytorch学习(二)
    常见web安全及防护原理
    香港闯关相关法律
    【SA8295P 源码分析 (二)】110 - OpenWFD Display 美信加串器 MAX96783 - 解串器 MAX96774 初始化寄存器详解
    LoadBalance客户端负载均衡
    开发中常用的日期转换
    LabVIEW样式检查表7
  • 原文地址:https://blog.csdn.net/feixiaoxing/article/details/132801199