• ROS1云课→09功能包小定制(CLI命令行接口)


    ROS1云课→08基础实践(CLI命令行接口)


    默认的turtlesim:

    开始定制化:

     

    首先,将turtlesim源码拷贝到base_tutorials/src目录下:

    图标换一下:

    然后修改源码turtle_frame.cpp:

    1. QVector turtles;
    2. turtles.append("rosbot.png");
    3. /*turtles.append("box-turtle.png");
    4. turtles.append("robot-turtle.png");
    5. turtles.append("sea-turtle.png");
    6. turtles.append("diamondback.png");
    7. turtles.append("electric.png");
    8. turtles.append("fuerte.png");
    9. turtles.append("groovy.png");
    10. turtles.append("hydro.svg");
    11. turtles.append("indigo.svg");*/

    活动背景改色,场地改大一些,ROSbotSim_2022:

    1. #define DEFAULT_BG_R 0x11
    2. #define DEFAULT_BG_G 0x22
    3. #define DEFAULT_BG_B 0x33
    4. namespace turtlesim
    5. {
    6. TurtleFrame::TurtleFrame(QWidget* parent, Qt::WindowFlags f)
    7. : QFrame(parent, f)
    8. , path_image_(777, 777, QImage::Format_ARGB32)
    9. , path_painter_(&path_image_)
    10. , frame_count_(0)
    11. , id_counter_(0)
    12. {
    13. setFixedSize(777, 777);
    14. setWindowTitle("ROSbotSim_2022开学大吉");

     


    如果去查看节点列表,会看到出现了一个新的节点,叫做/turtlesim。可以通过使用rosnode info nameNode命令查看节点信息。可以看到很多能用于程序调试的信息:

    $ rosnode info /turtlesim

    在以上信息中,可以看到Publications(及相应主题)、Subscriptions(及相应主题)、该节点具有的Servicessrv)及它们各自唯一的名称。

    接下来介绍如何使用主题和服务与该节点进行交互。

    通过rostopic使用pub参数,可以发布任何节点都可以订阅的主题。只需要用正确的名称将主题发布出去。将会在以后做这个测试,现在要使用一个节点,并让节点做如下工作:

    $ rosrun turtlesim turtle_teleop_key

    通过节点订阅的主题,可以使用箭头键移动机器人,如下图所示:

     

    补充:rqt

    比如清除:

    其他内容依据具体要求进行补充。

    介绍了ROS系统的架构及其工作方式的基本信息。学习了一些基本概念、工具及如何同节点、主题和服务进行交互的示例。一开始,所有这些概念可能看起来有些复杂且不太实用,但在后面的课程中,会逐渐理解这样的应用。

    最好在继续后续课程的学习之前,对这些概念及示例进行练习,因为在后面的课程里,将假定已经熟悉所有的概念及其用途。

    请注意如果想查询某个名词或功能的解释,且无法在课程中找到相关内容或答案,那么可以通过以下链接访问ROS官方资源http://www.ros.org。而且还可以通过访问ROS社区http://answers.ros.org提出自己的问题。


    思考,如何实现高精度曲线绘制。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. turtlesim::PoseConstPtr g_pose;
    7. turtlesim::Pose g_goal;
    8. enum State
    9. {
    10. FORWARD,
    11. STOP_FORWARD,
    12. TURN,
    13. STOP_TURN,
    14. };
    15. State g_state = FORWARD;
    16. State g_last_state = FORWARD;
    17. bool g_first_goal_set = false;
    18. #define PI 3.141592
    19. void poseCallback(const turtlesim::PoseConstPtr& pose)
    20. {
    21. g_pose = pose;
    22. }
    23. bool hasReachedGoal()
    24. {
    25. return fabsf(g_pose->x - g_goal.x) < 0.001 && fabsf(g_pose->y - g_goal.y) < 0.001 && fabsf(g_pose->theta - g_goal.theta) < 0.0001;
    26. }
    27. bool hasStopped()
    28. {
    29. return g_pose->angular_velocity < 0.0001 && g_pose->linear_velocity < 0.0001;
    30. }
    31. void printGoal()
    32. {
    33. ROS_INFO("New goal [%f %f, %f]", g_goal.x, g_goal.y, g_goal.theta);
    34. }
    35. void commandTurtle(ros::Publisher twist_pub, float linear, float angular)
    36. {
    37. geometry_msgs::Twist twist;
    38. twist.linear.x = linear;
    39. twist.angular.z = angular;
    40. twist_pub.publish(twist);
    41. }
    42. void stopForward(ros::Publisher twist_pub)
    43. {
    44. if (hasStopped())
    45. {
    46. ROS_INFO("Reached goal");
    47. g_state = TURN;
    48. g_goal.x = g_pose->x;
    49. g_goal.y = g_pose->y;
    50. g_goal.theta = fmod(g_pose->theta + PI/2.0, 2*PI);
    51. printGoal();
    52. }
    53. else
    54. {
    55. commandTurtle(twist_pub, 0, 0);
    56. }
    57. }
    58. void stopTurn(ros::Publisher twist_pub)
    59. {
    60. if (hasStopped())
    61. {
    62. ROS_INFO("Reached goal");
    63. g_state = FORWARD;
    64. g_goal.x = cos(g_pose->theta) * 4 + g_pose->x;
    65. g_goal.y = sin(g_pose->theta) * 4 + g_pose->y;
    66. g_goal.theta = g_pose->theta;
    67. printGoal();
    68. }
    69. else
    70. {
    71. commandTurtle(twist_pub, 0, 0);
    72. }
    73. }
    74. void forward(ros::Publisher twist_pub)
    75. {
    76. if (hasReachedGoal())
    77. {
    78. g_state = STOP_FORWARD;
    79. commandTurtle(twist_pub, 0, 0);
    80. }
    81. else
    82. {
    83. commandTurtle(twist_pub, 1.0*(fabsf(g_pose->x - g_goal.x)+fabsf(g_pose->y - g_goal.y)), 0.0);
    84. }
    85. }
    86. void turn(ros::Publisher twist_pub)
    87. {
    88. if (hasReachedGoal())
    89. {
    90. g_state = STOP_TURN;
    91. commandTurtle(twist_pub, 0, 0);
    92. }
    93. else
    94. {
    95. commandTurtle(twist_pub, 0.0, 0.8*fabsf(g_pose->theta - g_goal.theta));
    96. }
    97. }
    98. void timerCallback(const ros::TimerEvent&, ros::Publisher twist_pub)
    99. {
    100. if (!g_pose)
    101. {
    102. return;
    103. }
    104. if (!g_first_goal_set)
    105. {
    106. g_first_goal_set = true;
    107. g_state = FORWARD;
    108. g_goal.x = cos(g_pose->theta) * 4 + g_pose->x;
    109. g_goal.y = sin(g_pose->theta) * 4 + g_pose->y;
    110. g_goal.theta = g_pose->theta;
    111. printGoal();
    112. }
    113. if (g_state == FORWARD)
    114. {
    115. forward(twist_pub);
    116. }
    117. else if (g_state == STOP_FORWARD)
    118. {
    119. stopForward(twist_pub);
    120. }
    121. else if (g_state == TURN)
    122. {
    123. turn(twist_pub);
    124. }
    125. else if (g_state == STOP_TURN)
    126. {
    127. stopTurn(twist_pub);
    128. }
    129. }
    130. int main(int argc, char** argv)
    131. {
    132. ros::init(argc, argv, "draw_square");
    133. ros::NodeHandle nh;
    134. ros::Subscriber pose_sub = nh.subscribe("turtle1/pose", 1, poseCallback);
    135. ros::Publisher twist_pub = nh.advertise("turtle1/cmd_vel", 1);
    136. ros::ServiceClient reset = nh.serviceClient("reset");
    137. ros::Timer timer = nh.createTimer(ros::Duration(0.016), boost::bind(timerCallback, _1, twist_pub));
    138. std_srvs::Empty empty;
    139. reset.call(empty);
    140. ros::spin();
    141. }

     


  • 相关阅读:
    python之对接有道翻译API接口实现批量翻译
    您的移动端app安全吗
    qt源码解析1--事件循环原理(重写事件函数,事件过滤器等)
    【Java网络原理】 四
    python 分类问题 画roc曲线实战
    解析Spring Cloud面试的十道难题,帮你攻克技术关卡
    MeterSphere专题之: 配套的浏览器插件:chrome-extensions
    虹科分享 | 麦氏比浊仪在药敏试验中的应用
    分享一个基于Python和Django的产品销售收入数据分析系统源码
    神经网络前向传播过程,神经网络反向传播
  • 原文地址:https://blog.csdn.net/ZhangRelay/article/details/126568674