ros2 以C++程序控制海龟一

目标:控制小海龟画圆

1.启动海龟

duobian@duobian:~/works/topic_wc$ ros2 run turtlesim  turtlesim_node 
[INFO] [1763458411.446727736] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1763458411.449821401] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

2.查看话题列表

duobian@duobian:~/works/topic_wc$ ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

3.创建topic_demo项目(c++版本)

duobian@duobian:~/works/topic_wc/src$ ros2 pkg create demo_cpp_toipc --build-type ament_cmake --dependencies rclcpp geometry_msgs turtlesim --license Apache-2.0
turtlesim --license Apache-2.0
going to create a new package
package name: demo_cpp_toipc
destination directory: /home/duobian/works/topic_wc/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['duobian <duobian@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_cmake
dependencies: ['rclcpp', 'geometry_msgs', 'turtlesim']
creating folder ./demo_cpp_toipc
creating ./demo_cpp_toipc/package.xml
creating source and include folder
creating folder ./demo_cpp_toipc/src
creating folder ./demo_cpp_toipc/include/demo_cpp_toipc
creating ./demo_cpp_toipc/CMakeLists.txt

4.编写cpp代码

在demo_cpp_toipc/src/下创建如turtle_circle.cpp文件

#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/twist.hpp"
#include <chrono>

using namespace std::chrono_literals;

class TurtleCircleNode : public rclcpp::Node
{
private:
    rclcpp::TimerBase::SharedPtr timer_ ; // 定时器的智能指针
    rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr publisher_ ; // 发布者的智能指针
    /* data */
public:
    explicit TurtleCircleNode(const std::string & node_name):Node(node_name)
    {
        publisher_ = this->create_publisher<geometry_msgs::msg::Twist>("turtle1/cmd_vel",10);
        timer_ = this->create_wall_timer(1000ms,std::bind(&TurtleCircleNode::timer_callback,this));

    }

    void timer_callback()
    {
        auto msg = geometry_msgs::msg::Twist();
        msg.linear.x = 2.0;
        msg.angular.z = 1.0;
        publisher_->publish(msg);
    }
  
};

int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<TurtleCircleNode>("turtle_circle");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

在编码过程中引用会标红、原因是C/C++配置项中的includePath未配置引用 库的位置,引用的ros依赖库位于ros安装路径下的include中,包含路径配置中加上,如:/opt/ros/foxy/include/**

4.添加执行配置

在CMakeLists.txt文件中添加配置,在find_pakage后

#添加可执行文件
add_executable(turtle_circle  src/turtle_circle.cpp)
#添加依赖
ament_target_dependencies(turtle_circle rclcpp geometry_msgs)
...
#在ament_pakage()前添加install,意将可执行的文件安装到那里
install(TARGETS turtle_circle DESTINATION lib/${PROJECT_NAME})

5.构建

duobian@duobian:~/works/topic_wc/src$ cd ..
duobian@duobian:~/works/topic_wc$ colcon build
Starting >>> demo_cpp_toipc
Starting >>> demo_python_topic
Finished <<< demo_python_topic [0.72s]                                                    
Finished <<< demo_cpp_toipc [4.31s]                     

Summary: 2 packages finished [4.50s]

6.执行

duobian@duobian:~/works/topic_wc$ source install/setup.bash 
duobian@duobian:~/works/topic_wc$ ros2 run demo_cpp_toipc turtle_circle

7.查看执行结果

duobian@duobian:~/works/topic_wc$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
duobian@duobian:~/works/topic_wc$ ros2 node list
/turtle_circle
/turtlesim
duobian@duobian:~/works/topic_wc$ ros2 node info /turtle_circle
/turtle_circle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Service Servers:
    /turtle_circle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtle_circle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtle_circle/get_parameters: rcl_interfaces/srv/GetParameters
    /turtle_circle/list_parameters: rcl_interfaces/srv/ListParameters
    /turtle_circle/set_parameters: rcl_interfaces/srv/SetParameters
    /turtle_circle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:

  Action Clients:

duobian@duobian:~/works/topic_wc$ ros2 topic echo /turtle1/cmd_vel
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0

小海龟状态

1763537677425.jpg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容