ROS学习记录(一)

用于学习ROS的记录,以便复习

一,创建工作空间
首先在home路径下创建文件夹

mkdir -p ~/catkin_test/src

cd到对应src文件夹下

cd ~/catkin_test/src

初始化工作空间

  catkin_init_workspace

回到主文件夹下,编译工作空间

  cd ~/catkin_test
  catkin_make

catkin_make处会报错,原因是ROS用的是python2,而anaconda默认python为python3,将catkin_make替换为

  catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

即可,接下来这个工作空间使用catkin_make就不会再报错了

设置环境变量

  gedit ~/.bashrc

在最后加上

  source  ~/catkin_test/devel/setup.bash 

关闭保存后刷新

  source ~/.bashrc

即完成环境变量的设置
用以下命令查看设置的路径

  echo $ROS_PACKAGE_PATH

检查是否包含当前目录

二,在工作空间下,创建功能包
功能包都是放在工作空间下的src文件夹中

  cd ~/catkin_test/src
  catkin_create_pkg exam std_msgs rospy roscpp

回到上一目录进行编译功能包

  cd ~/catkin_test
  catkin_make
  source devel/setup.bash

完成空白功能包的创建

三,完成对应任务,实现话题编程与服务编程
任务一:话题编程与服务编程,实现通过代码新生一只乌龟,放置在(5,5)点,命名为“tutle2”;通过代码订阅turtle2的实时位置并在终端打印;控制turtle2实现旋转运动;
简要介绍:
话题编程:存在话题发布者talker和接收者listener,两者异步单向通信,listener通过ROS话题去订阅talker发布的消息,类似于我通过邮件能够随时接受到github上关注一个项目的notifications(单方面接收消息)。
服务编程:存在服务器端server和客户端client,两者可同步相互通信
(一)使用turtlesim功能包产生乌龟,去订阅其位置
在功能包下创建对应的文件,turtle_pose.cpp(也可用python)

cd ~/catkin_test/src/exam/src
>turtle_pose.cpp

进行代码编写

点击查看代码
#include <ros/ros.h>
#include <turtlesim/Pose.h>

void poseCallback(const turtlesim::PoseConstPtr& msg)
{
  ROS_INFO("x: [%f]", msg->x);
  ROS_INFO("y: [%f]", msg->y);
  ROS_INFO("theta: [%f]", msg->theta);
}

int main(int argc, char** argv)
{
    // 初始化节点
    ros::init(argc, argv, "turtle2_pose");


    // 订阅乌龟的pose信息并打印
    ros::NodeHandle node;
    ros::Subscriber sub = node.subscribe("turtle2/pose", 10, &poseCallback);

    ros::spin();

    return 0;
};

(二)完成turtle位置发布的话题编程,turtle_controller.cpp

点击查看代码
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>
#include <turtlesim/Kill.h>

int main(int argc, char** argv)
{
    // 初始化节点
    ros::init(argc, argv, "my_turtle");

    ros::NodeHandle node;
   
    // 通过服务调用,产生第二只乌龟turtle2
    ros::service::waitForService("spawn");
    ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("spawn");
    turtlesim::Spawn::Request req;
    turtlesim::Spawn::Response resp;
    req.x=5;
    req.y=5;
    req.theta=0;
    req.name="turtle2";
    bool success=add_turtle.call(req,resp);

    if(success)
    {
	ROS_INFO("Spawn a turtle nemed turtle2");
    }else{
        ROS_INFO("Spawn a turtle failed.");
     }


    ros::service::waitForService("kill");
    ros::ServiceClient kill_turtle = node.serviceClient<turtlesim::Kill>("kill");
    turtlesim::Kill turtle;
    turtle.request.name="turtle1";
    kill_turtle.call(turtle);
    // 定义turtle2的速度控制发布器
    ros::Publisher turtle_vel =
    node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);

    ros::Rate rate(10.0);
    while (node.ok())
    {
        // 并发布速度控制指令,使turtle2做圆周运动
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z = 1;
        vel_msg.linear.x = 2;
        turtle_vel.publish(vel_msg);
        //发布turtle2的位置
        rate.sleep();
    }
    return 0;
};

(三)使用launch文件去启动相关节点

点击查看代码
 <launch>
    <!-- 海龟仿真器 -->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

    <!-- 打印turtle2的位置 -->
    <node pkg="exam" type="turtle_pose"
          name="turtle2_pose" output="screen" />
    <!-- 发布话题,并且控制turtle2移动 -->
    <node pkg="exam" type="turtle_controller"
          name="listener"/>
 </launch>

同时完成CmakeLists.txt和package.xml文件的配置
对于CmakeLists.txt设置需要编译的代码和生成的可执行文件;
在CmakeLists.txt中加入以下

add_executable(turtle_pose src/turtle_pose.cpp)
target_link_libraries(turtle_pose ${catkin_LIBRARIES})

add_executable(turtle_controller src/turtle_controller.cpp)
target_link_libraries(turtle_controller ${catkin_LIBRARIES})

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  turtlesim
)
//加入turtlesim功能包

在package.xml文件中加入
添加依赖项

  <build_depend>turtlesim</build_depend>
  <build_export_depend>turtlesim</build_export_depend>
  <exec_depend>turtlesim</exec_depend>

  <build_depend>geometry_msgs</build_depend>
  <build_export_depend>geometry_msgs</build_export_depend>
  <exec_depend>geometry_msgs</exec_depend>  

以上即完成任务一,但代码方面主要来自网上,需要好好研究。尤其是关于乌龟位置的发布,乌龟的控制。一些细节未把握如,乌龟放置在(5,5)位置出,是否实现?

posted @ 2022-07-15 15:57  一天day  阅读(52)  评论(0编辑  收藏  举报