目标:控制小海龟画圆
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