add CMakeLists.txt src/exe/ros_server_udp.cpp
This commit is contained in:
parent
ae8986c3f7
commit
886beaca33
|
@ -38,6 +38,10 @@ add_executable(lcm_server ${ROBOT_SDK}/unitree_legged_sdk/examples/lcm_server.cp
|
|||
target_link_libraries(lcm_server ${EXTRA_LIBS} ${catkin_LIBRARIES})
|
||||
add_dependencies(lcm_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
||||
|
||||
add_executable(ros_server src/exe/ros_server_udp.cpp)
|
||||
target_link_libraries(ros_server ${EXTRA_LIBS} ${catkin_LIBRARIES})
|
||||
add_dependencies(ros_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
||||
|
||||
add_executable(position_lcm src/exe/position_mode.cpp)
|
||||
target_link_libraries(position_lcm ${EXTRA_LIBS} ${catkin_LIBRARIES})
|
||||
add_dependencies(position_lcm ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
/************************************************************************
|
||||
Copyright (c) 2020, Kei Okada. All rights reserved.
|
||||
Use of this source code is governed by the MPL-2.0 license, see LICENSE.
|
||||
************************************************************************/
|
||||
|
||||
#include <ros/ros.h>
|
||||
#include <pthread.h>
|
||||
#include <string>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <unitree_legged_msgs/HighCmd.h>
|
||||
#include <unitree_legged_msgs/HighState.h>
|
||||
#include <geometry_msgs/Twist.h>
|
||||
#include "convert.h"
|
||||
|
||||
using namespace UNITREE_LEGGED_SDK;
|
||||
// High command Lcm Server
|
||||
class Ros_Server_High
|
||||
{
|
||||
public:
|
||||
Ros_Server_High(): udp(8090, "192.168.123.161", 8082, sizeof(HighCmd), sizeof(HighState)){
|
||||
pub = n.advertise<unitree_legged_msgs::HighState>("high_state", 1);
|
||||
sub = n.subscribe<unitree_legged_msgs::HighCmd>("high_cmd", 1, [&](const unitree_legged_msgs::HighCmdConstPtr& msg){SendHighROS=*msg;});
|
||||
sub_vel = n.subscribe<geometry_msgs::Twist>("cmd_vel", 1, &Ros_Server_High::CmdVelCB, this);
|
||||
|
||||
udp.InitCmdData(cmd);
|
||||
}
|
||||
void CmdVelCB(const geometry_msgs::TwistConstPtr& msg){
|
||||
SendHighROS.mode = 2; // 2. target velocity walking (controlled by velocity + yawSpeed)
|
||||
SendHighROS.velocity[0] = msg->linear.x;
|
||||
SendHighROS.velocity[1] = msg->linear.y;
|
||||
SendHighROS.yawSpeed = msg->angular.z;
|
||||
}
|
||||
void UDPRecv(){
|
||||
udp.Recv();
|
||||
}
|
||||
void UDPSend(){
|
||||
udp.Send();
|
||||
}
|
||||
void RobotControl();
|
||||
|
||||
UDP udp;
|
||||
HighCmd cmd = {0};
|
||||
HighState state = {0};
|
||||
|
||||
ros::NodeHandle n;
|
||||
ros::Publisher pub;
|
||||
ros::Subscriber sub, sub_vel;
|
||||
unitree_legged_msgs::HighCmd SendHighROS;
|
||||
unitree_legged_msgs::HighState RecvHighROS;
|
||||
};
|
||||
|
||||
|
||||
void Ros_Server_High::RobotControl()
|
||||
{
|
||||
udp.GetRecv(state);
|
||||
RecvHighROS = ToRos(state);
|
||||
pub.publish(RecvHighROS);
|
||||
|
||||
// need to keep original cmd.head to move robots
|
||||
std::array<uint8_t, 2> head = cmd.head;
|
||||
cmd = ToLcm(SendHighROS, cmd);
|
||||
cmd.head = head;
|
||||
|
||||
//
|
||||
ROS_INFO_THROTTLE(1, "head %8d %8d", cmd.head[0], cmd.head[1]);
|
||||
ROS_INFO_THROTTLE(1, "levelFlag %8d", cmd.levelFlag);
|
||||
ROS_INFO_THROTTLE(1, "frameReserve %8d", cmd.frameReserve);
|
||||
ROS_INFO_THROTTLE(1, "SN %8d %8d", cmd.SN[0], cmd.SN[1]);
|
||||
ROS_INFO_THROTTLE(1, "version %8d %8d", cmd.version[0], cmd.version[1]);
|
||||
ROS_INFO_THROTTLE(1, "bandWidth %8d", cmd.bandWidth);
|
||||
ROS_INFO_THROTTLE(1, "mode %8d", cmd.mode);
|
||||
ROS_INFO_THROTTLE(1, "gaitType %d", cmd.gaitType);
|
||||
ROS_INFO_THROTTLE(1, "speedLevel %d", cmd.speedLevel);
|
||||
ROS_INFO_THROTTLE(1, "footRaiseHeight %f", cmd.footRaiseHeight);
|
||||
ROS_INFO_THROTTLE(1, "bodyHeight %f", cmd.bodyHeight);
|
||||
ROS_INFO_THROTTLE(1, "position %f %f", cmd.postion[0], cmd.postion[1]);
|
||||
ROS_INFO_THROTTLE(1, "euler %f %f %f", cmd.euler[0], cmd.euler[1], cmd.euler[2]);
|
||||
ROS_INFO_THROTTLE(1, "velocity %f %f", cmd.velocity[0], cmd.velocity[1]);
|
||||
ROS_INFO_THROTTLE(1, "yawSpeed %f", cmd.yawSpeed);
|
||||
ROS_INFO_THROTTLE(1, "bms %d", cmd.bms.off);
|
||||
ROS_INFO_THROTTLE(1, "led (%d %d %d)", cmd.led[0].r, cmd.led[0].g, cmd.led[0].b);
|
||||
ROS_INFO_THROTTLE(1, " (%d %d %d)", cmd.led[1].r, cmd.led[1].g, cmd.led[1].b);
|
||||
ROS_INFO_THROTTLE(1, " (%d %d %d)", cmd.led[2].r, cmd.led[2].g, cmd.led[2].b);
|
||||
ROS_INFO_THROTTLE(1, " (%d %d %d)", cmd.led[3].r, cmd.led[3].g, cmd.led[3].b);
|
||||
//ROS_INFO_THROTTLE(1, "wirelessRemote ");for(int i = 0; i < 40; i++) ROS_INFO_THROTTLE(1, " %d", cmd.wirelessRemote[i]); ROS_INFO_THROTTLE(1, "");
|
||||
ROS_INFO_THROTTLE(1, "reserve %d", cmd.reserve);
|
||||
ROS_INFO_THROTTLE(1, "crc %d", cmd.crc);
|
||||
|
||||
//
|
||||
udp.SetSend(cmd);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
ros::init(argc, argv, "ros_server");
|
||||
|
||||
Ros_Server_High server;
|
||||
LoopFunc loop_control("control_loop", 0.002, boost::bind(&Ros_Server_High::RobotControl, &server));
|
||||
LoopFunc loop_udpSend("UDP_Send", 0.002, 3, boost::bind(&Ros_Server_High::UDPSend, &server));
|
||||
LoopFunc loop_udpRecv("UDP_Recv", 0.002, 3, boost::bind(&Ros_Server_High::UDPRecv, &server));
|
||||
|
||||
loop_udpSend.start();
|
||||
loop_udpRecv.start();
|
||||
loop_control.start();
|
||||
|
||||
ros::spin();
|
||||
}
|
Loading…
Reference in New Issue