赞
踩
ROS入门学习
- mkdir -p ros_ws/src //ros_ws名称可以变,src名称不可以变。
- cd ~/ros_ws/src/
- catkin_init_workspace
结果:
- cd ~/ros_ws
- catkin_make
结果:
catkin_make install
结果:
- cd ~/ros_ws/src
- catkin_create_pkg topic_talk std_msgs rospy roscpp
结果:
编译完成后,要运行功能包的某一个程序文件,先要设置一下工作空间的环境变量:
source devel/setup.bash
为了避免每次创建功能包,忘记执行环境变量的配置,可以将 source devel/setup.bash 命令复制添加到 .bashrc 的配置文件里面:.bashrc在根目录下:(CTRL+h 可以显示隐藏文件)
- #include<ros/ros.h>
- #include<std_msgs/String.h>
-
- const char* node_name = "topic_publisher";
- const char* topic_name = "test_topic";
-
- int main(int argc,char *argv[])
- {
- ros::init(argc,argv,node_name); //ROS节点初始化
- ros::NodeHandle n; //(注册)创建节点句柄,管理节点的资源
-
- ros::Publisher topic_publisher = n.advertise<std_mags::String>(topic_name,10);//(创建消息)创建一个Publisher,发布名为test_topic的topic,消息类型为std_mags::String,队列长度10
-
- ros::Rate loop_rate(10); //(发布消息)设置循环的频率
- ROS_INFO("%s start publishing msg",node_name);
-
- while(ros::ok()) //while循环主要就是封装数据、并发布数据、延时满足频率进入到下次循环
- {
- std_msgs::String test_msgs; //类
- test_msgs.data = "this is msg publisher!";
- topic_publisher.publish(test_msgs); //发布消息
-
- loop_rate.sleep(); // 按照循环频率延时
- }
-
- return 0;
- }
- #include<ros/ros.h>
- #include<std_msgs/String.h>
-
- const char* node_name = "topic_subscriber";
- const char* topic_name = "test_topic";
-
- void show_msg_callback(const std_msgs::String::ConstPtr& msg)//引用传递,这时存放的是由主调函数放进来的实参变量的地址
- //When messages are automatically generated into C++ code, there are several typedefs defined. One of them is ::Ptr, which is typedef-ed to be a boost::shared_ptr<MSG>, and another is ::ConstPtr which is boost::shared_ptr<MSG const>.
- //By passing a const pointer into the callback, we avoid doing a copy. While this might not make much difference for std_msgs::String, it can make a huge difference for sensor_msgs::PointCloud2.
- {
- ROS_INFO("get msg:[%s] from topic:[%s]",msg->data.c_str(),topic_name);
- }
-
- int main(int argc,char *argv[])
- {
- ros::init(argc,argv,node_name);
- ros::NodeHandle n;
-
- ros::Subscriber topic_subscriber = n.subscribe(topic_name,10,show_msg_callback);
-
- ros::spin(); //循环等待回调函数
- return 0;
- }
- add_executable(topic_publisher src/topic_publisher.cpp) //描述将哪一个程序文件(velocity_publisher. cpp),编译成哪一个可执行文件(velocity_publisher src)
- target_link_libraries(topic_publisher ${catkin_LIBRARIES}) //帮助将生成的可执行文件与ROS 的一些库建立连接(c++的库)
改写结果如下图所示,放在build位置:
catkin_make
①在功能包文件夹下新建一个msg文件夹,在msg文件夹里创建一个person.msg文件:
- string name
- uint8 age
- uint8 score
②在package.xml
文件的文件末尾添加如下语句,实现对应功能包的编译和运行的相关依赖:
- <build_depend>message_generation</build_depend> //这个名称不能改
- <exec_depend>message_runtime</exec_depend>
③在CMakeLists.txt
文件中,进行如下修改:
第一块:修改find_package部分,确保编译时找到对应文件
-
- find_package(catkin REQUIRED COMPONENTS
- roscpp
- rospy
- std_msgs
- message_generation
- )
-
第二块:设置msg文件
- add_message_files(
- FILES
- person.msg
- )
-
- generate_messages(
- DEPENDENCIES
- std_msgs
- )
第三块:catkin依赖部分
如果我们编写的ros程序不打算给别人使用,这块就无所谓。
- catkin_package(
- ...
- CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
- ...
- )
-
在源文件中使用自定义的消息类型需要包含对应编译生成的头文件:
这样就可以使用自定义的消息类型啦!
- rosrun [package_name] [node_name] //运行ros节点
-
- rosmsg list //ros会输出工作空间中已经存在的所有类型消息
- rosmsg show std_msgs/Int8 //可以看到:int8 data,std_msgs/Int8实际上是由一个int8类型的对象data组成。
-
- rosservice call [service名称] [args] //调用某服务
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。