分为两步,一个是建立ROS的可以编译的工作空间,第二个是小乌龟画矩形实战
之前,在ROS的安装过程中,我们执行了如下命令:(此命令就是向当前用户添加ROS的环境变量)
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc
12 | echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrcsource ~/.bashrc |
---|
确认环境变量添加成功:printenv | grep ROS
,结果如下,即说明环境变量设置成功:
ROS_ROOT=/opt/ros/indigo/share/ros ROS_PACKAGE_PATH=/opt/ros/indigo/share:/opt/ros/indigo/stacks ROS_MASTER_URI=http://localhost:11311 ROSLISP_PACKAGE_DIRECTORIES= ROS_DISTRO=indigo ROS_ETC_DIR=/opt/ros/indigo/etc/ros
123456 | ROS_ROOT=/opt/ros/indigo/share/rosROS_PACKAGE_PATH=/opt/ros/indigo/share:/opt/ros/indigo/stacksROS_MASTER_URI=http://localhost:11311ROSLISP_PACKAGE_DIRECTORIES=ROS_DISTRO=indigoROS_ETC_DIR=/opt/ros/indigo/etc/ros |
---|
[1]在Home下打开终端,分别输入以下命令,创建并初始化一个catkin工作空间。
mkdir -p ~/catkin_ws2/src cd ~/catkin_ws2/src catkin_init_workspace
123 | mkdir -p ~/catkin_ws2/srccd ~/catkin_ws2/srccatkin_init_workspace |
---|
catkin_init_workspace
命令把当前目录初始化为一个ROS工作空间。
可通过来ls -l查看一下初始化之后的工作空间的内容。发现:catkin_ws目录下仅仅有一个刚才创建的src目录,src目录下只有一个指向一个cmake文件的符号连接文件。
[2]编译该工作空间。
进入到catkin_ws2目录下,使用catkin_make对工作空间进行编译。
cd ~/catkin_ws2 catkin_make
12 | cd ~/catkin_ws2catkin_make |
---|
终端结果:
【catkin_make命令是catkin工作空间非常有力的一个工具。】
此时再查看catkin_ws目录,发现多了两个文件夹build,devel:
可以看到在devel目录下,有很多setup.*sh文件,读取这些文件中的任何一个都会将当前工作空间的环境变量置于所有环境变量的最上层。如果我们打开这些文件会发现,最终都是要读取setup.sh
文件,这个文件中
[3]定义了catkin_ws空间所需要的环境变量。
source devel/setup.sh //读取setup.sh文件
1 | source devel/setup.sh //读取setup.sh文件 |
---|
[4]确认已经加载catkin工作空间环境变量:
echo $ROS_PACKAGE_PATH
1 | echo $ROS_PACKAGE_PATH |
---|
结果:/home/happyjess/catkin_ws2/src:/opt/ros/kinetic/share 这时ROS的环境变量已经创建好了。
初始化ROS的catkin工作空间:catkin_init_workspace
编译ROS的catkin工作空间:catkin_make
读取当前catkin工作空间的环境变量:source devel/setup.sh
验证ROS工作空间的环境变量加载成功:echo $ROS_PACKAGE_PATH
cd catkin_ws2/src #进入工作空间 catkin_create_pkg my_turtle_package rospy roscpp #新建my_turtle_package包
12 | cd catkin_ws2/src #进入工作空间catkin_create_pkg my_turtle_package rospy roscpp #新建my_turtle_package包 |
---|
cd my_turtle_package/src/ touch draw_rectangle.cpp
12 | cd my_turtle_package/src/ touch draw_rectangle.cpp |
---|
在打开的新文件中代码如下:
#include <ros/ros.h> #include <geometry_msgs/Twist.h> #define PI 3.14159265358979323846 int main(int argc, char **argv){ ros::init(argc, argv, "draw_rectangle"); //"draw_rectangle"必须是nodename std::string topic = "/turtle1/cmd_vel"; //topic name ros::NodeHandle n; ros::Publisher cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1); //第一个参数也可以写成"/turtle1/cmd_vel"这样的topic name //第二个参数是发布的缓冲区大小,<geometry_msgs::Twist>是消息类型 ros::Rate loopRate(2); //与Rate::sleep();配合指定自循环频率 ROS_INFO("draw_retangle start...");//输出显示信息 geometry_msgs::Twist speed; // 控制信号载体 Twist message //声明一个geometry_msgs::Twist 类型的对象speed,并将速度的值赋值到这个对象里面 int count = 0; while (ros::ok()){ speed.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退 speed.linear.y = 0; speed.linear.z = 0; speed.angular.x = 0; speed.angular.y = 0; speed.angular.z = 0; count++; while(count == 5) { count=0; speed.angular.z = PI; //转90° } cmdVelPub.publish(speed); // 将刚才设置的指令发送给机器人 ros::spinOnce();//调用此函数给其他回调函数得以执行 loopRate.sleep();//按loopRate(2)设置的2HZ将程序挂起 } return 0; }
12345678910111213141516171819202122232425262728293031323334353637 | #include <ros/ros.h>#include <geometry_msgs/Twist.h>#define PI 3.14159265358979323846 int main(int argc, char **argv){ ros::init(argc, argv, "draw_rectangle"); //"draw_rectangle"必须是nodename std::string topic = "/turtle1/cmd_vel"; //topic name ros::NodeHandle n; ros::Publisher cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1); //第一个参数也可以写成"/turtle1/cmd_vel"这样的topic name //第二个参数是发布的缓冲区大小,<geometry_msgs::Twist>是消息类型 ros::Rate loopRate(2); //与Rate::sleep();配合指定自循环频率 ROS_INFO("draw_retangle start...");//输出显示信息 geometry_msgs::Twist speed; // 控制信号载体 Twist message//声明一个geometry_msgs::Twist 类型的对象speed,并将速度的值赋值到这个对象里面 int count = 0; while (ros::ok()){ speed.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退 speed.linear.y = 0; speed.linear.z = 0; speed.angular.x = 0; speed.angular.y = 0; speed.angular.z = 0; count++; while(count == 5) { count=0; speed.angular.z = PI; //转90° } cmdVelPub.publish(speed); // 将刚才设置的指令发送给机器人 ros::spinOnce();//调用此函数给其他回调函数得以执行 loopRate.sleep();//按loopRate(2)设置的2HZ将程序挂起 } return 0;} |
---|
在terminal中继续输入下面的命令:
cd ~/catkin_ws2/src/my_turtle_package gedit CMakeLists.txt
12 | cd ~/catkin_ws2/src/my_turtle_packagegedit CMakeLists.txt |
---|
用gedit打开CMakeLists.txt文件,然后找到##Declare a C++ executable,在这一行的前面或者后面添加如下内容:
add_executable(draw_rectangle src/draw_rectangle.cpp) target_link_libraries(draw_rectangle $(去掉此处及括号){catkin_LIBRARIES})
12 | add_executable(draw_rectangle src/draw_rectangle.cpp)target_link_libraries(draw_rectangle $(去掉此处及括号){catkin_LIBRARIES}) |
---|
添加完以上内容后我们保存并退出CMakeLists.txt文件。然后在terminal中继续输入如下命令进行编译:
cd ~/catkin_ws2/ catkin_make
12 | cd ~/catkin_ws2/catkin_make |
---|
一切顺利的话就会编译成功,接下来就可以让小乌龟来画矩形了。
打开第一个terminal终端,启动ros
roscore
1 | roscore |
---|
打开第二个terminal终端,启动rosnode
rosrun turtlesim turtlesim_node
1 | rosrun turtlesim turtlesim_node |
---|
打开第三个terminal终端,启动my_turtle_package节点
cd ~/catkin_ws2/ source devel/setup.bash rosrun my_turtle_package draw_rectangle
123 | cd ~/catkin_ws2/source devel/setup.bash rosrun my_turtle_package draw_rectangle |
---|
此时我们可以看到小乌龟已经在画矩形了,如果按下Ctr+C退出节点,小乌龟也停止了。