前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器人操作系统ROS学习实战篇之——让小乌龟画矩形

机器人操作系统ROS学习实战篇之——让小乌龟画矩形

作者头像
用户1696846
发布2019-12-30 16:17:42
2.5K0
发布2019-12-30 16:17:42
举报
文章被收录于专栏:Android自学

分为两步,一个是建立ROS的可以编译的工作空间,第二个是小乌龟画矩形实战

一、建立ROS的工作空间

1 确认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

2 创建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的环境变量已经创建好了。

3 总结

初始化ROS的catkin工作空间:catkin_init_workspace 编译ROS的catkin工作空间:catkin_make 读取当前catkin工作空间的环境变量:source devel/setup.sh 验证ROS工作空间的环境变量加载成功:echo $ROS_PACKAGE_PATH

二、小乌龟画矩形实战

1进入工作空间

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包

2节点代码

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

一切顺利的话就会编译成功,接下来就可以让小乌龟来画矩形了。

3:启动节点

打开第一个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退出节点,小乌龟也停止了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、建立ROS的工作空间
    • 1 确认ROS环境变量
      • 2 创建ROS工作空间
        • 3 总结
        • 二、小乌龟画矩形实战
          • 1进入工作空间
            • 2节点代码
              • 3:启动节点
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档