构建catkin工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
配置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
检查环境变量
echo $ROS_PACKAGE_PATH
遇到错误:上面操作不需要用sudo 进行操作,但是由于初学者可能存在操作不当导致错误
出现这种情况的原因是catkin_init_workspacce的时候,出现下面这句:
Creating symlink “/home/ubuntu/catkin_ws/CMakeLists.txt” pointing to “/opt/ros/indigo/share/catkin/cmake/toplevel.cmake”
将当前工作空间下的CMakeLists.txt与/ros/下的cmake做了链接
解决方法:
unlink /home/youpath/catkin_ws/CMakeLists.txt
发布一个话题案例:
- cd ~/catkin_ws/src
- catkin_create_pkg package1 roscpp rospy std_msgs
使用命令cd ~/catkin_ws/src 进入代码空间,并在代码空间中创建功能包
使用catkin_create_pkg创建名为package1的功能包,功能包的支撑库为roscpp rospy和std_msgs,创建功能包的命令格式为catkin_create_pkg
- cd ~/catkin_ws/src/package1/src
- touch pub_node_test.cpp
进入~/catkin_ws/src/package1/src文件夹,使用touch命令创建一个cpp文件,在cpp文件中输入以下内容。
- #include "ros/ros.h"
- #include "std_msgs/String.h"
- #include <sstream>
- int main(int argc,char **argv)
- {
- ros::init(argc,argv,"talker"); //初始化
- ros::NodeHandle n; //创建句柄
- ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000); //设定话题名称为chatter,并且缓存队列长度为1000,用于平衡硬件发送速度
- ros::Rate loop_rate(10); //设置发送波特率为10HZ,与后面的loop_rate.sleep();相互呼应,如果下一帧信息不满足频率要求系统则会延时
- int count = 0;
- while(ros::ok())
- {
- std_msgs::String msg;
- std::stringstream ss;
- ss<<"first example!"<<count;
- msg.data = ss.str();
- ROS_INFO("%s",msg.data.c_str());
- chatter_pub.publish(msg);
- ros::spinOnce();
- loop_rate.sleep();
- ++count;
- }
- return 0;
- }
以上代码创建了一个名为talker的节点,该节点通过"chatter"话题发布消息
然后修改package1功能包中的CMakeList.txt文件.打开CMakeLists.txt文件并在里面输入以下内容。
- add_executable(pub_node src/pub_node_test.cpp)
- target_link_libraries(pub_node ${catkin_LIBRARIES})
这样就可以在devel/lib文件夹下生成名为pub_node的可执行文件了,这两条编译码的一般格式如下:add_executable([可执行文件名] src/[cpp文件名]) target_link_libraries([可执行文件名] ${catkin_LIBRARIES})
回到工作空间下并使用catkin_make编译整个工作空间
- cd ~/catkin_ws
- catkin_make
打开一个新终端,使用如下命令即可运行刚编译生成的可执行文件
rosrun package1 pub_node
显示界面如下:
工作空间及消息创建成功!使用rostopic list可以看到会出现一个新的名为chatter的话题。